Zend_View-Scripts.xml 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <sect1 id="zend.view.scripts">
  2. <title>Scripts de Visualização</title>
  3. <para>
  4. Uma vez que seu controlador tenha atribuido as variáveis e chamado o método, Zend_View incluirá o script de visualização requerido e o executará dentro do escopo de sua própria instância. Portanto, em seus scripts de visualização, as referências a $this apontarão para a própria instância de Zend_View.
  5. </para>
  6. <para>
  7. Variáveis atribuídas à visualização pelo controlador são referidas como propriedades de instância. Por exemplo, se o controlador atribuir a variável 'algumacoisa', você deve referir-se a ela como $this->algumacoisa em seu scritp de visualização. (Isto permite um rastreamento dos valores que foram atribuidos ao script, e que são internos ao mesmo).
  8. </para>
  9. <para>
  10. A fim de lembrar, aqui está um exemplo de script de visualização originado da introdução do Zend_View.
  11. </para>
  12. <programlisting role="php"><![CDATA[<?php if ($this->books): ?>
  13. <!-- Uma tabela contendo alguns livros. -->
  14. <table>
  15. <tr>
  16. <th>Autor</th>
  17. <th>Título</th>
  18. </tr>
  19. <?php foreach ($this->books as $key => $val): ?>
  20. <tr>
  21. <td><?php echo $this->escape($val['author']) ?></td>
  22. <td><?php echo $this->escape($val['title']) ?></td>
  23. </tr>
  24. <?php endforeach; ?>
  25. </table>
  26. <?php else: ?>
  27. <p>Não existem livros a serem exibidos.</p>
  28. <?php endif; ?>]]>
  29. </programlisting>
  30. <sect2 id="zend.view.scripts.escaping">
  31. <title>Escapando a Saída</title>
  32. <para>
  33. Uma das tarefas mais importantes a ser executada por scripts de visualização é assegurar que a saída seja corretamente escapada; entre outras coisas, isto ajuda a evitar ataques do tipo site-cruzado. A menos que você esteja usando uma função, método, ou assistente que realize o escape, você sempre deverá escapar o conteúdo das variáveis antes de exibí-lo.
  34. </para>
  35. <para>
  36. Zend_View implementa um método chamado escape() que realiza corretamente o escape para você.
  37. </para>
  38. <programlisting role="php"><![CDATA[<?php
  39. // maneira ruim:
  40. echo $this->variable;
  41. // maneira recomendada:
  42. echo $this->escape($this->variable);
  43. ?>]]>
  44. </programlisting>
  45. <para>
  46. Por padrão, o método escape() usa a função PHP htmlspecialchars() para fazer o escape. Mas, dependendo do seu ambiente, você pode desejar um comportamento diferente para o escape. Use o método setEscape() no nível do controlador para instruir o Zend_View sobre qual função de callback utilizar para fazer o escape.
  47. </para>
  48. <programlisting role="php"><![CDATA[<?php
  49. // cria uma instância de Zend_View
  50. $view = new Zend_View();
  51. // instrui o uso de htmlentities como método de escape
  52. $view->setEscape('htmlentities');
  53. // ou instrui o uso de um método estático de classe
  54. $view->setEscape(array('SomeClass', 'methodName'));
  55. // ou mesmo um método de instância
  56. $obj = new SomeClass();
  57. $view->setEscape(array($obj, 'methodName'));
  58. // e renderiza a visualização
  59. echo $view->render(...);
  60. ?>]]>
  61. </programlisting>
  62. <para>
  63. A função ou método de callback deverá tomar o valor a ser escapado como seu primeiro parâmetro, e os demais parâmetros deverão ser opcionais.
  64. </para>
  65. </sect2>
  66. <sect2 id="zend.view.scripts.templates">
  67. <title>Sistemas de Template</title>
  68. <para>
  69. Embora o PHP em sí seja um poderoso sistema de template, muitos desenvolvedores sentiram que ele é muito potente ou complexo para seus designers de templates. Como tal, o script de visualização pode ser usado para instanciar e manipular um objeto de template separadamente, tal como um template ao estilo PHPLIB (ou Smarty). O script de visualização para este tipo de tarefa pode ser algo como isto:
  70. </para>
  71. <programlisting role="php"><![CDATA[<?php
  72. include_once 'template.inc';
  73. $tpl = new Template();
  74. if ($this->books) {
  75. $tpl->setFile(array(
  76. "booklist" => "booklist.tpl",
  77. "eachbook" => "eachbook.tpl",
  78. ));
  79. foreach ($this->books as $key => $val) {
  80. $tpl->set_var('author', $this->escape($val['author']);
  81. $tpl->set_var('title', $this->escape($val['title']);
  82. $tpl->parse("books", "eachbook", true);
  83. }
  84. $tpl->pparse("output", "booklist");
  85. } else {
  86. $tpl->setFile("nobooks", "nobooks.tpl")
  87. $tpl->pparse("output", "nobooks");
  88. }
  89. ?>]]>
  90. </programlisting>
  91. <para>
  92. Estes seriam os arquivos de template relacionados:
  93. </para>
  94. <programlisting role="html"><![CDATA[
  95. <!-- booklist.tpl -->
  96. <table>
  97. <tr>
  98. <th>Author</th>
  99. <th>Title</th>
  100. </tr>
  101. {books}
  102. </table>
  103. <!-- eachbook.tpl -->
  104. <tr>
  105. <td>{author}</td>
  106. <td>{title}</td>
  107. </tr>
  108. <!-- nobooks.tpl -->
  109. <p>There are no books to display.</p>
  110. ]]>
  111. </programlisting>
  112. </sect2>
  113. </sect1>
  114. <!--
  115. vim:se ts=4 sw=4 et:
  116. -->