Zend_Layout-Advanced.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.layout.advanced">
  5. <title>Zend_Layout, utilisation avancée</title>
  6. <para>
  7. <classname>Zend_Layout</classname> permet d'être utilisé de manière plus
  8. pointu.
  9. </para>
  10. <para>Vous pouvez agir sur ces éléments :</para>
  11. <itemizedlist>
  12. <listitem>
  13. <para>
  14. <emphasis>Objet de vue personnalisé.</emphasis>
  15. <classname>Zend_Layout</classname> accepte tout objet de vue implémentant
  16. l'interface <classname>Zend_View_Interface</classname>.
  17. </para>
  18. </listitem>
  19. <listitem>
  20. <para>
  21. <emphasis>Plugin contrôleur frontal personnalisé.</emphasis>
  22. <classname>Zend_Layout</classname> est livré avec un plugin qui rend le layout
  23. automatiquement avant de renvoyer la réponse (utilisation <acronym>MVC</acronym>). Vous pouvez injecter
  24. votre propre plugin.
  25. </para>
  26. </listitem>
  27. <listitem>
  28. <para>
  29. <emphasis>Aide d'action personnalisée.</emphasis>
  30. <classname>Zend_Layout</classname> est livrée avec une aide d'action qui devrait en
  31. théorie suffire dans la majorité des cas. C'est un proxy vers l'objet
  32. <classname>Zend_Layout</classname>. Vous pouvez cependant utiliser votre propre
  33. classe d'aide.
  34. </para>
  35. </listitem>
  36. <listitem>
  37. <para>
  38. <emphasis>Résolveur de chemin de script personnalisé</emphasis>.
  39. <classname>Zend_Layout</classname> vous permet d'utiliser votre <link
  40. linkend="zend.filter.inflector">inflecteur</link> pour la résolution des scripts de
  41. layout ou de modifier l'inflecteur par défaut.
  42. </para>
  43. </listitem>
  44. </itemizedlist>
  45. <sect2 id="zend.layout.advanced.view">
  46. <title>Objets de vue personnalisés</title>
  47. <para>
  48. <classname>Zend_Layout</classname> accepte des objets de vue implémentant
  49. <classname>Zend_View_Interface</classname> ou étendant
  50. <classname>Zend_View_Abstract</classname> pour le rendu du script de layout. Passez le
  51. en paramètre au constructeur ou à <methodname>startMvc()</methodname>, ou utilisez l'accesseur
  52. <methodname>setView()</methodname> :
  53. </para>
  54. <programlisting language="php"><![CDATA[
  55. $view = new My_Custom_View();
  56. $layout->setView($view);
  57. ]]></programlisting>
  58. <note>
  59. <title>Attention à vos implémentations de Zend_View</title>
  60. <para>
  61. Même si <classname>Zend_Layout</classname> vous permet d'utiliser votre propre
  62. objet de vue (implémentant <classname>Zend_View_Interface</classname>), vous pouvez
  63. rencontrer des problèmes si votre vue n'a pas accès à certaines aides de vue, en
  64. particulier les aides "layout" et <link
  65. linkend="zend.view.helpers.initial.placeholder">"placeholder"</link>.
  66. <classname>Zend_Layout</classname> effectue des affectations de variables sur la vue
  67. via ces aides.
  68. </para>
  69. <para>
  70. Si vous avez besoin d'un objet <classname>Zend_View</classname> personnalisé
  71. qui ne supporte pas ces aides de vue, vous devrez alors trouver un moyen de passer
  72. les variables du layout à la vue. Par exemple, en étendant l'objet
  73. <classname>Zend_Layout</classname> et en rédéfinissant la méthode
  74. <methodname>render()</methodname> en passant des variables à la vue. Aussi, vous pouvez créer
  75. votre propre plugin qui s'occupe de passer ces variables avant le rendu du
  76. layout.
  77. </para>
  78. <para>
  79. De même, si votre implémentation de la vue permet l'extension via des plugins,
  80. vous pouvez à tout moment accéder aux variables du layout grâce à l'aide <link
  81. linkend="zend.view.helpers.initial.placeholder">placeholder</link> en utilisant la
  82. clé "Zend_Layout" :
  83. </para>
  84. <programlisting language="php"><![CDATA[
  85. $placeholders = new Zend_View_Helper_Placeholder();
  86. $layoutVars = $placeholders->placeholder('Zend_Layout')
  87. ->getArrayCopy();
  88. ]]></programlisting>
  89. </note>
  90. </sect2>
  91. <sect2 id="zend.layout.advanced.plugin">
  92. <title>Plugin de contrôleur frontal personnalisé</title>
  93. <para>
  94. Lorsqu'utilisé avec les composants <acronym>MVC</acronym>, <classname>Zend_Layout</classname>
  95. enregistre un plugin de contrôleur frontal qui se charge du rendu du layout juste avant
  96. la fin de la boucle de distribution. Ceci convient à la majorité des cas, si cependant
  97. vous avez besoin de construire votre propre plugin, passez son nom dans l'option
  98. <code>pluginClass</code> de la méthode <methodname>startMvc()</methodname>.
  99. </para>
  100. <para>
  101. Votre plugin doit alors étendre
  102. <classname>Zend_Controller_Plugin_Abstract</classname>, et devrait accepter un objet
  103. <classname>Zend_Layout</classname> lors de sa construction.
  104. </para>
  105. <para>
  106. La classe par défaut du plugin est
  107. <classname>Zend_Layout_Controller_Plugin_Layout</classname>.
  108. </para>
  109. </sect2>
  110. <sect2 id="zend.layout.advanced.helper">
  111. <title>Aide d'action personnalisée</title>
  112. <para>
  113. Si les composants <acronym>MVC</acronym> sont utilisés, alors <classname>Zend_Layout</classname>
  114. enregistre une classe d'aide d'action dans le gestionnaire d'aides (helper broker). Par
  115. défaut, il s'agit de <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>.
  116. Cette aide agit comme un proxy vers l'instance de <classname>Zend_Layout</classname> et
  117. permet d'y accéder dans vos actions.
  118. </para>
  119. <para>
  120. Si vous voulez utiliser votre propre classe, celle-ci devra alors étendre
  121. <classname>Zend_Controller_Action_Helper_Abstract</classname>. Passez le nom de la
  122. classe dans l'option <code>helperClass</code> de la méthode
  123. <methodname>startMvc()</methodname>.
  124. </para>
  125. </sect2>
  126. <sect2 id="zend.layout.advanced.inflector">
  127. <title>Résolution de chemin de script personnalisé (inflecteur)</title>
  128. <para>
  129. <classname>Zend_Layout</classname> utilise
  130. <classname>Zend_Filter_Inflector</classname> pour établir une chaine de filtre
  131. permettant la résolution du nom du layout, vers le fichier y correspondant. Par défaut,
  132. les règles "Word_CamelCaseToDash" suivie de "StringToLower" sont utilisées. Le suffixe
  133. "phtml" est ensuite ajouté :
  134. </para>
  135. <itemizedlist>
  136. <listitem>
  137. <para>"foo" sera transformé en "foo.phtml".</para>
  138. </listitem>
  139. <listitem>
  140. <para>"FooBarBaz" sera transformé vers "foo-bar-baz.phtml".</para>
  141. </listitem>
  142. </itemizedlist>
  143. <para>
  144. Vous pouvez personnaliser l'inflecteur de 3 manières différentes : Modifier la
  145. cible et/ou le suffixe grâce à des accesseurs dans <classname>Zend_Layout</classname> ;
  146. Modifier les règles de l'inflecteur associé à <classname>Zend_Layout</classname> ; Ou
  147. encore créer votre propre inflecteur et le passer à
  148. <methodname>Zend_Layout::setInflector()</methodname>.
  149. </para>
  150. <example id="zend.layout.advanced.inflector.accessors">
  151. <title>Utilisation des accesseurs pour modifier l'inflecteur</title>
  152. <para>
  153. L'inflecteur par défaut de <classname>Zend_Layout</classname> utilise des
  154. marqueurs statiques pour la cible et le suffixe. 2 accesseurs vous sont donc
  155. proposés :
  156. </para>
  157. <programlisting language="php"><![CDATA[
  158. // Affecte une cible à l'inflecteur:
  159. $layout->setInflectorTarget('layouts/:script.:suffix');
  160. // Affecte le suffixe:
  161. $layout->setViewSuffix('php');
  162. ]]></programlisting>
  163. </example>
  164. <example id="zend.layout.advanced.inflector.directmodification">
  165. <title>Modification directe de l'inflecteur de Zend_Layout</title>
  166. <para>
  167. Les inflecteurs fonctionnent avec un cible et plusieurs règles. La cible par
  168. défaut utilisée pour <classname>Zend_Layout</classname> est ":script.:suffix" ;
  169. ":script" représente le nom du script de layout, et ":suffix" est une règle
  170. statique.
  171. </para>
  172. <para>
  173. Imaginons que vous vouliez que le suffixe du script de layout soit "html", et
  174. que vous vouliez séparer les mots en CasseMélangée ou en notationCamel avec des
  175. tirets-bats au lieu des tirets. De plus, vous voulez chercher vos scripts dans un
  176. sous-dossier "layouts" :
  177. </para>
  178. <programlisting language="php"><![CDATA[
  179. $layout->getInflector()->setTarget('layouts/:script.:suffix')
  180. ->setStaticRule('suffix', 'html')
  181. ->setFilterRule(array('Word_CamelCaseToUnderscore'));
  182. ]]></programlisting>
  183. </example>
  184. <example id="zend.layout.advanced.inflector.custom">
  185. <title>Inflecteur personnalisé</title>
  186. <para>
  187. Dans la plupart des cas, modifier l'inflecteur sera suffisant. Vous pouvez
  188. cependant créer votre propre inflecteur, pour l'utiliser à différents endroits par
  189. exemple, et le passer à <classname>Zend_Layout</classname>:
  190. </para>
  191. <programlisting language="php"><![CDATA[
  192. $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
  193. $inflector->addRules(array(
  194. ':script' => array('Word_CamelCaseToUnderscore'),
  195. 'suffix' => 'html'
  196. ));
  197. $layout->setInflector($inflector);
  198. ]]></programlisting>
  199. </example>
  200. <note>
  201. <title>L'inflecteur peut être désactivé</title>
  202. <para>
  203. L'inflecteur peut être désactivé si vous spécifiez, par exemple, un chemin
  204. absolu pour un script utilisé par <classname>Zend_Layout</classname>. Les méthodes
  205. <methodname>enableInflector()</methodname> et <methodname>disableInflector()</methodname> vous y
  206. aideront.
  207. </para>
  208. </note>
  209. </sect2>
  210. </sect1>