A free and open-source book on ZF3 for beginners


6.4. Переключение между лэйаутами

По умолчанию, 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], который имеет те же возможности. С его помощью вы можете, например, переключить лэйаут со "статической" страницы, у которой нет необходимого действия контроллера.

6.4.1. Установка лэйаута для всех действий контроллера

Если вам нужно, чтобы все методы действия класса контроллера использовали один и тот же альтернативный лэйаут, вы можете переопределить метод 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;
    }
}

Top