view-placeholders-basics.xml 8.6 KB

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