| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <sect1 id="zend.view.scripts">
- <title>Scripts de Visualização</title>
- <para>
- 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.
- </para>
- <para>
- 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).
- </para>
- <para>
- A fim de lembrar, aqui está um exemplo de script de visualização originado da introdução do Zend_View.
- </para>
- <programlisting role="php"><![CDATA[<?php if ($this->books): ?>
- <!-- Uma tabela contendo alguns livros. -->
- <table>
- <tr>
- <th>Autor</th>
- <th>Título</th>
- </tr>
- <?php foreach ($this->books as $key => $val): ?>
- <tr>
- <td><?php echo $this->escape($val['author']) ?></td>
- <td><?php echo $this->escape($val['title']) ?></td>
- </tr>
- <?php endforeach; ?>
- </table>
- <?php else: ?>
- <p>Não existem livros a serem exibidos.</p>
- <?php endif; ?>]]>
- </programlisting>
- <sect2 id="zend.view.scripts.escaping">
- <title>Escapando a Saída</title>
- <para>
- 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.
- </para>
- <para>
- Zend_View implementa um método chamado escape() que realiza corretamente o escape para você.
- </para>
- <programlisting role="php"><![CDATA[<?php
- // maneira ruim:
- echo $this->variable;
- // maneira recomendada:
- echo $this->escape($this->variable);
- ?>]]>
- </programlisting>
- <para>
- 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.
- </para>
- <programlisting role="php"><![CDATA[<?php
- // cria uma instância de Zend_View
- $view = new Zend_View();
- // instrui o uso de htmlentities como método de escape
- $view->setEscape('htmlentities');
- // ou instrui o uso de um método estático de classe
- $view->setEscape(array('SomeClass', 'methodName'));
- // ou mesmo um método de instância
- $obj = new SomeClass();
- $view->setEscape(array($obj, 'methodName'));
- // e renderiza a visualização
- echo $view->render(...);
- ?>]]>
- </programlisting>
- <para>
- 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.
- </para>
- </sect2>
- <sect2 id="zend.view.scripts.templates">
- <title>Sistemas de Template</title>
- <para>
- 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:
- </para>
- <programlisting role="php"><![CDATA[<?php
- include_once 'template.inc';
- $tpl = new Template();
- if ($this->books) {
- $tpl->setFile(array(
- "booklist" => "booklist.tpl",
- "eachbook" => "eachbook.tpl",
- ));
- foreach ($this->books as $key => $val) {
- $tpl->set_var('author', $this->escape($val['author']);
- $tpl->set_var('title', $this->escape($val['title']);
- $tpl->parse("books", "eachbook", true);
- }
- $tpl->pparse("output", "booklist");
- } else {
- $tpl->setFile("nobooks", "nobooks.tpl")
- $tpl->pparse("output", "nobooks");
- }
- ?>]]>
- </programlisting>
- <para>
- Estes seriam os arquivos de template relacionados:
- </para>
- <programlisting role="html"><![CDATA[
- <!-- booklist.tpl -->
- <table>
- <tr>
- <th>Author</th>
- <th>Title</th>
- </tr>
- {books}
- </table>
- <!-- eachbook.tpl -->
- <tr>
- <td>{author}</td>
- <td>{title}</td>
- </tr>
- <!-- nobooks.tpl -->
- <p>There are no books to display.</p>
- ]]>
- </programlisting>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|