Zend_Layout-QuickStart.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <sect1 id="zend.layout.quickstart">
  2. <title>Zend_Layout Snelle Start</title>
  3. <para>
  4. Er zijn twee belangrijke gebruiksomgevingen voor <code>Zend_Layout</code>:
  5. mét en zonder Zend Framework MVC-componenten
  6. </para>
  7. <sect2 id="zend.layout.quickstart.layouts">
  8. <title>Layout scripts</title>
  9. <para>
  10. In beide gevallen heb je een layout script nodig.
  11. Layout scripts gebruiken Zend_View (of elke implementatie
  12. daarvan die je gebruikt). Layoutvariabelen worden geregistreerd
  13. met een <code>Zend_Layout</code> <link linkend="zend.view.helpers.initial.placeholder">placeholder</link>.
  14. Toegang tot deze variabelen krijg je via de Placeholder Helper
  15. of door ze op te vragen als eigenschappen van het layoutobject
  16. via de layout helper.
  17. </para>
  18. <para>
  19. Bijvoorbeeld:
  20. </para>
  21. <programlisting role="php"><![CDATA[
  22. <!DOCTYPE html
  23. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  24. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  25. <html>
  26. <head>
  27. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  28. <title>Mijn website</title>
  29. </head>
  30. <body>
  31. <?php
  32. // Vraag de 'content'-sleutel op met behulp van de layout helper:
  33. echo $this->layout()->content;
  34. // Vraag de 'foo'-sleutel op met behulp van de placeholder helper:
  35. echo $this->placeholder('Zend_Layout')->foo;
  36. // Vraag het layout object op en vraag daaruit verschillende sleutels op:
  37. $layout = $this->layout();
  38. echo $layout->bar;
  39. echo $layout->baz;
  40. ?>
  41. </body>
  42. </html>
  43. ]]></programlisting>
  44. <para>
  45. Doordat <code>Zend_Layout</code> <code>Zend_View</code> gebruikt om
  46. het layout script te renderen kun je alle geregistreerde View Helpers
  47. gebruiken en heb je ook toegang tot alle viewvariabelen die reeds
  48. zijn ingesteld. Vooral handig zijn de verschillende <link
  49. linkend="zend.view.helpers.initial.placeholder">placeholder
  50. helpers</link>, die je in staat stellen om velerlei gegevens voor
  51. bijvoorbeeld de &lt;head&gt;-sectie, navigatie, etc. op te vragen:
  52. </para>
  53. <programlisting role="php"><![CDATA[
  54. <!DOCTYPE html
  55. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  56. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  57. <html>
  58. <head>
  59. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  60. <!-- Gebruik verschillende placeholder helpers om specifieke informatie op te vragen:
  61. <title><?= $this->headTitle() ?></title>
  62. <?= $this->headScript() ?>
  63. <?= $this->headStyle() ?>
  64. </head>
  65. <body>
  66. <?= $this->render('header.phtml') ?>
  67. <div id="nav"><?= $this->placeholder('nav') ?></div>
  68. <div id="content"><?= $this->layout()->content ?></div>
  69. <?= $this->render('footer.phtml') ?>
  70. </body>
  71. </html>
  72. ]]></programlisting>
  73. </sect2>
  74. <sect2 id="zend.layout.quickstart.mvc">
  75. <title>Zend_Layout met Zend Framework MVC-componenten</title>
  76. <para>
  77. <code>Zend_Controller</code> biedt een uitgebreide set aan
  78. uitbreidingsfunctionaliteiten via de <link
  79. linkend="zend.controller.plugins">front controller plugins</link>
  80. en <link linkend="zend.controller.actionhelpers">actiiecontroller
  81. helpers</link>. <code>Zend_View</code> heeft ook <link
  82. linkend="zend.view.helpers">helpers</link>. <code>Zend_Layout</code>
  83. gebruikt deze verschillende uitbreidingsmogelijkheden als het wordt
  84. gebruikt in een MVC-context.
  85. </para>
  86. <para>
  87. <code>Zend_Layout::startMvc()</code> instantieert <code>Zend_Layout</code>
  88. met behulp van de optionele configuratie die wordt meegegeven.
  89. Vervolgens registreert het een front controller plugin die zorg
  90. draagt voor het renderen van de layout ná; de dispatch loop en
  91. een actiecontroller helper die de ontwikkelaar toegang geeft tot
  92. het layoutobject vanuit de actiecontrollers.
  93. De ontwikkelaar kan verder op ieder gewenst moment de layoutinstantie
  94. opvragen via de <code>layout</code> view helper.
  95. </para>
  96. <para>
  97. Laten we om te beginnen kijken naar het initialiseren van
  98. <code>Zend_Layout</code> in een MVC-context.
  99. </para>
  100. <programlisting role="php"><![CDATA[<?php
  101. // In de bootstrap:
  102. Zend_Layout::startMvc();
  103. ?>]]></programlisting>
  104. <para>
  105. Je kunt aan <code>startMvc()</code> een optionele array van
  106. configuratieopties of een instantie van <code>Zend_Config</code>
  107. meegeven om de instantie aan te passen aan jouw wensen.
  108. De verschillende beschikbare opties worden uitgelegd in
  109. <xref linkend="zend.layout.options" />.
  110. </para>
  111. <para>
  112. In een actiecontroller kun je toegang tot het layoutobject krijgen
  113. alsof het een action helper is.
  114. </para>
  115. <programlisting role="php"><![CDATA[<?php
  116. class FooController extends Zend_Controller_Action
  117. {
  118. public function barAction()
  119. {
  120. // Schakel de layout uit voor deze actie:
  121. $this->_helper->layout->disableLayout();
  122. }
  123. public function bazAction()
  124. {
  125. // Gebruik een ander layout script voor deze actie:
  126. $this->_helper->layout->setLayout('foobaz');
  127. };
  128. }
  129. ?>]]></programlisting>
  130. <para>
  131. In je view scripts kun je toegang verkrijgen tot het layoutobject
  132. via de <code>layout</code> view helper. Deze view helper verschilt
  133. van andere view helpers: hij neemt geen argumenten aan en geeft
  134. geen stringwaarde, maar een object terug. Dit stelt je in staat om
  135. het layoutobject verder direct te benaderen:
  136. </para>
  137. <programlisting role="php"><![CDATA[
  138. <?php $this->layout()->setLayout('foo'); // Stel een alternatieve layout in ?>
  139. ]]></programlisting>
  140. <para>
  141. Je kunt te allen tijde het layoutobject (binnen MVC-context)
  142. opvragen via de statische methode <code>getMvcInstance()</code>:
  143. </para>
  144. <programlisting role="php"><![CDATA[<?php
  145. // Geeft null terug als startMvc() nog niet aangeroepen is
  146. $layout = Zend_Layout::getMvcInstance();
  147. ?>]]></programlisting>
  148. <para>
  149. Tot slot heeft de front controller plugin van
  150. <code>Zend_Layout</code> één belangrijke toegevoegde
  151. functionaliteit ten opzichte van het renderen van de layout:
  152. <code>Zend_Layout</code> vraagt alle benoemde segmenten uit het
  153. response object op en wijst ze toe als layoutvariabelen. Het
  154. segment 'default' wordt toegewezen aan de variabele 'content'. Dit
  155. geeft je de mogelijkheid om de verschillende delen van de output
  156. van je applicatie in de layout te renderen.
  157. </para>
  158. <para>
  159. Een voorbeeldje: Stel dat je applicatiecode als eerst langs
  160. <code>FooController::indexAction()</code> komt, waarvan de
  161. uitkomst in het 'default' response segment wordt geplaatst en de
  162. code vervolgens doorstuurt naar
  163. <code>NavController::menuAction()</code>, waarvan de uitkomst in
  164. het 'nav' response segment wordt geplaatst en tot slot langs
  165. <code>CommentController::fetchAction()</code> wordt gestuurd,
  166. waarvan de uitkomst aan het eind van het 'default' response
  167. segment wordt toegevoegd. Je kunt dan beide segmenten apart
  168. door je layout script laten renderen:
  169. </para>
  170. <programlisting role="php"><![CDATA[
  171. <body>
  172. <!-- Rendert /nav/menu -->
  173. <div id="nav"><?= $this->layout()->nav ?></div>
  174. <!-- Rendert /foo/index + /comment/fetch -->
  175. <div id="content"><?= $this->layout()->content ?></div>
  176. </body>
  177. ]]></programlisting>
  178. <para>
  179. Deze functionaliteit is vooral handig als hij wordt gebruikt samen
  180. met de ActionStack
  181. <link linkend="zend.controller.actionhelpers.actionstack">action
  182. helper</link> en <link
  183. linkend="zend.controller.plugins.standard.actionstack">plugin</link>.
  184. Hiermee kun je een lijst van uit te voeren acties aanleggen,
  185. waardoor je allerlei widgets kunt laden binnen één layout.
  186. </para>
  187. </sect2>
  188. <sect2 id="zend.layout.quickstart.standalone">
  189. <title>Zend_Layout als standalone component</title>
  190. <para>
  191. Zonder de Zend Framework MVC-context is Zend_Layout niet half zo
  192. functioneel of handig als mét. Toch heeft het twee
  193. belangrijke voordelen:
  194. </para>
  195. <itemizedlist>
  196. <listitem><para>
  197. <code>Zend_Layout</code> biedt een aparte omgeving voor
  198. layoutvariabelen.
  199. </para></listitem>
  200. <listitem><para>
  201. <code>Zend_Layout</code> isoleert het layout script (dat
  202. meestal op nagenoeg elke pagina hetzelfde zal zijn) van de
  203. andere, normale view scripts.
  204. </para></listitem>
  205. </itemizedlist>
  206. <para>
  207. Als je <code>Zend_Layout</code> als standalone component gebruikt
  208. kun je simpelweg het layout object instantiëren en de
  209. verschillende accessoren gebruiken om het object te configureren,
  210. variabelen aan het object toe te wijzen en de layout te renderen:
  211. </para>
  212. <programlisting role="php"><![CDATA[<?php
  213. $layout = new Zend_Layout();
  214. // Stel het layout script pad in:
  215. $layout->setLayoutPath('/path/to/layouts');
  216. // Wijs een paar variabelen toe:
  217. $layout->content = $content;
  218. $layout->nav = $nav;
  219. // Wissel van layout script:
  220. $layout->setLayout('foo');
  221. // Render de uiteindelijke layout
  222. echo $layout->render();
  223. ?>]]></programlisting>
  224. </sect2>
  225. <sect2 id="zend.layout.quickstart.example">
  226. <title>Voorbeeld</title>
  227. <para>
  228. Soms zegt een plaatje meer dan duizend woorden. Vandaar de volgende
  229. afbeelding. Het laat zien hoe het allemaal bij elkaar kan komen.
  230. </para>
  231. <para>
  232. <inlinegraphic align="center" valign="middle"
  233. fileref="figures/zend.layout.quickstart.example.png" format="PNG" />
  234. </para>
  235. <para>
  236. De daadwerkelijke volgorde van de elementen kan variëren; dat
  237. hangt af van de CSS die je gebruikt. Als je bijvoorbeeld elementen
  238. absoluut positioneert kan het zijn dat je, hoewel de navigatie
  239. later in het document staat, het alsnog bovenaan laat weergeven.
  240. Dit kan natuurlijk ook gelden voor de header of zijbalk. De
  241. technische kant van het bij elkaar renderen van verschillende
  242. stukken inhoud blijft echter hetzelfde.
  243. </para>
  244. </sect2>
  245. </sect1>
  246. <!--
  247. vim:se ts=4 sw=4 et:
  248. -->