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!

Posted in php at outubro 25th, 2009. 1 Comment.

Apesar do que eu tinha dito no post anterior, voltarei na idéia de instalação do Zend, já que nas últimas versões o Zend_Tool tem se mostrado uma ótima opção por ser rápido e prático para iniciar projetos, de forma muito mais eficiente que no tutorial passado.

Obs 1.: Desta vez eu fui mais específico quanto a instalação, mas não muito didático quanto a Controllers, Actions, View e o outras idéias do framework. Caso você não conheça muito sobre o framework, recomendo a leitura do meu post Começando com o Zend Framework 1.8 antes de continuar com esse.
Obs 2.: Faço este tutorial supondo que a versão usada no php é igual ou superior ao 5.2.4 e que o módulo mod_rewrite do Apache está habilitado.

Instalação em Windows:

Faça o download da última versão do Zend Framework, e extraia em uma pasta de fácil acesso. No caso do tutorial, eu estou usando a pasta C:\www\ZendFramework-1.9.4-minimal (foi usada a versão 1.9.4, a última versão lançada no momento de criação do tutorial).

Feito isso, precisamos certificar que o caminho para o arquivo .bat usado pelo Zend_Tool está no Path: para isso, vá em Painel de Controle > Sistema > Avançado > Variáveis de ambiente. Em “Variáveis do sistema”, edite o registro “Path”, colocando ao final ;C:\www\ZendFramework-1.9.4-minimal\bin.

Agora no prompt de comando (Iniciar > Executar > cmd), vamos testar se ele está encontrando o Path… digite:

zf show version

Se tudo der certo, ele deve mostrar a versão que será instalada. Se deu erro, certifique-se que o caminho que está no Path é correto.

Agora vá com o prompt até a pasta em que você deseja que seja criada a pasta do novo projeto. No caso, criei ele em C:\www\

cd C:\www\

Agora o comando para criar o projeto… eu o chamei de projeto_zf1.9.4:

zf create project projeto_zf1.9.4

Se tudo ocorreu corretamente, uma pasta com o mesmo nome do projeto foi criada e os arquivos básicos foram criados na estrutura padrão, conforme a imagem:

Estrutura Padrão - Zend Framework

Agora só falta ligar a biblioteca do zend ao projeto. Podemos fazer isso de 2 maneiras: chamando a biblioteca externamente, adicionando-a ao path de execução do php (uma das maneiras de fazer isso é adicionando o caminho da biblioteca dentro do set_include_path() do index.php); ou copiando a pasta da biblioteca (que está em C:\www\ZendFramework-1.9.4-minimal\library) para a pasta library do projeto.

Pronto! Para vê-lo rodando, acesse a pasta /public. Pelo meu exemplo, basta acessar: http://localhost/projeto_zf1.9.4/public

Configurações básicas do Framework

Agora que temos a base já instalada e funcionando, as configurações são dependentes apenas das necessidades do projeto. Vou apresentar algumas dicas e opções que o framework nos proporciona, mas sem me aprofundar muito. Quem sabe depois eu faço alguns posts especificando alguns deles.

  1. Criando Controllers e Actions: Ao contrário do que acontecia antes, não é preciso mais criar controllers e actions manualmente. Isso é realmente uma maravilha, quem leu o post sobre o Zend 1.8, viu que era muito Ctrl+C Ctrl+V, pra criar a classe do Controller, criar o método do Action, depois encontrar a pasta das views e criar o .phtml… enfim, agora tudo isso se resolve com o Zend_Tool, em apenas 2 comandos no prompt (Não se esqueça de ir para a pasta do projeto antes de executar):
    zf create controller nomecontroller

    e

    zf create action nomeaction nomecontroller
  2. Zend_Application: é o pontapé inicial da aplicação. Ele é chamado no index.php com o objetivo de inicializar a aplicação e chamar o Bootstrap. O componente nos permite criar recursos e executar alguns já disponíveis, como é o caso dos controllers, conexão ao banco, etc. Quem precisar criar ou usar recursos que sejam necessários durante a execução de todo o site, precisa saber mais sobre ele.
  3. Zend_Layout: Recurso muito usado com o Zend_View, que possibilita o uso de um layout padrão para todas as páginas. Para usá-lo, basta colocar as seguintes linhas no arquivo de configuração:
    ; nome do arquivo de layout padrão
    resources.layout.layout = "layout"
    ; caminho para uso dos layouts
    resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
    ; seta o encoding do view
    resources.view.encoding = "UTF-8"
    ; seta o caminho das views
    resources.view.basePath = APPLICATION_PATH "/views"

    Um exemplo de Layout (lembrando que deve ser um arquivo .phtml):

    <?php echo $this->doctype('XHTML1_STRICT'); ?>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <?php echo $this->headTitle('Layout Title') ?>
        <?php echo $this->headLink() ?>
        <?php echo $this->headStyle() ?>
        <?php echo $this->headScript() ?>
    </head>
    <body>
        <?php echo $this->layout()->content ?>
    </body>
    </html>
  4. Conexão com o Banco de Dados:  Outro recurso já implementado pelo Zend_Application. Para usá-lo, basta escrever no arquivo de configurações os parâmetros que o Zend_Db precisa para conectar ao banco de dados. Uma configuração para MySQL:
    resources.db.adapter = "pdo_mysql"
    resources.db.params.host = "localhost"
    resources.db.params.username = "usuario"
    resources.db.params.password = "senha"
    resources.db.params.dbname = "nomedobanco"

Conclusão

Certamente faltam detalhes para rodar uma aplicação mesmo que básica a partir dessas informações, mas espero que seja uma boa contribuição para aqueles que procuram uma maneira rápida de ter seu framework pronto para ser usado.

Nos próximos posts devo entrar em usos mais específicos de Zend_Db e Zend_View para podermos enfim criar aplicações mais “ricas”.

Posted in php at outubro 12th, 2009. 9 Comments.