Zend_Layout-Advanced.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20792 -->
  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
  86. meio do placeholder 'Zend_Layout' usando o
  87. <link linkend="zend.view.helpers.initial.placeholder">helper 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
  100. renderiza o layout como a última ação antes de abandonar o laço de despacho.
  101. Na maioria dos casos, o plugin padrão servirá, mas você se você desejar escrever
  102. o seu próprio, você pode especificar o nome da classe plugin a ser carregada
  103. carregar pela passagem da opção <code>pluginClass</code> ao método
  104. <methodname>startMvc()</methodname>.
  105. </para>
  106. <para>
  107. Qualquer classe plugin que você escrever para esse propósito precisará estender
  108. <classname>Zend_Controller_Plugin_Abstract</classname>, e deverá aceitar uma
  109. instância de objeto layout como um argumento para o construtor. Caso contrário,
  110. os detalhes de sua implementação ficarão acima de você.
  111. </para>
  112. <para>
  113. A classe plugin padrão usada é
  114. <classname>Zend_Layout_Controller_Plugin_Layout</classname>.
  115. </para>
  116. </sect2>
  117. <sect2 id="zend.layout.advanced.helper">
  118. <title>Action Helpers Customizados</title>
  119. <para>
  120. Quando o usamos com componentes <acronym>MVC</acronym>,
  121. <classname>Zend_Layout</classname> registra um helper action controller com o
  122. helper broker. O helper padrão,
  123. <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>,
  124. age como um proxy mudo para a própria instância do objeto de layout,
  125. e deve servir para a maioria dos casos de uso.
  126. </para>
  127. <para>
  128. Se você sentir necessidade de escrever funcionalidades customizadas,
  129. simplesmente escreva uma classe action helper estendendo
  130. <classname>Zend_Controller_Action_Helper_Abstract</classname> e passe o nome da
  131. classe como uma opção <code>helperClass</code> para o método
  132. <methodname>startMvc()</methodname>. Detalhes da implementação ficarão
  133. acima de você.
  134. </para>
  135. </sect2>
  136. <sect2 id="zend.layout.advanced.inflector">
  137. <title>Resolução de Caminho de Script de Layout Customizada: Usando o Inflector</title>
  138. <para>
  139. <classname>Zend_Layout</classname> usa <classname>Zend_Filter_Inflector</classname>
  140. para estabelecer uma cadeia de filtro para traduzir um nome de layout para caminho
  141. de script de layout. Por padrão, ela usa as regras 'Word_CamelCaseToDash' seguida
  142. por 'StringToLower', e o sufixo 'phtml' para transformar o nome em um caminho.
  143. Alguns exemplos:
  144. </para>
  145. <itemizedlist>
  146. <listitem>
  147. <para>'foo' será transformado em 'foo.phtml'.</para>
  148. </listitem>
  149. <listitem>
  150. <para>'FooBarBaz' será transformado em 'foo-bar-baz.phtml'.</para>
  151. </listitem>
  152. </itemizedlist>
  153. <para>
  154. Você tem três opções para modificar inflexão: modificar o alvo de inflexão
  155. e/ou sufixo da view via acessores de <classname>Zend_Layout</classname>, modificar
  156. as regras do inflector e alvo do inflector associado com a instância
  157. <classname>Zend_Layout</classname>, ou criar sua própria instância de inflector
  158. e passá-la para <methodname>Zend_Layout::setInflector()</methodname>.
  159. </para>
  160. <example id="zend.layout.advanced.inflector.accessors">
  161. <title>Usando acessores Zend_Layout para modificar o inflector</title>
  162. <para>
  163. O inflector <classname>Zend_Layout</classname> padrão usa referências estáticas
  164. para o alvo e sufixo de view script, e tem acessores para configurar esses valores.
  165. </para>
  166. <programlisting language="php"><![CDATA[
  167. // Configure o alvo do inflector:
  168. $layout->setInflectorTarget('layouts/:script.:suffix');
  169. // Configura o sufixo do view script de layout:
  170. $layout->setViewSuffix('php');
  171. ]]></programlisting>
  172. </example>
  173. <example id="zend.layout.advanced.inflector.directmodification">
  174. <title>Modificação direta do inflector Zend_Layout</title>
  175. <para>
  176. Inflectores tem um alvo e uma ou mais regras. O alvo padrão usado com
  177. <classname>Zend_Layout</classname> é ':script.:suffix'; ':script' passa o nome
  178. do layout registrado, enquanto ':suffix' é uma regra estática do inflector.
  179. </para>
  180. <para>
  181. Digamos que você queira que o script de layout termine no sufixo 'html',
  182. e que você queira separar palavras MixedCase e camelCased com underscores
  183. ao invés de hífens, e não deixe o nome em caixa baixa. Adicionalmente,
  184. você quer procurar em um subdiretório 'layouts' pelo script.
  185. </para>
  186. <programlisting language="php"><![CDATA[
  187. $layout->getInflector()->setTarget('layouts/:script.:suffix')
  188. ->setStaticRule('suffix', 'html')
  189. ->setFilterRule(array('Word_CamelCaseToUnderscore'));
  190. ]]></programlisting>
  191. </example>
  192. <example id="zend.layout.advanced.inflector.custom">
  193. <title>Inflectores Customizados</title>
  194. <para>
  195. Na maioria dos casos, modificar o inflector existente será suficiente.
  196. Entretanto, você pode ter um inflector que você deseja usar em diversos
  197. lugares, com diferentes objetos de diferentes tipos.
  198. <classname>Zend_Layout</classname> suporta isso.
  199. </para>
  200. <programlisting language="php"><![CDATA[
  201. $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
  202. $inflector->addRules(array(
  203. ':script' => array('Word_CamelCaseToUnderscore'),
  204. 'suffix' => 'html'
  205. ));
  206. $layout->setInflector($inflector);
  207. ]]></programlisting>
  208. </example>
  209. <note>
  210. <title>Inflexão pode ser desabilitada</title>
  211. <para>
  212. Inflexão pode ser desabilitada e habilitada usando acessores no objeto
  213. <classname>Zend_Layout</classname>. Isso pode ser útil se você quiser especificar
  214. um caminho absoluto para um view script de layout, ou saber que o mecanismo
  215. que você usará para especificar o script de layout não precisa de inflexão.
  216. Simplesmente use os métodos <methodname>enableInflection()</methodname> e
  217. <methodname>disableInflection()</methodname>.
  218. </para>
  219. </note>
  220. </sect2>
  221. </sect1>
  222. <!--
  223. vim:se ts=4 sw=4 et:
  224. -->