Zend_View
é uma classe para trabalhar com a parte de visualização do
padrão de projeto MVC. Basicamente ela existe para separar o script de visualização dos
controladores e modelos. Ela fornece um sistema de assistentes, filtros de saída e escape
de variáveis.
Zend_View
é um sistema de template agnóstico; você pode usar o
PHP como sua linguagem de template, ou criar instâncias de outros
sistemas de template e manipulá-las dentro do seu script de visualização.
Essencialmente, o funcionamento do Zend_View
acontece em duas etapas
principais: 1. Seu script controlador cria uma instância de
Zend_View
, atribuindo-lhe variáveis. 2. O controlador instrui o
Zend_View
a renderizar uma determinada visualização, passando o
controle ao script de visualização, responsável pela geração da saída a ser visualizada.
Neste exemplo simples, suponhamos que seu controlador tenha uma listagem contendo dados sobre livros, que queremos renderizar para uma visualização. O controlador poderia ser algo como isto:
// use um modelo para obter os dados para autores e títulos de livros. $data = array( array( 'author' => 'Hernando de Soto', 'title' => 'The Mystery of Capitalism' ), array( 'author' => 'Henry Hazlitt', 'title' => 'Economics in One Lesson' ), array( 'author' => 'Milton Friedman', 'title' => 'Free to Choose' ) ); // agora atribua os dados do livro a uma instância Zend_View Zend_Loader::loadClass('Zend_View'); $view = new Zend_View(); $view->books = $data; // e renderize um script de visualização chamado "booklist.php" echo $view->render('booklist.php');
Agora necessitaremos do script de visualização associado, "booklist.php". Trata-se de um
script PHP como qualquer outro, com uma exceção: ele executa dentro
do escopo da instância de Zend_View
, o que implica que as
referências a $this apontam para as propriedades e métodos da instância
Zend_View
. (Variáveis atribuídas à instância pelo controlador são
propriedades públicas da instância de Zend_View
). Deste modo, um
script de visualização muito básico poderia se parecer com isto:
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;?>
Observe a forma como empregamos o método "escape()" para escapar o conteúdo das variáveis para a saída.
Zend_View
possui diversas opções que podem ser definidas para
configurar o comportamento de seus scripts de visualização.
-
basePath: indica o caminho base na qual será definido os caminhos dos scripts, assistentes e filtros. Ele assume esta estrutura de diretórios:
base/path/ helpers/ filters/ scripts/
Isto pode ser definido via
setBasePath()
,addBasePath()
ou passar a opção basePath para o construtor. -
encoding: indica a codificação de caracteres para usar com
htmlentities()
,htmlspecialchars()
, e outras operações. O padrão é UTF-8. Pode ser definido atravéssetEncoding()
ou passar a opção encoding para o construtor. -
escape: indica uma chamada de retorno para ser usada por
escape()
. Pode ser definido atravéssetEscape()
ou passar a opção escape para o construtor. -
filter: indica um filtro para uso após a renderização de um script de visualização. Pode ser definido através
setFilter()
,addFilter()
ou passar a opção filter para o construtor. -
strictVars: força
Zend_View
para emitir avisos e alertas quando as variáveis de visualização não inicializadas são acessadas. Pode ser definido chamandostrictVars(true)
ou passar a opção strictVars para o construtor.
Em nossos exemplos, fazemos uso das tags longas do PHP: <?php. Nós também favorecemos o uso da sintaxe alternativa para estruturas de controle. Estes são atalhos convenientes para usar quando escrevemos scripts de visualização, pois fazem as construções mais concisas, mantem as declarações sobre linhas simples e eliminam a necessidade de caçar os parênteses dentro de HTML.
Em versões anteriores, muitas vezes recomendamos o uso de tags curtas
(<? e <?=), que tornam os scripts de
visualização um pouco menos prolixos. No entanto, o padrão para a configuração
short_open_tag
do php.ini
é tipicamente off em
hosts em produção ou compartilhados - tornando o seu uso não muito portátil. Se você
usar template XML em scripts de visualização, tags curtas de abertura
farão com que os templates falhem na validação. Finalmente, se você usar tags curtas
quando short_open_tag
está off, os scripts de visualização ou
causarão erros ou simplesmente imprimirão o código PHP de volta para o visualizador.
Se, apesar destas advertências, você deseja usar tags curtas, mas elas estão desativadas, você tem duas opções:
-
Ative as tags curtas em seu arquivo
.htaccess
:php_value "short_open_tag" "on"
Isso só será possível se você tiver permissão para criar e utilizar arquivos
.htaccess
. Esta diretiva também podem ser adicionada ao seu arquivohttpd.conf
. -
Habilitar um stream wrapper opcional para converter tags curtas para tags longas em tempo real:
$view->setUseStreamWrapper(true);
Isso registra
Zend_View_Stream
como um stream wrapper para scripts de visualização, e garantirá que seu código continue trabalhando como se as tags curtas estivessem habilitadas.
Stream Wrapper Prejudica o Desempenho
O uso do stream wrapper irá prejudicar o desempenho de sua aplicação, embora benchmarks atuais estejam indisponíveis para quantificar o montante da degradação. Recomendamos que você ative as tags curtas, converta seus scripts para usar tags completas, ou tenha uma boa estratégia de cache completo e/ou parcial do conteúdo da página no lugar.
Normalmente, você somente precisará invocar assign()
,
render()
, ou um dos métodos para configurar/adicionar caminhos
de filtro, ajudante e script. No entanto, se você desejar estender
Zend_View
você mesmo, ou ter acesso a alguns de seus internos,
existe para isso alguns acessadores:
-
getVars()
retornará todas as variáveis atribuídas. -
clearVars()
limpará todas as variáveis atribuídas; útil quando você quer reutilizar um objeto visualização, mas quer controlar quais variáveis estão disponíveis. -
getScriptPath($script)
recuperará o caminho resolvido para um dado script de visualização. -
getScriptPaths()
recuperará todos os caminhos de script registrados. -
getHelperPath($helper)
recuperará o caminho resolvido para a classe assistente chamada. -
getHelperPaths()
recuperará os caminhos de todos os assistentes registrados. -
getFilterPath($filter)
recuperará o caminho resolvido para a classe filtro chamada. -
getFilterPaths()
recuperará os caminhos de todos os filtros registrados.