Zend_Layout-Advanced.xml 9.5 KB

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