Introdução

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.

Script Controlador

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');

Script Visualizador

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.

Opções

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és setEncoding() ou passar a opção encoding para o construtor.

  • escape: indica uma chamada de retorno para ser usada por escape(). Pode ser definido através setEscape() 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 chamando strictVars(true) ou passar a opção strictVars para o construtor.

Tags Curtas em Scripts de Visualização

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 arquivo httpd.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.

Acessadores Utilitários

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.