По умолчанию, ZF3 предоставляет вам один единственный шаблон лэйаута - layout.phtml. В реальных приложениях вам, скорее всего, нужно будет иметь несколько лэйаутов и менять лэйаут для определенного контроллера/действия.
Например, у вас могут быть следующие части сайта: фронтэнд (front-end) и бэкэнд (back-end). Часть front-end будет состоять из веб-страниц, видимых для всех пользователей, и будет использовать стандартный лэйаут для всех подобных страниц. Часть back-end будет состоять из страниц, доступных только администратору и использовать другой лэйаут, содержащий административное меню.
Для начала подготовьте файл шаблона другого лэйаута. Назовите его, например, layout2.phtml. Чтобы упростить подготовку файла, скопируйте содержимое файла layout.phtml и внесите необходимые изменения.
Когда второй шаблон лэйаута будет готов, вы сможете переключаться между лэйаутами для определенного действия контроллера, используя следующий код:
// Метод действия контроллера, который использует
// альтернативный шаблон лэйаута.
public function indexAction()
{
//...
// Используем плагин Layout для доступа к объекту ViewModel,
// связанному с шаблоном лэйаута.
$this->layout()->setTemplate('layout/layout2');
//...
}
В примере метода действия выше мы используем плагин контроллера Layout
(строка 9),
который позволяет обращаться к экземпляру класса ViewModel
, связанного с шаблоном
лэйаута. Чтобы поменять шаблон лэйаута для этого метода действия, мы вызвали метод
setTemplate()
класса ViewModel
[Zend\View\Model\ViewModel].
В дополнение к плагину контроллера
Layout
[Zend\Mvc\Controller\Plugin\Layout], существует помощник видаLayout
[Zend\View\Helper\Layout], который имеет те же возможности. С его помощью вы можете, например, переключить лэйаут со "статической" страницы, у которой нет необходимого действия контроллера.
Если вам нужно, чтобы все методы действия класса контроллера использовали
один и тот же альтернативный лэйаут, вы можете переопределить метод onDispatch()
класса AbstractActionController
и вызвать в нем метод setTemplate()
, как показано в примере ниже:
// Добавьте этот псевдоним в начало файла контроллера
use Zend\Mvc\MvcEvent;
// ...
class IndexController extends AbstractActionController
{
/**
* Мы переопределяем метод родительского класса onDispatch(),
* чтобы установить альтернативный лэйаут для всех действий в этом контроллере.
*/
public function onDispatch(MvcEvent $e)
{
// Вызываем метод базового класса onDispatch() и получаем ответ
$response = parent::onDispatch($e);
// Устанавливаем альтернативный лэйаут
$this->layout()->setTemplate('layout/layout2');
// Возвращаем ответ
return $response;
}
}