Zend_Layout-Advanced.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.layout.advanced">
  5. <title>Uso Avançado de Zend_Layout</title>
  6. <para>
  7. <classname>Zend_Layout</classname> tem um número de casos de uso para o desenvolvedor
  8. que deseja adaptá-lo para diferentes implementações de view, layouts de sistema de
  9. arquivos, e mais.
  10. </para>
  11. <para>
  12. Os principais pontos de extensão são:
  13. </para>
  14. <itemizedlist>
  15. <listitem>
  16. <para>
  17. <emphasis>Custom view objects</emphasis>.
  18. <classname>Zend_Layout</classname> permite a você utilizar qualquer classe que
  19. implemente <classname>Zend_View_Interface</classname>.
  20. </para>
  21. </listitem>
  22. <listitem>
  23. <para>
  24. <emphasis>Custom front controller plugins</emphasis>.
  25. <classname>Zend_Layout</classname> vem embarcado com um front controller plugin
  26. padrão que automatiza a renderização de layouts antes de retornar a resposta.
  27. Você pode substituir por seu próprio plugin.
  28. </para>
  29. </listitem>
  30. <listitem>
  31. <para>
  32. <emphasis>Custom action helpers</emphasis>.
  33. <classname>Zend_Layout</classname> vem embarcado com um action helper padrão que
  34. deve servir para a maioria das necessidades já que é um proxy mudo para o próprio
  35. objeto de layout.
  36. </para>
  37. </listitem>
  38. <listitem>
  39. <para>
  40. <emphasis>Custom layout script path resolution</emphasis>.
  41. <classname>Zend_Layout</classname> permite a você usar seu próprio
  42. <link linkend="zend.filter.inflector">inflector</link> para resolução do
  43. caminho do script de layout, ou simplesmente modificar o inflector
  44. anexado para especificar suas próprias regras de inflexão.
  45. </para>
  46. </listitem>
  47. </itemizedlist>
  48. <sect2 id="zend.layout.advanced.view">
  49. <title>Objetos View Customizados</title>
  50. <para>
  51. <classname>Zend_Layout</classname> permite a você usar qualquer classe
  52. que implemente <classname>Zend_View_Interface</classname> ou estenda
  53. <classname>Zend_View_Abstract</classname> para renderizar seu script de layout.
  54. Simplesmente passe seu objeto view customizado como um parâmetro para
  55. o construtor/<methodname>startMvc()</methodname>, ou configure o
  56. usando o acessor <methodname>setView()</methodname>:
  57. </para>
  58. <programlisting language="php"><![CDATA[
  59. $view = new My_Custom_View();
  60. $layout->setView($view);
  61. ]]></programlisting>
  62. <note>
  63. <title>Nem todas as implementações de Zend_View são iguais</title>
  64. <para>
  65. Enquanto <classname>Zend_Layout</classname> permite que você use qualquer
  66. classe que implemente <classname>Zend_View_Interface</classname>, você pode
  67. entrar bem se elas não puderem utilizar os vários helpers
  68. <classname>Zend_View</classname>, particularmente os helpers layout e
  69. <link linkend="zend.view.helpers.initial.placeholder">placeholder</link>. Isso
  70. ocorre porque <classname>Zend_Layout</classname> torna o conjunto de variáveis
  71. no objeto disponível via ele mesmo e
  72. <link linkend="zend.view.helpers.initial.placeholder">placeholders</link>.
  73. </para>
  74. <para>
  75. Se você precisa usar uma implementação customizada de
  76. <classname>Zend_View</classname> que não suporta esses helpers, você precisará
  77. descobrir um modo de obter as variáveis de layout para o view. Isso pode
  78. ser feito ou pela extensão do objeto <classname>Zend_Layout</classname> com
  79. alteração do método <methodname>render()</methodname> para passar variáveis
  80. para o view, ou criando sua própria classe plugin
  81. que as passa antes de renderizar o layout.
  82. </para>
  83. <para>
  84. Alternativamente, se sua implementação de view suporta qualquer espécie de
  85. capacidade do plugin, você pode acessar as variáveis por meio do placeholder
  86. 'Zend_Layout' usando o <link linkend="zend.view.helpers.initial.placeholder">helper
  87. placeholder</link>:
  88. </para>
  89. <programlisting language="php"><![CDATA[
  90. $placeholders = new Zend_View_Helper_Placeholder();
  91. $layoutVars = $placeholders->placeholder('Zend_Layout')->getArrayCopy();
  92. ]]></programlisting>
  93. </note>
  94. </sect2>
  95. <sect2 id="zend.layout.advanced.plugin">
  96. <title>Plugins Front Controller Customizados</title>
  97. <para>
  98. Quando o usamos com os componentes <acronym>MVC</acronym>,
  99. <classname>Zend_Layout</classname> registra um plugin front controller que renderiza o
  100. layout como a última ação antes de abandonar o laço de despacho. Na maioria dos casos, o
  101. plugin padrão servirá, mas você se você desejar escrever o seu próprio, você pode
  102. especificar o nome da classe plugin a ser carregada carregar pela passagem da opção
  103. <property>pluginClass</property> ao método <methodname>startMvc()</methodname>.
  104. </para>
  105. <para>
  106. Qualquer classe plugin que você escrever para esse propósito precisará estender
  107. <classname>Zend_Controller_Plugin_Abstract</classname>, e deverá aceitar uma instância
  108. de objeto layout como um argumento para o construtor. Caso contrário, os detalhes de sua
  109. implementação ficarão acima de você.
  110. </para>
  111. <para>
  112. A classe plugin padrão usada é
  113. <classname>Zend_Layout_Controller_Plugin_Layout</classname>.
  114. </para>
  115. </sect2>
  116. <sect2 id="zend.layout.advanced.helper">
  117. <title>Action Helpers Customizados</title>
  118. <para>
  119. Quando o usamos com componentes <acronym>MVC</acronym>,
  120. <classname>Zend_Layout</classname> registra um helper action controller com o helper
  121. broker. O helper padrão,
  122. <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>, age como um proxy
  123. mudo para a própria instância do objeto de layout, e deve servir para a maioria dos
  124. casos de uso.
  125. </para>
  126. <para>
  127. Se você sentir necessidade de escrever funcionalidades customizadas, simplesmente
  128. escreva uma classe action helper estendendo
  129. <classname>Zend_Controller_Action_Helper_Abstract</classname> e passe o nome da classe
  130. como uma opção <property>helperClass</property> para o método
  131. <methodname>startMvc()</methodname>. Detalhes da implementação ficarão acima de você.
  132. </para>
  133. </sect2>
  134. <sect2 id="zend.layout.advanced.inflector">
  135. <title>Resolução de Caminho de Script de Layout Customizada: Usando o Inflector</title>
  136. <para>
  137. <classname>Zend_Layout</classname> usa <classname>Zend_Filter_Inflector</classname>
  138. para estabelecer uma cadeia de filtro para traduzir um nome de layout para caminho
  139. de script de layout. Por padrão, ela usa as regras 'Word_CamelCaseToDash' seguida
  140. por 'StringToLower', e o sufixo 'phtml' para transformar o nome em um caminho.
  141. Alguns exemplos:
  142. </para>
  143. <itemizedlist>
  144. <listitem>
  145. <para>'foo' será transformado em 'foo.phtml'.</para>
  146. </listitem>
  147. <listitem>
  148. <para>'FooBarBaz' será transformado em 'foo-bar-baz.phtml'.</para>
  149. </listitem>
  150. </itemizedlist>
  151. <para>
  152. Você tem três opções para modificar inflexão: modificar o alvo de inflexão
  153. e/ou sufixo da view via acessores de <classname>Zend_Layout</classname>, modificar
  154. as regras do inflector e alvo do inflector associado com a instância
  155. <classname>Zend_Layout</classname>, ou criar sua própria instância de inflector
  156. e passá-la para <methodname>Zend_Layout::setInflector()</methodname>.
  157. </para>
  158. <example id="zend.layout.advanced.inflector.accessors">
  159. <title>Usando acessores Zend_Layout para modificar o inflector</title>
  160. <para>
  161. O inflector <classname>Zend_Layout</classname> padrão usa referências estáticas
  162. para o alvo e sufixo de view script, e tem acessores para configurar esses valores.
  163. </para>
  164. <programlisting language="php"><![CDATA[
  165. // Configure o alvo do inflector:
  166. $layout->setInflectorTarget('layouts/:script.:suffix');
  167. // Configura o sufixo do view script de layout:
  168. $layout->setViewSuffix('php');
  169. ]]></programlisting>
  170. </example>
  171. <example id="zend.layout.advanced.inflector.directmodification">
  172. <title>Modificação direta do inflector Zend_Layout</title>
  173. <para>
  174. Inflectores tem um alvo e uma ou mais regras. O alvo padrão usado com
  175. <classname>Zend_Layout</classname> é ':script.:suffix'; ':script' passa o nome
  176. do layout registrado, enquanto ':suffix' é uma regra estática do inflector.
  177. </para>
  178. <para>
  179. Digamos que você queira que o script de layout termine no sufixo 'html',
  180. e que você queira separar palavras MixedCase e camelCased com underscores
  181. ao invés de hífens, e não deixe o nome em caixa baixa. Adicionalmente,
  182. você quer procurar em um subdiretório 'layouts' pelo script.
  183. </para>
  184. <programlisting language="php"><![CDATA[
  185. $layout->getInflector()->setTarget('layouts/:script.:suffix')
  186. ->setStaticRule('suffix', 'html')
  187. ->setFilterRule(array('Word_CamelCaseToUnderscore'));
  188. ]]></programlisting>
  189. </example>
  190. <example id="zend.layout.advanced.inflector.custom">
  191. <title>Inflectores Customizados</title>
  192. <para>
  193. Na maioria dos casos, modificar o inflector existente será suficiente.
  194. Entretanto, você pode ter um inflector que você deseja usar em diversos
  195. lugares, com diferentes objetos de diferentes tipos.
  196. <classname>Zend_Layout</classname> suporta isso.
  197. </para>
  198. <programlisting language="php"><![CDATA[
  199. $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
  200. $inflector->addRules(array(
  201. ':script' => array('Word_CamelCaseToUnderscore'),
  202. 'suffix' => 'html'
  203. ));
  204. $layout->setInflector($inflector);
  205. ]]></programlisting>
  206. </example>
  207. <note>
  208. <title>Inflexão pode ser desabilitada</title>
  209. <para>
  210. Inflexão pode ser desabilitada e habilitada usando acessores no objeto
  211. <classname>Zend_Layout</classname>. Isso pode ser útil se você quiser especificar
  212. um caminho absoluto para um view script de layout, ou saber que o mecanismo
  213. que você usará para especificar o script de layout não precisa de inflexão.
  214. Simplesmente use os métodos <methodname>enableInflector()</methodname> e
  215. <methodname>disableInflector()</methodname>.
  216. </para>
  217. </note>
  218. </sect2>
  219. </sect1>
  220. <!--
  221. vim:se ts=4 sw=4 et:
  222. -->