Zend_Layout-QuickStart.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <sect1 id="zend.layout.quickstart">
  2. <title>Zend_Layout - Быстрый старт</title>
  3. <para>
  4. В этом разделе представлены два основных способа использования
  5. <code>Zend_Layout</code>: с MVC и без.
  6. </para>
  7. <sect2 id="zend.layout.quickstart.layouts">
  8. <title>Скрипты макетов</title>
  9. <para>
  10. В обоих случаях вам нужно создать скрипт макета.
  11. Скрипты макета используют Zend_View (или другую
  12. реализацию интерфейса Zend_View_Interface, используемую вами).
  13. Переменные макета регистрируются с помощью
  14. <link linkend="zend.view.helpers.initial.placeholder">метки
  15. заполнения</link> <code>Zend_Layout</code>-а,
  16. и доступ к ним может быть произведен через
  17. <link linkend="zend.view.helpers.initial.placeholder">помощника
  18. меток заполнения</link>, либо путем извлечения их как свойств
  19. объекта макета посредством помощника макета.
  20. </para>
  21. <para>
  22. Пример:
  23. </para>
  24. <programlisting language="php"><![CDATA[
  25. <!DOCTYPE html
  26. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  27. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  28. <html>
  29. <head>
  30. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  31. <title>My Site</title>
  32. </head>
  33. <body>
  34. <?php
  35. // извлечение содержимого ключа 'content'
  36. // с использованием помощника макета:
  37. echo $this->layout()->content;
  38. // извлечение содержимого ключа 'foo'
  39. // с использованием помощника меток заполнения:
  40. echo $this->placeholder('Zend_Layout')->foo;
  41. // извлечение объекта макета и получение различных переменных из него
  42. $layout = $this->layout();
  43. echo $layout->bar;
  44. echo $layout->baz;
  45. ?>
  46. </body>
  47. </html>
  48. ]]></programlisting>
  49. <para>
  50. Поскольку <code>Zend_Layout</code> использует <code>Zend_View</code>
  51. для рендеринга, то вы можете использовать любые зарегистрированные
  52. помощники видов, а также обращаться к любым установленным ранее
  53. переменным вида.
  54. Особенно полезны различные <link
  55. linkend="zend.view.helpers.initial.placeholder">помощники меток
  56. заполнения</link>, так как они позволяют извлекать содержимое
  57. таких областей, как раздел &lt;head&gt;, навигация и т.п.:
  58. </para>
  59. <programlisting language="php"><![CDATA[
  60. <!DOCTYPE html
  61. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  62. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  63. <html>
  64. <head>
  65. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  66. <?= $this->headTitle() ?>
  67. <?= $this->headScript() ?>
  68. <?= $this->headStyle() ?>
  69. </head>
  70. <body>
  71. <?= $this->render('header.phtml') ?>
  72. <div id="nav"><?= $this->placeholder('nav') ?></div>
  73. <div id="content"><?= $this->layout()->content ?></div>
  74. <?= $this->render('footer.phtml') ?>
  75. </body>
  76. </html>
  77. ]]></programlisting>
  78. </sect2>
  79. <sect2 id="zend.layout.quickstart.mvc">
  80. <title>Использование Zend_Layout с MVC Zend Framework-а</title>
  81. <para>
  82. <code>Zend_Controller</code> предлагает богатый набор
  83. возможностей для расширения посредством
  84. <link linkend="zend.controller.plugins">плагинов
  85. фронт-контроллера</link> и <link
  86. linkend="zend.controller.actionhelpers">помощников действий</link>.
  87. <code>Zend_View</code> тоже имеет своих
  88. <link linkend="zend.view.helpers">помощников</link>.
  89. <code>Zend_Layout</code> использует возможности такого расширения
  90. при использовании с компонентами MVC.
  91. </para>
  92. <para>
  93. <code>Zend_Layout::startMvc()</code> создает экземпляр
  94. <code>Zend_Layout</code> с любой предоставленной вами конфигурацией
  95. (опционально). Затем он регистрирует плагин фронт-контроллера,
  96. который производит рендеринг макета с любым содержимым приложения
  97. сразу, как только завершается цикл диспетчеризации, регистрирует
  98. помощник действия для доступа к объекту макета из ваших контроллеров
  99. действий. Кроме этого, вы можете в любой момент времени извлечь
  100. экземпляр макета внутри скрипта вида, используя помощник вида
  101. <code>layout</code>.
  102. </para>
  103. <para>
  104. Для начала посмотрим, как производится инициализация Zend_Layout для
  105. использования в MVC:
  106. </para>
  107. <programlisting language="php"><![CDATA[<?php
  108. // В вашем файле загрузки:
  109. Zend_Layout::startMvc();
  110. ?>]]></programlisting>
  111. <para>
  112. <code>startMvc()</code> может принимать массив опций или объект
  113. <code>Zend_Config</code> для настойки экземпляра. Эти опции описаны
  114. в <xref linkend="zend.layout.options" />.
  115. </para>
  116. <para>
  117. В контроллере действий вы можете обращаться к экземпляру макета как
  118. к помощнику действий:
  119. </para>
  120. <programlisting language="php"><![CDATA[<?php
  121. class FooController extends Zend_Controller_Action
  122. {
  123. public function barAction()
  124. {
  125. // отключение макета для данного действия
  126. $this->_helper->layout->disableLayout();
  127. }
  128. public function bazAction()
  129. {
  130. // использование другого скрипта макета с этим действием
  131. $this->_helper->layout->setLayout('foobaz');
  132. };
  133. }
  134. ?>]]></programlisting>
  135. <para>
  136. В своих скриптах вида вы можете обращаться к объекту вида через
  137. помощник вида <code>layout</code>. Этот помощник вида немного
  138. отличается от остальных тем, что не принимает аргументов и
  139. возвращает объект вместо строкового значения. Это позволяет сразу
  140. вызывать методы объекта макета:
  141. </para>
  142. <programlisting language="php"><![CDATA[
  143. <?php $this->layout()->setLayout('foo'); // установка другого макета ?>
  144. ]]></programlisting>
  145. <para>
  146. Вы можете в любой момент времени извлечь зарегистрированный с MVC
  147. экземпляр <code>Zend_Layout</code>, используя статический метод
  148. <code>getMvcInstance()</code>:
  149. </para>
  150. <programlisting language="php"><![CDATA[<?php
  151. // Возвращает null, если до этого не был вызван startMvc()
  152. $layout = Zend_Layout::getMvcInstance();
  153. ?>]]></programlisting>
  154. <para>
  155. Наконец, плагин фронт-контроллера для <code>Zend_Layout</code>-а
  156. имеет одну ценную возможность в дополнение к рендерингу самого
  157. макета: он извлекает все именованные сегменты из объекта ответа и
  158. устанавливает их как переменные макета, при этом сегмент 'default'
  159. присваивается переменной 'content'. Это позволяет иметь доступ к
  160. содержимому приложения и производить его рендеринг в вашем скрипте
  161. вида.
  162. </para>
  163. <para>
  164. Для примера предположим, что в вашем приложении вызывается
  165. <code>FooController::indexAction()</code>, который производит
  166. рендеринг некоторого содержимого в используемый по умолчанию сегмент
  167. ответа и затем производит переход к действию
  168. <code>NavController::menuAction()</code>, который рендерит
  169. содержимое в сегмент 'nav' объекта ответа. Наконец, вы производите
  170. переход к действию <code>CommentController::fetchAction()</code> и
  171. извлекаете комментарии, но их рендеринг производится в
  172. используемый по умолчанию сегмент (комментарии добавляются в конец
  173. уже имеющегося содержимого). Ваш скрипт вида может затем произвести
  174. их рендеринг по отдельности:
  175. </para>
  176. <programlisting language="php"><![CDATA[
  177. <body>
  178. <!-- рендеринг /nav/menu -->
  179. <div id="nav"><?= $this->layout()->nav ?></div>
  180. <!-- рендеринг /foo/index + /comment/fetch -->
  181. <div id="content"><?= $this->layout()->content ?></div>
  182. </body>
  183. ]]></programlisting>
  184. <para>
  185. Эта возможность особенно полезна, если используется вместе с
  186. <link linkend="zend.controller.actionhelpers.actionstack">помощником
  187. действий</link> и
  188. <link
  189. linkend="zend.controller.plugins.standard.actionstack">плагином
  190. ActionStack</link>, с помощью которых вы можете создавать
  191. стек действий для обхода в цикле диспетчеризации и таким
  192. образом создавать страницы с различными "виджетами".
  193. </para>
  194. </sect2>
  195. <sect2 id="zend.layout.quickstart.standalone">
  196. <title>Использование Zend_Layout как отдельной компоненты</title>
  197. <para>
  198. Как отдельная компонента Zend_Layout не предоставляет столько
  199. возможностей или такого удобства, как в случае использовании с MVC.
  200. Тем не менее, и в таком использовании сохраняются два основных
  201. преимущества:
  202. </para>
  203. <itemizedlist>
  204. <listitem><para>
  205. Область видимости переменных макета.
  206. </para></listitem>
  207. <listitem><para>
  208. Отделение скрипта макета от других скриптов видов.
  209. </para></listitem>
  210. </itemizedlist>
  211. <para>
  212. При использовании Zend_Layout в качестве отдельной компоненты просто
  213. инстанцируйте объект макета, используйте различные аксессоры для
  214. установки состояния, устанавливайте переменные как свойства объекта
  215. и производите рендеринг макета:
  216. </para>
  217. <programlisting language="php"><![CDATA[<?php
  218. $layout = new Zend_Layout();
  219. // Установка пути к скриптам макета:
  220. $layout->setLayoutPath('/path/to/layouts');
  221. // установка переменных:
  222. $layout->content = $content;
  223. $layout->nav = $nav;
  224. // выбор другого скрипта вида:
  225. $layout->setLayout('foo');
  226. // рендеринг конечного макета
  227. echo $layout->render();
  228. ?>]]></programlisting>
  229. </sect2>
  230. <sect2 id="zend.layout.quickstart.example">
  231. <title>Пример макета</title>
  232. <para>
  233. Иногда одна картинка стоит тысячи слов. Ниже показан пример
  234. скрипта макета, показывающий, как все это может быть объединено.
  235. </para>
  236. <para>
  237. <inlinegraphic align="center" valign="middle"
  238. fileref="figures/zend.layout.quickstart.example.png" format="PNG" />
  239. </para>
  240. <para>
  241. Действительный порядок элементов может быть иным в зависимости от
  242. установленного CSS. Например, если вы используете абсолютное
  243. позиционирование, то можете разместить навигацию в конце документа,
  244. но она будет отображаться вверху, то же самое можно сказать о
  245. боковой панели, заголовке. Реальный порядок извлечения
  246. содержимого остается тем же.
  247. </para>
  248. </sect2>
  249. </sect1>
  250. <!--
  251. vim:se ts=4 sw=4 et:
  252. -->