Zend_View-Controllers.xml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.view.controllers">
  5. <title>Scripts Controladores</title>
  6. <para>
  7. O controlador é onde você instancia e configura o <classname>Zend_View</classname>. Você
  8. atribui variáveis ao visualizador, instruindo-o a renderizar a saída usando um script
  9. particular.
  10. </para>
  11. <sect2 id="zend.view.controllers.assign">
  12. <title>Atribuindo Variáveis</title>
  13. <para>
  14. Seu script controlador deverá atribuir as variáveis necessárias ao visualizador antes de
  15. passar o controle para ele. Normalmente, você pode fazer isso atribuindo valores aos
  16. nomes de propriedades da instância do visualizador:
  17. </para>
  18. <programlisting language="php"><![CDATA[
  19. $view = new Zend_View();
  20. $view->a = "Hay";
  21. $view->b = "Bee";
  22. $view->c = "Sea";
  23. ]]></programlisting>
  24. <para>
  25. Porém, isto pode ser tedioso quando você coletar os valores a serem atribuídos a partir
  26. de uma matriz ou objeto.
  27. </para>
  28. <para>
  29. O método assign() permite a atribuições a partir de uma matriz ou objeto "a granel". O
  30. exemplo seguinte tem o mesmo efeito que o exemplo de atribuição de propriedades uma a
  31. uma.
  32. </para>
  33. <programlisting language="php"><![CDATA[
  34. $view = new Zend_View();
  35. // atribui uma matriz associativa onde a chave é nome da variável
  36. // e o valor é proprio valor atribuído.
  37. $array = array(
  38. 'a' => "Hay",
  39. 'b' => "Bee",
  40. 'c' => "Sea",
  41. );
  42. $view->assign($array);
  43. // faz o mesmo com as propriedades públicas do objeto;
  44. // note a forma a conversão ao tipo matriz na atribuição.
  45. $obj = new StdClass;
  46. $obj->a = "Hay";
  47. $obj->b = "Bee";
  48. $obj->c = "Sea";
  49. $view->assign((array) $obj);
  50. ]]></programlisting>
  51. <para>
  52. Alternativamente, você pode usar o método assign para fazer atribuições uma a uma
  53. passando a string contendo o nome da variável, e logo em seguida o valor a ser
  54. atribuído.
  55. </para>
  56. <programlisting language="php"><![CDATA[
  57. $view = new Zend_View();
  58. $view->assign('a', "Hay");
  59. $view->assign('b', "Bee");
  60. $view->assign('c', "Sea");
  61. ]]></programlisting>
  62. </sect2>
  63. <sect2 id="zend.view.controllers.render">
  64. <title>Renderizando um Script de Visualização</title>
  65. <para>
  66. Uma vez que tenhamos atribuído todas as variáveis necessárias, o controlador irá
  67. instruir o <classname>Zend_View</classname> a renderizar um script de visualização
  68. particular. Ele fará isso chamando o método render(). Note que o método irá retornar a
  69. visualização renderizada, mas não irá imprimí-la, ficando ao seu encargo fazê-lo
  70. (echo() ou print()) no momento apropriado.
  71. </para>
  72. <programlisting language="php"><![CDATA[
  73. $view = new Zend_View();
  74. $view->a = "Hay";
  75. $view->b = "Bee";
  76. $view->c = "Sea";
  77. echo $view->render('someView.php');
  78. ]]></programlisting>
  79. </sect2>
  80. <sect2 id="zend.view.controllers.script-paths">
  81. <title>Caminhos do Script de Visualização</title>
  82. <para>
  83. Por padrão, <classname>Zend_View</classname> espera encontrar os scripts de visualização
  84. localizados no mesmo diretório onde reside o script controlador. Por exemplo, se o seu
  85. script controlador estiver em "/path/to/app/controllers" e chamar
  86. $view->render('someView.php'), <classname>Zend_View</classname> irá procurar por ele em
  87. "/path/to/app/controllers/someView.php".
  88. </para>
  89. <para>
  90. Obviamente, os seus scripts de visualização estarão provavelmente situados em outro
  91. lugar. Para informar ao <classname>Zend_View</classname> onde procurar pelos referidos
  92. scripts, use o método setScriptPath().
  93. </para>
  94. <programlisting language="php"><![CDATA[
  95. $view = new Zend_View();
  96. $view->setScriptPath('/path/to/app/views');
  97. ]]></programlisting>
  98. <para>
  99. Agora quando você chamar $view->render('someView.php'), ele irá procurar em
  100. "/path/to/app/views/someView.php".
  101. </para>
  102. <para>
  103. De fato, você pode "empilhar" caminhos usando o método addScriptPath(). A medida que
  104. você acrescenta caminhos à pilha, <classname>Zend_View</classname> irá procurar pela
  105. visão no caminho mais recentemente adicionado à pilha. Isto permite sobrepor visões
  106. padronizadas por visões customizadas, permitindo a criação de "temas" e "peles" para
  107. algumas visões, deixando outras intocadas.
  108. </para>
  109. <programlisting language="php"><![CDATA[
  110. $view = new Zend_View();
  111. $view->addScriptPath('/path/to/app/views');
  112. $view->addScriptPath('/path/to/custom/');
  113. // agora quando você chamar $view->render('booklist.php'),
  114. // Zend_View procurará primeiro em "/path/to/custom/booklist.php",
  115. // depois em "/path/to/app/views/booklist.php", e finalmente no
  116. // diretório corrente, por "booklist.php".
  117. ]]></programlisting>
  118. <note>
  119. <title>Nunca utilize uma entrada do usuário para definir caminhos de script</title>
  120. <para>
  121. <classname>Zend_View</classname> utiliza caminhos de script para pesquisar e
  122. renderizar os scripts de visualização. Como tal, estes diretórios devem ser
  123. conhecidos de antemão, e estarem sob seu controle. <emphasis>Nunca</emphasis> defina
  124. caminhos de script de visualização com base em entradas do usuário, pois você pode
  125. se abrir potencialmente para a vulnerabilidade de Inclusão Local de Arquivo se o
  126. caminho especificado incluir percursos ao diretório pai. Por exemplo, a seguinte
  127. entrada pode desencadear o problema:
  128. </para>
  129. <programlisting language="php"><![CDATA[
  130. // $_GET['foo'] == '../../../etc'
  131. $view->addScriptPath($_GET['foo']);
  132. $view->render('passwd');
  133. ]]></programlisting>
  134. <para>
  135. Embora este exemplo seja artificial, ele mostra claramente o problema em potencial.
  136. Se você <emphasis>deve</emphasis> contar com a entrada do usuário para definir o
  137. caminho do script, filtre a entrada de forma apropriada e certifique-se de que os
  138. caminhos sejam controlados por sua aplicação.
  139. </para>
  140. </note>
  141. </sect2>
  142. </sect1>
  143. <!--
  144. vim:se ts=4 sw=4 et:
  145. -->