Zend_Layout-Advanced.xml 11 KB

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