view-placeholders-basics.xml 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.view.placeholders.basics">
  5. <title>Utilisation de base des Placeholders</title>
  6. <para>
  7. Zend Framework définit une aide de vue générique <methodname>placeholder()</methodname> que
  8. vous pouvez utiliser pour créer vos placeholders ("conteneurs") personnalisés. Il propose
  9. aussi une variété de placeholders pour des fonctionnalités très demandées comme préciser un
  10. <emphasis>DocType</emphasis>, le titre d'une page, etc.
  11. </para>
  12. <para>
  13. Tous les placeholders agissent de la même manière. Ce sont des conteneurs, et donc vous
  14. pouvez les manipuler comme des collections. Vous pouvez ainsi&#160;:
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>
  19. <emphasis>Ajouter (append)</emphasis> ou <emphasis>préfixer(prepend)</emphasis> des
  20. entités dans la collection.
  21. </para>
  22. </listitem>
  23. <listitem>
  24. <para>
  25. <emphasis>Remplacer (replace)</emphasis> toute la collection avec une seule valeur.
  26. </para>
  27. </listitem>
  28. <listitem>
  29. <para>
  30. Spécifier une chaîne utilisée pour <emphasis>préfixer le contenu</emphasis> de la
  31. collection lors de son rendu.
  32. </para>
  33. </listitem>
  34. <listitem>
  35. <para>
  36. Spécifier une chaîne utilisée pour <emphasis>ajouter le contenu</emphasis> de la
  37. collection lors de son rendu.
  38. </para>
  39. </listitem>
  40. <listitem>
  41. <para>
  42. Spécifier une chaîne utilisée pour <emphasis>séparer du contenu</emphasis> de la
  43. collection lors de son rendu.
  44. </para>
  45. </listitem>
  46. <listitem>
  47. <para>
  48. <emphasis>Capturer du contenu</emphasis> dans la collection.
  49. </para>
  50. </listitem>
  51. <listitem>
  52. <para>
  53. <emphasis>Rendre</emphasis> le contenu agrégé.
  54. </para>
  55. </listitem>
  56. </itemizedlist>
  57. <para>
  58. Typiquement, vous appelerez cette aide de vue sans argument, ce qui retournera le conteneur
  59. sur lequel opérer. Après vous afficherez (echo) ce contenu ou appelerez une méthode dessus
  60. pour le remplir ou le configurer. Si le conteneur est vide, son rendu sera une simple chaîne
  61. vide, sinon, le contenu sera aggrégé en fonction des règles que vous avez fixées.
  62. </para>
  63. <para>
  64. Par exemple, créons une barre de menu qui contient des "blocs" de contenu. Supposons que la
  65. structure de chaque bloc ressemble à ceci&#160;:
  66. </para>
  67. <programlisting language="html"><![CDATA[
  68. <div class="sidebar">
  69. <div class="block">
  70. <p>
  71. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus
  72. consectetur aliquet odio ac consectetur. Nulla quis eleifend
  73. tortor. Pellentesque varius, odio quis bibendum consequat, diam
  74. lectus porttitor quam, et aliquet mauris orci eu augue.
  75. </p>
  76. </div>
  77. <div class="block">
  78. <ul>
  79. <li><a href="/some/target">Link</a></li>
  80. <li><a href="/some/target">Link</a></li>
  81. </ul>
  82. </div>
  83. </div>
  84. ]]></programlisting>
  85. <para>
  86. Le contenu variera en fonction du contrôleur et de l'action, mais la structure est
  87. identique, elle. Configurons en premier lieu la barre de menu dans une méthode du
  88. bootstrap&#160;:
  89. </para>
  90. <programlisting language="php"><![CDATA[
  91. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  92. {
  93. // ...
  94. protected function _initSidebar()
  95. {
  96. $this->bootstrap('View');
  97. $view = $this->getResource('View');
  98. $view->placeholder('sidebar')
  99. // "prefix" -> contenu à afficher une fois avant les données
  100. // dans la collection
  101. ->setPrefix("<div class=\"sidebar\">\n <div class=\"block\">\n")
  102. // "separator" -> contenu à afficher entre chaque entité de
  103. // la collection
  104. ->setSeparator("</div>\n <div class=\"block\">\n")
  105. // "postfix" -> contenu à afficher une fois après les données
  106. // dans la collection
  107. ->setPostfix("</div>\n</div>");
  108. }
  109. // ...
  110. }
  111. ]]></programlisting>
  112. <para>
  113. Le code ci-dessus définit un placeholder, "sidebar", qui n'a pas d'entité. Ce code
  114. configure la structure de base du placeholder, selon nos désirs.
  115. </para>
  116. <para>
  117. Maintenant supposons que pour toutes les actions du contrôleur "user" nous voulons un
  118. bloc en haut qui contienne des informations. Nous pouvons faire cela de deux manières&#160;:
  119. (a) nous pourrions ajouter le contenu au placeholder directement dans la méthode
  120. <methodname>preDispatch()</methodname> du contrôleur, ou (b) nous pourrions rendre un
  121. script de vue depuis la méthode <methodname>preDispatch()</methodname>. Nous utiliserons le
  122. cas (b), car il propose une séparation propre des logiques en laissant la vue classique
  123. contenir ses données utiles.
  124. </para>
  125. <para>
  126. Nous appelerons le script de vue "<filename>user/_sidebar.phtml</filename>", et nous le
  127. remplirons comme ceci&#160;:
  128. </para>
  129. <programlisting language="php"><![CDATA[
  130. <?php $this->placeholder('sidebar')->captureStart() ?>
  131. <h4>User Administration</h4>
  132. <ul>
  133. <li><a href="<?php $this->url(array('action' => 'list')) ?>">
  134. List</a></li>
  135. <li><a href="<?php $this->url(array('action' => 'create')) ?>">
  136. Create</a></a></li>
  137. </ul>
  138. <?php $this->placeholder('sidebar')->captureEnd() ?>
  139. ]]></programlisting>
  140. <para>
  141. L'exemple ci-dessus utilise les possibilités de capture dynamique de contenu des
  142. placeholders. Par défaut, le contenu est ajouté à la suite ce qui permet d'en agréger. Cet
  143. exemple utilise des aides de vues et du contenu <acronym>HTML</acronym> statique pour
  144. générer un menu qui est capturé et ajouté au placeholder.
  145. </para>
  146. <para>
  147. Pour utiliser le script de vue, nous écrirons ceci dans la méthode
  148. <methodname>preDispatch()</methodname>&#160;:
  149. </para>
  150. <programlisting language="php"><![CDATA[
  151. class UserController extends Zend_Controller_Action
  152. {
  153. // ...
  154. public function preDispatch()
  155. {
  156. // ...
  157. $this->view->render('user/_sidebar.phtml');
  158. // ...
  159. }
  160. // ...
  161. }
  162. ]]></programlisting>
  163. <para>
  164. Notez que nous ne capturons pas le rendu, il n'y a pas besoin car le contenu complet de ce
  165. script de vue est déja capturé dans un placeholder.
  166. </para>
  167. <para>
  168. Maintenant imaginons que l'action "view" dans ce même contrôleur ait besoin de présenter des
  169. informations. Dans "<filename>user/view.phtml</filename>" il pourrait y avoir ceci&#160;:
  170. </para>
  171. <programlisting language="php"><![CDATA[
  172. $this->placeholder('sidebar')
  173. ->append('<p>User: ' . $this->escape($this->username) . '</p>');
  174. ]]></programlisting>
  175. <para>
  176. Cet exemple utilise la méthode <methodname>append()</methodname> et lui passe du contenu à
  177. agréger.
  178. </para>
  179. <para>
  180. Enfin, modifions le script de layout pour rendre le placeholder&#160;:
  181. </para>
  182. <programlisting language="php"><![CDATA[
  183. <html>
  184. <head>
  185. <title>My Site</title>
  186. </head>
  187. <body>
  188. <div class="content">
  189. <?php echo $this->layout()->content ?>
  190. </div>
  191. <?php echo $this->placeholder('sidebar') ?>
  192. </body>
  193. </html>
  194. ]]></programlisting>
  195. <para>
  196. Pour les contrôleurs et les actions que ne remplissent pas le placeholder "sidebar", aucun
  197. contenu ne sera rendu&#160;; cependant afficher le placeholder rendra le contenu "fixe"
  198. suivant les règles définies dans le bootstrap ainsi que le contenu agrégé dans
  199. l'application. Dans le cas de l'action "<filename>/user/view</filename>", en supposant que
  200. le nom de l'utilisateur est "matthew", nous pouvons récupérer le contenu de la barre de menu
  201. comme ceci (formaté pour la lisibilité de l'exemple)&#160;:
  202. </para>
  203. <programlisting language="html"><![CDATA[
  204. <div class="sidebar">
  205. <div class="block">
  206. <h4>User Administration</h4>
  207. <ul>
  208. <li><a href="/user/list">List</a></li>
  209. <li><a href="/user/create">Create</a></a></li>
  210. </ul>
  211. </div>
  212. <div class="block">
  213. <p>User: matthew</p>
  214. </div>
  215. </div>
  216. ]]></programlisting>
  217. <para>
  218. Les possibilités sont immenses en ce qui concerne les placeholders et les layouts, essayez
  219. les et lisez les <link linkend="zend.view.helpers.initial.placeholder">sections relatives
  220. du manuel</link> pour plus d'informations.
  221. </para>
  222. </sect1>