Meio que uma continuação do post passado, vou abordar um pouco mais do Zend_View, o componente do Zend Framework responsável pela camada de Visão do modelo MVC implementado.
Obs.: Este post está sendo feito com base na versão 1.9.4 do framework.
Um Simples Exemplo
Simples mesmo: passar uma informação do controller para a view.
No Controller, dentro da Action desejada:
// cria algumas variáveis
$valor1 = 123.45;
$valor2 = array(
array('id' => '1', 'titulo' => 'Teste 1'),
array('id' => '2', 'titulo' => 'Teste 2'),
array('id' => '3', 'titulo' => 'Teste 3')
);
// inclui as variáveis na view
// podemos atribuir o valor como objeto
$this->view->valor1 = $valor1;
// ou usar o método assign... assign('nome dentro da view', $valor);
$this->view->assign('valor2', $valor2);
E na view:
<p><?php echo $this->valor1 ?></p>
<table>
<tr>
<th>Código</th>
<th>Título</th>
</tr>
<?php foreach ($this->valor2 as $registro){ ?>
<tr>
<td> <?php echo $this->escape($registro['id']); ?>
<td> <?php echo $this->escape($registro['titulo']); ?>
</tr>
<?php } ?>
</table>
Ou seja: no Controller indicamos quais variáveis queremos que a instância do Zend_View “enxergue”, de maneira que na view só precisamos dar um escape para mostar. Esse escape, por padrão, é o htmlspecialchars() para evitar que os valores das variáveis causem alguma quebra no html.
View Helpers
Como foi visto no exemplo, as coisas são bem simples: setamos variáveis e usamos-as na view. Mas o problema é: e se quisermos fazer algo mais complexo, como por exemplo, alterar a cor das linhas da tabela do nosso primeiro exemplo?
Para evitar soluções como, por exemplo, criar um contador com um if para verificar se é par ou impar, temos os helpers, que são implementações em classes de funcionalidades complexas que não queremos colocar explicitamente na view.
Neste caso, já temos o Zend_View_Helper_Cycle, um helper já implementado. Assim, basta alterar uma única linha:
<tr style="background-color: <?php echo $this->cycle(array("#FF0000","#00FF00"))->next()?>">
Apenas com um comando dentro do <tr>, o nosso exemplo já nos mostra uma tabela que alterna o fundo em vermelho e verde.
Esse é apenas um dos já implementados: caso queira aprender quais são e como usá-los, recomendo dar uma olhada na referência oficial dos View Helpers. Não gostaria de colocar todos aqui porque qualquer explicação seria mera repetição, e minha intenção mesmo é mostrar a criação de um helper.
Então vamos lá: usando o primeiro exemplo, estamos mostrando um número, mas queremos mostrá-lo como um preço. Para isso, contaremos com o Zend_Currency, que é um componente próprio para tratar disso, mas como não queremos fazer isso no controller, vamos facilitar nossa vida e chamar esse helper.
Na instalação, o framework já nos deixou uma pasta própria para ele em application/views/helpers/ e é nele que deve ser criado o seguinte arquivo:
<?php
class Zend_View_Helper_Currency extends Zend_View_Helper_Abstract
{
/*
* por convenção do framework, o método deve ser o nome da
* classe (Currency) em minúsculo
*/
public function currency($valor)
{
// instanciamos a classe que trata, explicitando o locale
$currency = new Zend_Currency('pt_BR');
// devemos SEMPRE retornar valores, nunca mostrar na saída
return $currency->toCurrency($valor);
}
}
Eu não vou mudar muito o foco para o Zend_Currency, mas só para não deixar dúvidas, o método retorna o valor formatado em reais, com o formato português do Brasil.
Feito isso, mudamos na view apenas a linha que chamamos o $valor1:
<p><?php echo $this->currency($this->valor1); ?></p>
Deve ser mostrado na tela algo como ‘R$123,45′.
Obs.: Muitas pessoas (inclusive eu) acham prático criar uma pasta dentro do library com todas as classes próprias que não façam parte do Controller e do Model. Caso queira deixar seus helpers dentro de uma pasta dessas, crie um método no Bootstrap instanciando o Zend_View e use o método addHelperPath para que o framework encontre-os:
protected function _initView()
{
$view = new Zend_View();
$view->addHelperPath('path/to/my/view/helper', 'My_View_Helper');
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
return $view;
}
Conclusão
Vimos que o Zend_View é um poderoso componente de templates que permite de maneira muito simples a incorporação de funções complexas novas. Apesar de ter sido uma visão superficial, baseada nos view helpers, já é possível criar uma camada de visão de maneira limpa e eficiente.
Mesmo assim, os próximos posts devem complementar algumas das informações passadas aqui, então fiquem atentos!
novembro 1st, 2009 at 18:14 #Smarty: Sistema de Templates em PHP (Parte 1) - Diego Jeronymo
[...] demonstrei em tópicos anteriores que o Zend_View é um ótimo componente para facilitar a nossa camada view de um projeto MVC. [...]