2016-12-16 2 views

ответ

1

Вы можете переключаться между раскладками для действий конкретного контроллера, используя следующий код:

// A controller's action method that uses an alternative 
// layout template. 
public function indexAction() 
{ 
    //... 

    // Use the Layout plugin to access the ViewModel 
    // object associated with layout template. 
    $this->layout()->setTemplate('layout/layout2'); 

    //... 
} 

В дополнение к плагину Layout контроллера, есть Layout вид помощник, который обеспечивает те же возможности. В случае с макетом , вы можете, например, выбрать расположение коммутатора со статической страницы , которая не имеет определенного действия контроллера.

Настройка макета для всех действий контроллера

Если все методы действия одного класса контроллера должны использовать один и тот же альтернативный макет, вы можете переопределить onDispatch() метод AbstractActionController класса и вызвать setTemplate() Способ есть, как показано в примере ниже:

// Add this alias in the beginning of the controller file 
use Zend\Mvc\MvcEvent; 

// ... 

class IndexController extends AbstractActionController 
{ 
    /** 
    * We override the parent class' onDispatch() method to 
    * set an alternative layout for all actions in this controller. 
    */ 
    public function onDispatch(MvcEvent $e) 
    { 
    // Call the base class' onDispatch() first and grab the response 
    $response = parent::onDispatch($e);   

    // Set alternative layout 
    $this->layout()->setTemplate('layout/layout2');     

    // Return the response 
    return $response; 
    } 
} 

Reference

1

Zend Framework - Issue

> Вы можете изменить макет на основе текущего модуля. Для этого требуется (а) определить, соответствует ли контроллер, соответствующий маршруту , этому модулю, а затем (б) изменить шаблон модели просмотра.

Место проведения этих действий находится в слушателе. Он должен прослушать либо на событие «маршрут» при низком (отрицательном) приоритете, либо на событие «отправка» в любом приоритете. Как правило, вы регистрируете этот во время события начальной загрузки.

namespace Content; 
 

 
class Module 
 
{ 
 
    /** 
 
    * @param \Zend\Mvc\MvcEvent $e The MvcEvent instance 
 
    * @return void 
 
    */ 
 
    public function onBootstrap($e) 
 
    { 
 
     // Register a dispatch event 
 
     $app = $e->getParam('application'); 
 
     $app->getEventManager()->attach('dispatch', array($this, 'setLayout')); 
 
    } 
 

 
    /** 
 
    * @param \Zend\Mvc\MvcEvent $e The MvcEvent instance 
 
    * @return void 
 
    */ 
 
    public function setLayout($e) 
 
    { 
 
     $matches = $e->getRouteMatch(); 
 
     $controller = $matches->getParam('controller'); 
 
     if (false === strpos($controller, __NAMESPACE__)) { 
 
      // not a controller from this module 
 
      return; 
 
     } 
 

 
     // Set the layout template 
 
     $viewModel = $e->getViewModel(); 
 
     $viewModel->setTemplate('content/layout'); 
 
    } 
 
}

Руководство говорит выше, но если вы хотите использовать эти символы, вам необходимо:

// module/Content/config/module.config.php 
 

 
return [ 
 

 
    /* whatever else */ 
 

 
    'view_manager' => [ 
 
     'template_map' => [ 
 
      'content/layout' => __DIR__ . '/../view/layout/layout.phtml'
 
 
     ] 
 
    ] 
 
];

Вскоре, когда все модули инициализированы (bootstrap) успешно, Zend автоматически вызовет onBootstrap(), которые связывают событие «dispatch» с методом setLayout(), где имя контроллера сопоставляется с пространством имен текущего модуля, а если успех, используйте setTemplate() для установки макета шаблон.

например.(! Успех)

Module/Namespace: Content,

Controller: Content\Controller\MatchMeController,

Controller: Other\Controller\DontMatchMeController,(обязательно!)

Но есть маленький недостаток: setLayout() использование

strpos(controller, __NAMESPACE__) === false

для определения текущего модуля, но что, если бы у меня был ContentController в каком-то другом модуле? Так что используйте

strpos(controller, __NAMESPACE__) !== 0

вместо этого.

----------

Zend Framework - Issue

Пособие довольно подробно, он также упоминает много других вещей, как набор различных макетов для различных контроллеров (или действия).

Смежные вопросы