Главная / Zend Manual Core
Введение

Zend_Layout - Быстрый старт

В этом разделе представлены два основных способа использования Zend_Layout: с MVC и без.

Скрипты макетов

В обоих случаях вам нужно создать скрипт макета. Скрипты макета используют Zend_View (или другую реализацию интерфейса Zend_View_Interface, используемую вами). Переменные макета регистрируются с помощью метки заполнения Zend_Layout-а, и доступ к ним может быть произведен через помощника меток заполнения, либо путем извлечения их как свойств объекта макета посредством помощника макета.

Пример:

  1. <!DOCTYPE html
  2.     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html>
  5. <head>
  6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7.     <title>My Site</title>
  8. </head>
  9. <body>
  10. <?php
  11.     // извлечение содержимого ключа 'content'
  12.     // с использованием помощника макета:
  13.     echo $this->layout()->content;
  14.  
  15.     // извлечение содержимого ключа 'foo'
  16.     // с использованием помощника меток заполнения:
  17.     echo $this->placeholder('Zend_Layout')->foo;
  18.  
  19.     // извлечение объекта макета и получение различных переменных из него
  20.     $layout = $this->layout();
  21.     echo $layout->bar;
  22.     echo $layout->baz;
  23. ?>
  24. </body>
  25. </html>

Поскольку Zend_Layout использует Zend_View для рендеринга, то вы можете использовать любые зарегистрированные помощники видов, а также обращаться к любым установленным ранее переменным вида. Особенно полезны различные помощники меток заполнения, так как они позволяют извлекать содержимое таких областей, как раздел <head>, навигация и т.п.:

  1. <!DOCTYPE html
  2.     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html>
  5. <head>
  6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7.     <?= $this->headTitle() ?>
  8.     <?= $this->headScript() ?>
  9.     <?= $this->headStyle() ?>
  10. </head>
  11. <body>
  12.     <?= $this->render('header.phtml') ?>
  13.  
  14.     <div id="nav"><?= $this->placeholder('nav') ?></div>
  15.  
  16.     <div id="content"><?= $this->layout()->content ?></div>
  17.  
  18.     <?= $this->render('footer.phtml') ?>
  19. </body>
  20. </html>

Использование Zend_Layout с MVC Zend Framework-а

Zend_Controller предлагает богатый набор возможностей для расширения посредством плагинов фронт-контроллера и помощников действий. Zend_View тоже имеет своих помощников. Zend_Layout использует возможности такого расширения при использовании с компонентами MVC.

Zend_Layout::startMvc() создает экземпляр Zend_Layout с любой предоставленной вами конфигурацией (опционально). Затем он регистрирует плагин фронт-контроллера, который производит рендеринг макета с любым содержимым приложения сразу, как только завершается цикл диспетчеризации, регистрирует помощник действия для доступа к объекту макета из ваших контроллеров действий. Кроме этого, вы можете в любой момент времени извлечь экземпляр макета внутри скрипта вида, используя помощник вида layout.

Для начала посмотрим, как производится инициализация Zend_Layout для использования в MVC:

  1. <?php
  2. // В вашем файле загрузки:
  3. Zend_Layout::startMvc();
  4. ?>

startMvc() может принимать массив опций или объект Zend_Config для настойки экземпляра. Эти опции описаны в Опции конфигурирования Zend_Layout.

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

  1. <?php
  2. class FooController extends Zend_Controller_Action
  3. {
  4.     public function barAction()
  5.     {
  6.         // отключение макета для данного действия
  7.         $this->_helper->layout->disableLayout();
  8.     }
  9.  
  10.     public function bazAction()
  11.     {
  12.         // использование другого скрипта макета с этим действием
  13.         $this->_helper->layout->setLayout('foobaz');
  14.     };
  15. }
  16. ?>

В своих скриптах вида вы можете обращаться к объекту вида через помощник вида layout. Этот помощник вида немного отличается от остальных тем, что не принимает аргументов и возвращает объект вместо строкового значения. Это позволяет сразу вызывать методы объекта макета:

  1. <?php $this->layout()->setLayout('foo'); // установка другого макета ?>

Вы можете в любой момент времени извлечь зарегистрированный с MVC экземпляр Zend_Layout, используя статический метод getMvcInstance():

  1. <?php
  2. // Возвращает null, если до этого не был вызван startMvc()
  3. $layout = Zend_Layout::getMvcInstance();
  4. ?>

Наконец, плагин фронт-контроллера для Zend_Layout-а имеет одну ценную возможность в дополнение к рендерингу самого макета: он извлекает все именованные сегменты из объекта ответа и устанавливает их как переменные макета, при этом сегмент 'default' присваивается переменной 'content'. Это позволяет иметь доступ к содержимому приложения и производить его рендеринг в вашем скрипте вида.

Для примера предположим, что в вашем приложении вызывается FooController::indexAction(), который производит рендеринг некоторого содержимого в используемый по умолчанию сегмент ответа и затем производит переход к действию NavController::menuAction(), который рендерит содержимое в сегмент 'nav' объекта ответа. Наконец, вы производите переход к действию CommentController::fetchAction() и извлекаете комментарии, но их рендеринг производится в используемый по умолчанию сегмент (комментарии добавляются в конец уже имеющегося содержимого). Ваш скрипт вида может затем произвести их рендеринг по отдельности:

  1. <body>
  2.     <!-- рендеринг /nav/menu -->
  3.     <div id="nav"><?= $this->layout()->nav ?></div>
  4.  
  5.     <!-- рендеринг /foo/index + /comment/fetch -->
  6.     <div id="content"><?= $this->layout()->content ?></div>
  7. </body>

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

Использование Zend_Layout как отдельной компоненты

Как отдельная компонента Zend_Layout не предоставляет столько возможностей или такого удобства, как в случае использовании с MVC. Тем не менее, и в таком использовании сохраняются два основных преимущества:

  • Область видимости переменных макета.

  • Отделение скрипта макета от других скриптов видов.

При использовании Zend_Layout в качестве отдельной компоненты просто инстанцируйте объект макета, используйте различные аксессоры для установки состояния, устанавливайте переменные как свойства объекта и производите рендеринг макета:

  1. <?php
  2. $layout = new Zend_Layout();
  3.  
  4. // Установка пути к скриптам макета:
  5. $layout->setLayoutPath('/path/to/layouts');
  6.  
  7. // установка переменных:
  8. $layout->content = $content;
  9. $layout->nav     = $nav;
  10.  
  11. // выбор другого скрипта вида:
  12. $layout->setLayout('foo');
  13.  
  14. // рендеринг конечного макета
  15. echo $layout->render();
  16. ?>

Пример макета

Иногда одна картинка стоит тысячи слов. Ниже показан пример скрипта макета, показывающий, как все это может быть объединено.

zend.layout.quickstart.example.png

Действительный порядок элементов может быть иным в зависимости от установленного CSS. Например, если вы используете абсолютное позиционирование, то можете разместить навигацию в конце документа, но она будет отображаться вверху, то же самое можно сказать о боковой панели, заголовке. Реальный порядок извлечения содержимого остается тем же.


Введение