В этом разделе представлены два основных способа использования
Zend_Layout: с MVC и без.
Скрипты макетов
В обоих случаях вам нужно создать скрипт макета.
Скрипты макета используют Zend_View (или другую
реализацию интерфейса Zend_View_Interface, используемую вами).
Переменные макета регистрируются с помощью
метки
заполненияZend_Layout-а,
и доступ к ним может быть произведен через
помощника
меток заполнения, либо путем извлечения их как свойств
объекта макета посредством помощника макета.
Поскольку Zend_Layout использует Zend_View
для рендеринга, то вы можете использовать любые зарегистрированные
помощники видов, а также обращаться к любым установленным ранее
переменным вида.
Особенно полезны различные помощники меток
заполнения, так как они позволяют извлекать содержимое
таких областей, как раздел <head>, навигация и т.п.:
Zend_Controller предлагает богатый набор
возможностей для расширения посредством
плагинов
фронт-контроллера и помощников действий.
Zend_View тоже имеет своих
помощников.
Zend_Layout использует возможности такого расширения
при использовании с компонентами MVC.
Zend_Layout::startMvc() создает экземпляр
Zend_Layout с любой предоставленной вами конфигурацией
(опционально). Затем он регистрирует плагин фронт-контроллера,
который производит рендеринг макета с любым содержимым приложения
сразу, как только завершается цикл диспетчеризации, регистрирует
помощник действия для доступа к объекту макета из ваших контроллеров
действий. Кроме этого, вы можете в любой момент времени извлечь
экземпляр макета внутри скрипта вида, используя помощник вида
layout.
Для начала посмотрим, как производится инициализация Zend_Layout для
использования в MVC:
<?php
// В вашем файле загрузки:
Zend_Layout::startMvc();
?>
startMvc() может принимать массив опций или объект
Zend_Config для настойки экземпляра. Эти опции описаны
в Опции конфигурирования Zend_Layout.
В контроллере действий вы можете обращаться к экземпляру макета как
к помощнику действий:
<?php
class FooController extends Zend_Controller_Action
{
publicfunction barAction()
{
// отключение макета для данного действия
$this->_helper->layout->disableLayout();
}
publicfunction bazAction()
{
// использование другого скрипта макета с этим действием
$this->_helper->layout->setLayout('foobaz');
};
}
?>
В своих скриптах вида вы можете обращаться к объекту вида через
помощник вида layout. Этот помощник вида немного
отличается от остальных тем, что не принимает аргументов и
возвращает объект вместо строкового значения. Это позволяет сразу
вызывать методы объекта макета:
<?php$this->layout()->setLayout('foo'); // установка другого макета ?>
Вы можете в любой момент времени извлечь зарегистрированный с MVC
экземпляр Zend_Layout, используя статический метод
getMvcInstance():
<?php
// Возвращает null, если до этого не был вызван startMvc()
$layout = Zend_Layout::getMvcInstance();
?>
Наконец, плагин фронт-контроллера для Zend_Layout-а
имеет одну ценную возможность в дополнение к рендерингу самого
макета: он извлекает все именованные сегменты из объекта ответа и
устанавливает их как переменные макета, при этом сегмент 'default'
присваивается переменной 'content'. Это позволяет иметь доступ к
содержимому приложения и производить его рендеринг в вашем скрипте
вида.
Для примера предположим, что в вашем приложении вызывается
FooController::indexAction(), который производит
рендеринг некоторого содержимого в используемый по умолчанию сегмент
ответа и затем производит переход к действию
NavController::menuAction(), который рендерит
содержимое в сегмент 'nav' объекта ответа. Наконец, вы производите
переход к действию CommentController::fetchAction() и
извлекаете комментарии, но их рендеринг производится в
используемый по умолчанию сегмент (комментарии добавляются в конец
уже имеющегося содержимого). Ваш скрипт вида может затем произвести
их рендеринг по отдельности:
Эта возможность особенно полезна, если используется вместе с
помощником
действий и
плагином
ActionStack, с помощью которых вы можете создавать
стек действий для обхода в цикле диспетчеризации и таким
образом создавать страницы с различными "виджетами".
Использование Zend_Layout как отдельной компоненты
Как отдельная компонента Zend_Layout не предоставляет столько
возможностей или такого удобства, как в случае использовании с MVC.
Тем не менее, и в таком использовании сохраняются два основных
преимущества:
Область видимости переменных макета.
Отделение скрипта макета от других скриптов видов.
При использовании Zend_Layout в качестве отдельной компоненты просто
инстанцируйте объект макета, используйте различные аксессоры для
установки состояния, устанавливайте переменные как свойства объекта
и производите рендеринг макета:
Иногда одна картинка стоит тысячи слов. Ниже показан пример
скрипта макета, показывающий, как все это может быть объединено.
Действительный порядок элементов может быть иным в зависимости от
установленного CSS. Например, если вы используете абсолютное
позиционирование, то можете разместить навигацию в конце документа,
но она будет отображаться вверху, то же самое можно сказать о
боковой панели, заголовке. Реальный порядок извлечения
содержимого остается тем же.