Sei sulla pagina 1di 56

[ Tutorial ] Zend Framework Parte 01

23 de novembro de 2011Framework, PHP 5, Zend Frameworkframework, PHP, Tutorial, Zend Framework Instalao, configurao, criao de projeto

Sumrio
Neste tutorial, voc vai aprender como baixar e instalar o Zend Framework, assim como ativar o mod_rewrite do Apache e criar um Virtual Host. Vai modificar o arquivo .htaccess para alterar o comportamento do Zend Framework. Voc tambm vai aprender a criar um projeto utilizando o ZF Tool. NOTA AOS DESENVOLVEDORES : Este tutorial utiliza o Zend Framework verso 1.11.11 1.12.3 e pode no funcionar em verses anteriores do Zend. Clique aqui para ver todos os tutoriais disponveis

Instalao e Configurao
Para comear a usar o Framework, precisamos cumprir alguns requisitos: 1 Baixar o framework 2 Instalar e ativar o mod_rewrite 3 Criar um servidor virtual 4 Criar uma estrutura para a aplicao ou site 5 e muito mais Nota: Para usar o framework preciso que voc tenha o PHP 5 rodando em seu servidor, mas cuidado com verses muito recentes do PHP, no momento da escrita deste tutorial tive problemas com o PHP 5.3.3, mas ele rodou legal no PHP 5.3.8. Vamos ento dividir nosso tutorial em vrias partes para poder manter um fluxo no aprendizado saudvel e voc no arrancar os cabelos antes do tempo ( brincadeirinha ).

Baixando o framework
Para baixar o Zend Framework voc deve ir no site oficial do framework http://framework.zend.com. Procure a verso que vamos utilizar neste tutorial, a Zend Framework 1.11.11 1.12.3 Minimal. Caso tenha sado outra verso antes que eu termine as atualizaes deste tutorial para a versao que usei clique aqui para baix-la diretamente.

Configurando o Servidor Apache para mod_rewrite


Antes de instalar o framework precisamos configurar o mod_rewrite no servidor. Caso voc esteja utilizando outro servidor que no seja o apache, voc precisar verificar na documentao a forma mais correta de ativar o mod_rewrite deste. Para o Apache, o procedimento bem simples. Como estou usando o Windows vou mostrar como proceder para obter o resultado desejado. 1 Abra o arquivo httpd. conf do Apache, normalmente ele se encontra dentro da pasta conf 2 Procure pela linha #LoadModule rewrite_module modules/mod_rewrite.so e retire o sustenido (#) inicial 3 Procure pela Tag <Directory> 4 Dentro desta troque Options FollowSymLinks por Options FollowSymLinks Includes 5 Troque AllowOverride None por AllowOverride All 6 Agora procure pela Tag <Directory C:/Apache/htdocs> que dependendo de sua instalao pode estar diferente, mas que onde se encontra as configuraes da pasta raiz do apache 7 Tendo encontrado esta Tag, troque Options Indexes por Options Indexes FollowSymLinks 8 Troque AllowOverride None por AllowOverride All 9 No final do arquivo adicione a linha AccessFileName .htaccess e estamos com o Apache configurado para mod_rewrite.

Criando um Virtual Host para simular servidor remoto


Para criar um Virtual Host no apache bem fcil. Hipotticamente vamos criar o host virtual zend.localhost 1 Abra o arquivo CAMINHO/PARA/SEU/Apache/conf/httpd. conf 2 Procure pelas linhas:
1 # Virtual hosts 2 # Include conf/extra/httpd-vhosts.conf

O sustenido (#) indica cdigo comentado para o Apache, por isto no ser executado. Caso o seu esteja assim, remova o (#) da linha do include:

1 # Virtual hosts 2 Include conf/extra/httpd-vhosts.conf

Feche o arquivo. 3 Abra o arquivo CAMINHO/PARA/SEU/Apache/conf/extra/httpd-vhosts.conf e cole o cdigo abaixo no final do arquivo:
1 DocumentRoot "CAMINHO/PARA/SEU/Apache/htdocs/www/tutorial-zend" 2 ServerName zend.localhost 3 ErrorLog "logs/tutorial-zend-error.log" 4 CustomLog "logs/tutorial-zend-access.log" common

Salve e feche o arquivo. 4 Reinicie O Apache 5 Execute o notepad como administrador (Vista/7 somente, xp no precisa ) e abra o arquivo: C:\windows\system32\drivers\etc\hosts Dica: Para iniciar um programa como administrador, procure por ele no Menu Iniciar ou na pasta dele, clique com o boto direito e voc ter a Opo Executar como administrador. 6 No incio do arquivo insira a linha:
1 127.0.0.1 2 127.0.0.1 localhost zend.localhost

Salve e feche o arquivo 7 Crie uma pasta chamada tutorial-zend dentro de CAMINHO/PARA/SEU/Apache/htdocs/www/ 8 No navegador digite: http://zend.localhost e pronto!

Criando a Estrutura de Arquivos


Uma aplicao com Zend Framework vai precisar utilizar um padro, embora voc possa configurar o mesmo de vrias formas, bastando alterar os caminhos dos arquivos. Mas, para fins de obter um processo sem complicaes, vamos utilizar o padro. Vamos criar o projeto dentro da pasta raiz de nosso servidor virtual, simulando um servidor remoto, pois voc vai precisar saber fazer isto quando for instalar sua aplicao ou site num servidro remoto. Vamos usar o famoso padro de redirecionamento com URLs limpas (Clean URLs) que elimina os tradicionais Query Strings ( Ex. http://zend.localhost/index.php?module=default&controller=produto&action=ver&id=1 vai ficar http://zend.localhost/produto/id/1)

ZF Tool
IMPORTANTE: Confira meu tutorial exclusivo sobre como utilizar o ZF Tool. Clique aqui para acessar. E se voc utiliza o Linux, clique aqui.

Eliminamos o sofrimento utilizando uma ferramenta criada pela equipe do Zend, com a finalidade de agilizar e facilitar o desenvolvimento, chamada ZF Tool. Esta ferramenta cria o projeto e tudo o mais que precisarmos relacionado a estrutura, conforme veremos mais adiante. Vamos ento instalar o bichinho, j que ele ajuda e mansinho, porque fugir dele (risos)! 1 Extraia o arquivo que voc baixou do site da zend e acesse at chegar na pasta onde esto as pastas bin e library. 2 Copia-as e cole em c:\CAMINHO\PARA\Apache\apps\zend 3 Abra a pasta bin e copie os arquivos: zf.bat e zf.php para dentro do diretrio de instalao do seu. 4 No mesmo diretrio, procure pelo arquivo php.ini e abra-o no bloco de notas ( Se voc usa Wamp veja este tutorial ). 5 Procure pela linha:
1 ;include_path = ".;c:\php\includes"

e mude para:
1 include_path = ".;c:/CAMINHO/PARA/Apache/apps/zend/library"

6 Abra o prompt de comando do DOS ( digite cmd em Executar ou Iniciar) e digite:


1 zf show version

IMPORTANTE (Se voce usa Linux ignore): Seu ZF no ser reconhecido como comando interno ou externo, pois seu PHP.exe no foi configurado como varivel do ambiente do windows. Para resolver isto siga os procedimentos abaixo: 1 Clique com o boto direito em Meu Computador 2 Propriedades 3 Configuraes Avanadas ou Aba Avanado 4 Variveis de Ambiente 5 Procure e clique em Path e depois no boto Editar 6 Adicione ao final do que estiver l o caminho do php: ; c:\CAMINHO\PARA\SEU\PHP 7 ok, ok, ok 8 Reinicie o computador (Obrigatrio). Se tudo correu certinho, voc ver algo assim:
1 Zend Framework Version 1.12.3

Estrutura de Arquivos com ZF Tool


Para criar a estrutura de arquivos com o ZF Tool abra o Prompt de Comando novamente ( digite cmd em Executar ou Iniciar) e acesse a nossa pasta:

CAMINHO/PARA/SEU/Apache/htdocs/www/ Se voc no sabe utilizar o Prompt de Comando acesse o tutorial Comandos Bsicos do MS-DOS infowester veja os comandos: CLS, DIR, CHDIR, MKDIR e EXIT! No precisa mais do que isto para este tutorial) No Prompt de Comando digite:
1 C:/CAMINHO/PARA/SEU/Apache/htdocs/www/

Para criar a estrutura de arquivos voc deve executar o comando:


1 zf create project tutorial-zend

Ao executar o comando acima o ZF Tool criar a estrutura inicial do projeto, conforme a imagem abaixo:

Agora, voce precisa copiar a pasta Zend(23MB), que se encontra dentro de C:/CAMINHO/PARA/SEU/Apache/apps/zend/library para a pasta tutorialzend/library e sua estrutura ficar parecida com esta:

Agora j podemos comear a explorar nosso projeto e aprender a sobre mdulos, controladores e aes

Arquivo .htaccess
O ZF Tool criou o arquivo /tutorial-zend/public/.htaccess para ns, entretanto, ele ainda no est pronto para ser utilizado, pois no sei porque ele no est configurado corretamente e muito menos no local mais ideal! O contedo deste arquivo far com que todas as solicitaes sejam redirecionadas para a pasta public de nossa aplicao, o que torna o acesso direto aos arquivos impossvel. Mude a localio do arquivo de /tutorial-zend/public/.htaccess para /tutorialzend/.htaccess e modifique seu contedo conforme abaixo:
1 RewriteEngine On 2 RewriteCond %{REQUEST_FILENAME} -s [OR] 3 RewriteCond %{REQUEST_FILENAME} -l [OR] 4 RewriteRule !\.(js|gif|jpg|png|css|txt)$ public/index.php [L] 5 RewriteCond %{REQUEST_URI} !^/public/ 6 RewriteRule ^(.*)$ public/$1 [NC,L]

Este arquivo tem um diferencial do padro comum que voc encontra em outros tutoriais tratando do Framework. Nele ns alteramos o DocumentRoot do Apache, diferente de alterar nos arquivo de configurao do Apache. Isto preciso pois em alguns casos o desenvolvedor no tem acesso ao arquivo httpd ou mesmo uma opo de alterar a pasta raiz do servidor. Ento, redirecionar com o arquivo .htaccess, mostrou-me ser mais verstil.

Welcome to the Zend Framework!


Para finalizar esta primeira parte de nosso tutorial, acesse http://zend.localhost e voc dever ver a tela conforme a imagem abaixo. Caso aparea algum erro refaa os passos novamente e verifique possiveis erros de digitao, etc.

Concluso
Nesta parte do tutorial voc aprendeu como instalar e configurar a Biblioteca Zend em seu servidor usando o Apache, aprendeu a criar um projeto utilizando o ZF Tool e voc tambm aprendeu a redirecionar as solicitaes para a pasta public do projeto que vamos desenvolver. No prximo tutorial vamos colocar a mo na massa e comear nossa viagem ao planeta Zend Framework. Abrao do Giba!

[ Tutorial ] Zend Framework Parte 02


23 de novembro de 2011Framework, PHP 5, Tutorial, Zend Frameworkcontroller, model, MVC, Tutorial, view, Zend Framework

MVC, Modules, Controllers, Views, Parameters

Sumrio
Nesta parte do tutorial vamos aprender alguns conceitos fundamentais para todo desenvolvedor que utilize o Zend Framework, entre eles o Padro MVC, Modules, Controllers, Actions, Models, Parameters. Vamos criar um site bsico a partir do nosso projeto criado na parte anterior e vamos utilizar os conceitos citados acima.
Clique aqui para ver todos os tutoriais disponveis

Agora que voc j tem o seu Zend Frameword instalado hora de se aprofundar em alguns conceitos e entender como as coisas mais fundamentais funcionam.

Padro de Projeto MVC


O Zend Framework todo Orientado a Objetos, por isto voc precisar ter algum conhecimento bsico sobre Orientao a Objetos em PHP. O Zend frameowork utiliza um padro muito famoso chamado MVC. MVC a abreviatura para Model-ViewController. O MVC permite ao desenvolvedor separar o cdigo em 3 camadas: Apresentao, Lgica de negcio e Acesso aos dados. As 3 camadas citadas acima so as utilizadas pelo MVC: M Model ( Acesso aos dados) Esta a parte de sua aplicao que define suas funcionalidades bsica atrs de um conjunto de abstraes. Acesso a dados e algums lgicas de negcio podem ser definidas dentro de um model. V View ( Apresentao ) Os Views definem exatamente o que apresentado ao usurio. Normalmente, os Controllers passam os dados para cada View a fim de exibr estes dados em algum formato. Os Views frequentemente tambm coletam dados do usurio. onde voc provavelmente encontrar a marcao HTML em sua aplicaao MVC. C Controller ( Lgica de Negcio ) Os Controllers liga todo o padro MVC. Eles manipulam os Models, decidem qual view exibir baseado na solicitao do usurio e outros fatores, passam os dados que cada view ir precisar ou repassa o controlle para outro controller.

Module x Model

importante antecipar aqui a diferena entre Module e Model. Para os falantes do idioma ingls no h muita confuso quanto a estas duas palavras. Module (mdulo) o que modulariza a aplicao e Model (modelo) o que d acesso aos dados nas mais diversas formas. Module no est dentro do MVC mas utilizado em cada solicitao feita pelo Zend, por isto sua importancia. Default Toda aplicao Zend inicia com o Module default por padro. Veremos mais adiante a estrutura de uma solicitao que explicar melhor.

Estrutura de solicitao: Modules, Controllers, Actions e Parameters


Toda solicitao feita ao Zend Framework possui basicamente 03 (trs) elementos. Module Parte da aplicao que contem um objetivo distinto e que deve ser utilizado caso voc precise controlar vrias sees distintas de seu site ou aplicao. Um exemplo mais bsico seria cria um mdulo para a rea adminsitrativa do site e utiizar o module Default para o site per si. Com mais experincia voc descobrir vrias formas de utilizar a estrutura de Modules do Zend, mas por hora, a explicao acima basta. O module default no precisa ser chamado, pois o Zend o carrega automaticamente. Caso voc crie um novo Module, voc precisar criar uma pasta para o default. Na pratica j veremos como criar um mdulo e voc entender melhor. Controller O controller inicial de qualquer aplicao zend o index. O controller index no precisa ser chamado, pois o Zend o carrega automaticamente quando nenhum for passado. Cada controller possui uma classe exclusiva e nica que extendida da classe abstrata Zend_Controller_Action que implementada a partir de Zend_Controller_Action_Interface. Ai voc deve estar se perguntando: No entendi, Controller que extendido de uma classe Zend_Controller_Action? Pois , o interessante que na verdade, o mais importante a camada de apresentao numa aplicao, pois nela que o usurio interage com o controller, por isto, e pelo fato

do controller controlar primariamente actions que vo conter acesso a tudo o que existe no Zend e no MVC per si, a estrutura de arquivos carregada a partir dos actions e no dos controllers em si. Os controllers apenas fazem isto: controlam a lgica de negcio e acesso a dados presentes nos actions. Action O action inicial de qualquer aplicao zend o index. O action index no precisa ser chamado, pois o Zend o carrega automaticamente quando nenhum for passado.

Relao MVC e Solicitao com Module/Controller/Action.


Na parte anterior desta sequencia de tutoriais voc criou o projeto e testou a partir do url:
1 http://zend.localhost

Por trs dos panos o Zend na verdade executou isto:


1 http://zend.localhost/default/index/index

O que seria o mesmo que:


1 http://zend.localhost/MODULE/CONTROLLER/ACTION

O MODULE no faz nada se no houver mais do que o mdulo default e no far nada mais do que selecionar a estrutura de arquivos que dever estar dentro da pasta /modules/NOME_DO_MODULO caso voc utilize mais do que o mdulo default. O CONTROLLER tem relao direta com o Controller do MVC e carrega o arquivo que contm o controller em questo que dever estar dentro da pasta /application/controllers, caso no seja utilizado mdulo e dentro de /application/modules/NOME_DO_MODULO/controllers, caso esteja utilizando mais do que um mdulo. O ACTION tem relao direta com o View do MVC e carregar o arquivo do controller anterior que contm os Actions dentro. Parameters Este o item que todos se questionam mais cedo ou mais tarde comeam a utilizar o tradicional $_GET e se questionam porque o URL t ficando cheio de &&&& e nem um pouco amigvel. Bom, vo existir casos em que voc precisar utilziar $_GET no seu projeto, mas na maioria das situaes, no h necessidade.

O Zend utiliza um padro onde depois de ter encontrado o Module( caso no seja o default), o Controller e o Action ele considerar cada / como um parametro e a prxima / como o valor para este parametro. Exemplo:
1 http://zend.localhost/module/controller/action/PARAMETRO1/VALOR1/PARA METRO2/VALOR2

Logo, se voc quisesse passar a Categoria carros e a Marca chevrolet, ficaria assim:
1 http://zend.localhost/module/controller/action/categoria/carros/marca /chevrolet

Legal, no ? Voc vai aprender como pegar estes valores na parte onde tratamos GET e POST. Por ora basta saber isto, entretanto importante citar aqui que se voc utilizar o controller ou action index e deseja obter parametros do URL, voc precisar informar no URL, index/index/ caso contrrio, o Zend vai entender que o parametro o nome do controller e por isto no encontrar e mostrar uma mensagem de erro.

Criando um Site Bsico


Durante todo o curso de nosso tutorial vamos trabalhar em cima de um projeto e o mesmo ser um site bsico sem atrativos visuais, mas que demonstrar todo o potencial do Zend. Nosso site ter dois mdulos: default onde residir todo o cdigo de nosso site acessvel pelo usurio final do site. admin onde residir toda o cdigo da rea administrativa do site.

Criando os Modules
Vamos trabalhar com mdulos pois migrar mdulos no zend muito importante, entretanto, por considerarmos utilizamos o ZF Tool, a abordagem tradicional que voc encontra na maioria dos tutoriais por ai pode lhe desanimar, e por isto eu j vou antecipar a soluo de seus problemas trabalhando com mdulos desde j, a fim de deix-lo capacitado para criar grandes projetos. Considero que voc tem o ZF Tools funcionando perfeitamente, caso no tenha, veja o post anterior a este e configure-o. Atravs do terminal do windows, acesse a pasta do projeto:
1 C:/CAMINHO/PARA/SEU/Apache/htdocs/www/tutorial-zend

E digite o comando:
1 zf create module default

e faa o mesmo para o mdulo admin


1 zf create module admin

Verifique que dentro de application foi criado uma pasta modules. Abra esta pasta e verifique que foram criados outras pastas default e admin, ambas contendo sua prpria estrutura. Note na imagem abaixo que as pastas controllers e views, criadas no post anterior, ainda esto no mesmo lugar de antes.

Na primeira parte de nosso tutorial ns criamos o projeto e ele automaticamente criou a pasta /controllers e /views. NOTA: Se voc acessar o URL do projeto agora http://zend.localhost voc ver um erro.

Corrigindo o IndexController.php e ErrorController.php Voc precisar recrir os controladores Index e Error a fim da aplicao funcionar a partir de agora. A lgica para criar um controller a seguinte:
1 zf create controller NOME_DO_CONTROLLER 1 NOME_DO_MODULE

NOTAA linha de comando acima bem intuitiva, entretando o valor booleano 1 ficou deslocado. Ele significa que queremos criar a estrutura de arquivos views Como vamos Utilizar uma estrutura modular e criar os comandos atravs do ZF Tool, cada controller criado dentro do Module ir prefixar a class do controller com Default_. Isto acontece porque como vrios mdulos podem ter controladores com o mesmo nome, esta distino permitir que o zend carregue o arquivo correto. Com o ZF Tool aberto digite:
1 zf create controller index 1 default

e
1 zf create controller error 1 default

Isto criar os arquivos IndexController e ErrorController j com suporte mdulos. Deixe o mdulo admin como est. O objetivo dele por enquanto meramente ilustrativo, mais adiante veremos como manipul-lo. Modifique o contedo do arquivo Error Controller para:
1 class Default_ErrorController extends Zend_Controller_Action 2{ 3 4 5 6 7 public function errorAction() { $errors = $this->_getParam('error_handler'); public function init() {}

8 9 10 11 12 13 14 15 switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: // 404 error -- controller or action not found $this->getResponse()->setHttpResponseCode(404); $priority = Zend_Log::NOTICE; $this->view->message = 'Page not found'; break; default: // application error $this->getResponse()->setHttpResponseCode(500); $priority = Zend_Log::CRIT; $this->view->message = 'Application error'; break; } } if (!$errors) { $this->view->message = 'You have reached the error page'; return;

16

17 18 19 20 21 22 23 24 25 26 27 28 29 30

31 32 33

// Log exception, if logger available if ($log = $this->getLog()) { $log->log($this->view->message, $priority, $errors>exception); $log->log('Request Parameters', $priority, $request>getParams()); }

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

// conditionally display exceptions if ($this->getInvokeArg('displayExceptions') == true) { $this->view->exception = $errors->exception; }

$this->view->request }

= $errors->request;

public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if (!$bootstrap->hasResource('Log')) { return false; } $log = $bootstrap->getResource('Log'); return $log; }

54 }

55

E crie o Action error para o controller Error:


1 zf create action error Error 1 default

Mais abaixo voc tem uma explicao melhor sobre estes comandos. Abra o arquivo gerado /modules/default/views/scripts/error/error.phtml e insira o conteudo abaixo:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Zend Framework Default Application</title>

6 </head> 7 <body> 8 9 10 11 12 13 14 15 16 17 18 <h3>Stack trace:</h3> </p> <h3>Exception information:</h3> <p> <b>Message:</b> <?php echo $this->exception->getMessage() ?> <?php if (isset($this->exception)): ?> <h1>An error occurred</h1> <h2><?php echo $this->message ?></h2>

19 20 21 22 23 24 25

<pre><?php echo $this->exception->getTraceAsString() ?> </pre>

<h3>Request Parameters:</h3> <pre><?php echo var_export($this->request->getParams(), true) ?> </pre> <?php endif ?>

26 </body> 27 </html>

Digite qualquer coisa errada no seu url do projeto e veja que este arquivo ser utilizado. Ento voc poder modific-lo de acordo com suas necessidades visuais. IMPORTANTEAPAGUE as pastas /application/controllers e /application/views. O mtodo init() Se voc j havia analisado anteriormente quando criamos o projeto na primeira parte, voc notou que foi gerado automaticamente dentro da Classe IndexController o mtodo init() e o mesmo aconteceu com o ErrorController. Este mtodo est ai por um motivo muito especial. Todo o cdigo que queremos que seja inicializado em todos os actions da aplicao podero ser colocados ai, tais como: Configuraes globais, Variveis templae para o View, Chamada para Models, etc. Ento o Zend gera ele automaticamente para ns, assim como o indexAction().

Criando os Actions para as Pginas do Site


A lgica para criar um action a seguinte:
1 zf create action NOME_DO_ACTION NOME_DO_CONTROLLER 1 NOME_DO_MODULE

O valor booleano 1 indica que queremos que o ZF Tool crie o arquivo .phtml. Como nosso site um site simples, vamos criar as pginas bsicas:

Home que j existe Quem Somos Produtos Servios Contato

Como vamos criar as pginas e futuramente voc vai aprender como criar Routes com o Zend, vamos cri-las a partir do Controller Index, pois por se tratar de um site, toda seo ser secundria Home do site. Caso voc fosse criar um Breadcrumb esta lgica faria mais sentido. Voc est aqui: Home Voc est aqui: Home -> Quem Somos Voc est aqui: Home -> Produtos Voc est aqui: Home -> Servios Voc est aqui: Home -> Contatos Caso voc queira produzir um site com mais subsees, voc poder projetar em cima de outros Controllers, mas por ora, o que vamos aprender basta. Ainda na pasta do projeto que acessamos anteriormente, digite os comandos para criar as actions. NOTA: digite ENTER aps cada linha abaixo:
1 zf create action quemSomos Index 1 default 1 zf create action servicos Index 1 default 1 zf create action produtos Index 1 default 1 zf create action contato Index 1 default

Abra o arquivo /application/modules/default/IndexController.php e veja que foram adicionados mtodos correspondendo com os actions que criamos acima. Justamente por ser o controller Index que ir controlar as aes de nosso site que eles foram criados dentro deste arquivo. Para cada action criado, um arquivo /modules/NOME_DIR_DO_MODULO/NOME_DIR_CONTROLLER/NOME_DO_A CTION.phtml criado. Os comandos acimas iro gerar a estrutura:

/application/modules/views/scripts/index/quem-somos.phtml /application/modules/views/scripts/index/servicos.phtml /application/modules/views/scripts/index/produtos.phtml /application/modules/views/scripts/index/contato.phtml

LEMBRANDO: Preste ateno nos comandos acima, e note que utilizamos 1 default no final. Fizemos isto para indicar que queremos que o Zend crie NO

SOMENTE os mtodos actions dentro do controller MAS TAMBM as pastas e os arquivos dentro do mdulo default. CURIOSIDADESe voc deseja criar nomes de action tal como quem-somos, resultado-busca, etc. Que so separados por hfen, voc deve unir as palavras do nome desejado e Capitalizar cada palavra dentro da string. Este foi o nosso caso, onde utilizamos quemSomos para criar o action quem-somos. CURIOSIDADE: Se voc no quiser prefixar as classes do mdulo default, basta abrir o arquivo /application/config/application.ini e modificar o valor da linha:
1 resources.frontController.params.prefixDefaultModule = "1"

para
1 resources.frontController.params.prefixDefaultModule = "0"

No entanto, quando voc for criar outro controller no mdulo default, o ZF Tool ir adicionar o Prefixo e o controlador de erros ir disparar um erro informando que a classe no existe. Ento melhor utilizar o Prefixo.

Testando os actions
Voc pode testar agora atravs dos URLs:

http://zend.localhost/index/index http://zend.localhost/index/quem-somos http://zend.localhost/index/servicos http://zend.localhost/index/produtos http://zend.localhost/index/contato

Note que estamos utilizando index em todos os urls. Ns gostaramos de algo como:

http://zend.localhost/home http://zend.localhost/quem-somos http://zend.localhost/servicos http://zend.localhost/produtos http://zend.localhost/contato

Na prxima parte de nosso tutorial, vamos descobrir como fazer isto atravs de Routes.

Criando um Controller Sitemap?


Criar um Controller to facil quanto criar um action. A lgica a seguinte:

1 zf create controller NOME_DO_CONTROLLER 1 NOME_DO_MODULE

Vamos criar um constroller bem peculiar que futuramente utilizaremos para rastreamento de nosso site. Aps aprender a utilizar Routes iremos criar um arquivo sitemap.xml chamado diretamente pelo URL http://zend.localhost/sitemap.xml Para criar o controller digite:
1 zf create controller sitemap 1 default

Este comando criar o arquivo /modules/default/controllers/SitemapController.php e o arquivo /modules/default/view/scripts/sitemap/index.phtml. NOTA Novamente aqui preste ateno em 1 default. Estes parametros tem a mesma funo que a vista anteriormente para o Action: criar as pastas e arquivos. Quando criamos um novo controller, por padro o ZF Tool cria o View para o action index. Confira dentro da pasta /application/modules/default/controllers/ que foi criado o arquivo SitemapController.php e foi criado o arquivo /application/modules/default/view/scripts/sitemap/index.phtml. DICA: Crie outros projetos testes com o ZF Tool e teste a criao de Actions e Controllers.

Concluso
Nesta parte do tutorial voc aprendeu os conceitos mais importantes e fundamentais sobre o Zend Framework. Aprendeu como utilizar o ZF Tool para criar modules, actions e controllers. Nas prximas parte vamos aprender como criar Routes, Layouts, Forms e criar um Model para registrar nossos contatos no banco de dados e vamos aprender a enviar emails com o Zend Framework. At a prxima. Abrao do Giba!

[ Tutorial ] Zend Framework Parte 03


6 de dezembro de 2011Tutorial, Zend Frameworkapplication.ini. layout, route, script, template, Tutorial, view, Zend Framework Routes, Layout, View

Sumrio
Continuando com o nosso projeto disponvel nas partes anteriores deste tutorial em minha pgina Zend Framework, nesta parte do tutorial vamos aprender como criar Routes, uma forma prtica de redirecionar sua aplicao para as mais diversas situaes, entre elas, quando alguma pgina mudou de lugar na sua aplicao. E seguindo a solicitao de alguns leitores, como criar trabalhar com Layouts e aprender o conceito bsico de View.

Clique aqui para ver todos os tutoriais disponveis Agora que voc j sabe como trabalhar com mdulos, actions e controllers e respondendo a uma pergunta dos amigos que utilizaram meus tutoriais como fonte de aprendizado, ai vai a resposta: Pergunta: A maioria dos tutoriais na internet no utiliza ou cita Mdulos, preciso mesmo utilizar Mdulos? Resposta: No. No precisa! Mas seria uma perca de tempo e recursos. O objetivo deste tutorial fornecer algo mais slido e prximo de um projeto real para o desenvolvedor que deseja realizar projetos ousados. A pergunta acima foi feita por vrios desenvolvedores que entraram em contato nas ltimas 2 semanas depois que atualizei os tutoriais e achei interessante cit-la.

Routes
O que so Routes? Rotas, do ingls! O Leitor deve estar perguntando se eu estou tirando da cara dele. Mas no! Normalmente, as palavras bem definidas fazem com que fixemos o objetivo e no criemos confuso antecipada. Uma rota um ponto de acesso ou trajeto definido e delimitado aps uma experincia ou anlise prvia. No Zend, o processo de pegar o ponto final de URI, decompor o mesmo, e definindo qual mdulo, controller, action dever servexecutado na solicitao ( request ). O Roteamento ocorre somente uma vez quando uma solicitao feita; antes do controller ser chamado. Utilizando Routers Existem duas formas fundamentais de se criar Routes com o Zend. A primeira atravs do arquivo application.ini e outra atravs de um dos 6 tipos:

Zend_Controller_Router_Route Zend_Controller_Router_Route_Static Zend_Controller_Router_Route_Regex Zend_Controller_Router_Route_Hostname Zend_Controller_Router_Route_Chain Zend_Controller_Router_Rewrite

Por questes de praticidade, eu sempre utilizo a primeira, pois a equipe do Zend criou uma interface que faz todo o trabalho para voc direto no arquivo de configurao. Routes no so o tipo de coisa que voc deve se preocupar demais num projeto, sem desprezar sua importncia, claro, por isto a sacada foi boa! E seria perca de tempo se matar digitando um monte de cdigo PHP quando voc pode fazer o mesmo com algumas linhas no arquivo de configurao, e se isto existe para isto que foi criado. Mais adiante, veremos como programar Routes, utilizando o batalho de classes acima, mas por hora vamos entender como as coisas funcionam no arquivo de configurao. Anteriormente na Parte 02 Ns criamos o controlador index automaticamente anteriormente no momento da criao do projeto, e depois alguns actions que resultaram nos URLs:

http://zend.localhost/index/index http://zend.localhost/index/quem-somos http://zend.localhost/index/servicos http://zend.localhost/index/produtos http://zend.localhost/index/contato

Mas estas URLs com index no ficaram legal. Ns poderamos ter criado um controlador para cada caso: QuemSomos, Servicos, Produtos e Contato Mas necessariamente, no faria sentido, a menos que cada pgina do site tivesse subpginas, algo do tipo. Produtos -> Categorias Produtos -> Resultados PRodutos -> Ver Etc Por questes de aprendizagem de Refatorao do Projeto, mais adiante ns modificaremos a funcionalidade da seo Produtos de nosso site a fim de corresponder com nossas necessidades, mas por ora, ele apenas uma pgina que lista os tipos de produtos, ou uma ao dentro do controlador index. O que ns atualmente queremos algo do tipo:

http://zend.localhost/home

http://zend.localhost/quem-somos http://zend.localhost/servicos http://zend.localhost/produtos http://zend.localhost/contato

Que o que vamos fazer agora! Abra o seu arquivo /application/configs/application.ini e procure pela seo [production]. Cole as linhas abaixo:
1; 2 [production] 3 resources.router.routes.home.route = /home 4 resources.router.routes.home.defaults.module = default 5 resources.router.routes.home.defaults.controller = index 6 resources.router.routes.home.defaults.action = index

Vamos entender o que aconteceu. A primeira linha define o que dever ser chamado, no nosso caso home:
1 resources.router.routes.home.route = /home

A segunda linha define o module, no nosso caso default que o modulo padro:
1 resources.router.routes.home.defaults.module = default

A terceira linha define o controller (index) :


1 resources.router.routes.home.defaults.controller = index

E a quarta define o action (index) :


1 resources.router.routes.home.defaults.action = index

Repare na estrutura e veja que somente foi modificada a ltima parte de cada linha (module|controller|action). A lgica esta: resources.router.routes.NOME_DA_ROTA.MODULO.CHAVE = VALOR O NOME_DA_ROTA dever ser nico para cada rota, como veremos mais abaixo. O MODULO, apesar de ser default em nossa aplicao, para este caso dever ser passado como defaults. Agora voc pode testar: http://zend.localhost/home

Que seria o mesmo que: http://zend.localhost/ ou http://zend.localhost/index/index Se voc no entendeu, releia. Se entendeu vamos fazer o mesmo para as prximas pginas de nosso projeto:
1; 2 [production] 3 ; home 4 resources.router.routes.home.route = /home 5 resources.router.routes.home.defaults.module = default 6 resources.router.routes.home.defaults.controller = index 7 resources.router.routes.home.defaults.action = index 8 9 ;quemsomos 10 resources.router.routes.quemsomos.route = /quem-somos 11 resources.router.routes.quemsomos.defaults.module = default 12 resources.router.routes.quemsomos.defaults.controller = index 13 resources.router.routes.quemsomos.defaults.action = quem-somos 14 15 ;servicos 16 resources.router.routes.servicos.route = /servicos 17 resources.router.routes.servicos.defaults.module = default 18 resources.router.routes.servicos.defaults.controller = index 19 resources.router.routes.servicos.defaults.action = servicos 20 21 ;produtos 22 resources.router.routes.produtos.route = /produtos 23 resources.router.routes.produtos.defaults.module = default 24 resources.router.routes.produtos.defaults.controller = index 25 resources.router.routes.produtos.defaults.action = produtos 26 27 ; contato 28 resources.router.routes.contato.route = /contato 29 resources.router.routes.contato.defaults.module = default 30 resources.router.routes.contato.defaults.controller = index 31 resources.router.routes.contato.defaults.action = contato

IMPORTANTE: Note que nomeamos cada rota e alteramos as primeiras e quartas linhas de cada bloco. Agora voc pode acessar cada pgina:

http://zend.localhost/home http://zend.localhost/quem-somos http://zend.localhost/servicos

http://zend.localhost/produtos http://zend.localhost/contato

Fcil no? Mais adiante veremos como passar parametros e como recuper-los.

Layouts
Conforme solicitado pelos amigos leitores, vou ensinar nesta terceira parte sobre Layouts. O que um Layout? De repente voc esteja acostuma com o termo tema, template, design, etc mas no tenha intimidade com layout. Um Layout basicamente uma estrutura hierrquica em sua aplicao que mantm partes de cdigo que se repetiro em todas ou algumas pginas da aplicao. Toda aplicao web composta por uma estrutura HTML padro que precisa ser mantida e normalmente o que muda de uma pagina para outra o contedo, e se mantm sempre o cabealho, rodap, laterais. Um Layout no Zend Framework parte do MVC e utiliza-se do ViewRenderer que oferece uma vasta gama de recursos que so carregados automaticamente para o objeto $view.

Enable Layout
No Zend Framework o Layout habilitado pelo ZF Tool, digitando a linha abaixo:
1 zf enable layout

Este comando criar uma pasta e um arquivo em /application/layouts/scripts/layout.phtml com a linha:


1 <?php echo $this->layout()->content; ?>

Esta linha carregar o conteudo do arquivo view script do action sendo chamado. Dentro do arquivo de configurao application.ini foi adicionada a linha:
1 resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

Acesse sua aplicao e veja que nada mudou. Agora modifique o arquivo layout.phtml para que o mesmo fique assim:
1 <html> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" 2 />

3 4 5 6 7 8 9 10

<title>Meu Projeto Zend Framework</title> <body> <div id="header">{Meu Cabealho aqui}</div> <div id="content"> <?php echo $this->layout()->content; ?> </div> <div id="footer">{Meu rodap aqui}</div> </body>

11 </html>

Acesse todas as pginas de nosso projeto e verifique que a estrutura se manteve a mesma. Ento se voc deseja criar alguma navegao no topo, lateral, rodap ou outros blocos de HTML voc poder faz-los neste arquivo. NOTA: No remova a declarao $this->layout()->content:
1 <?php echo $this->layout()->content; ?>

Do contrrio o contedo dos arquivos view no sero exibidos. Mais adiante veremos como adicionar Scripts e CSS e como criar uma esquema de temas.

Views e Templates
Outra coisa interessante no desenvolvimento web, alm de Layouts so as ferramentas de template. Existem vrias por ai tais como Smarty, PHP Template, etc eu mesmo at j fiz uma (risos). No Zend no h necessidade de se utilizar uma ferramenta de templates, pois o View faz isto.

O que o View?
O View uma classe que trabalha com a parte View que j aprendemos anteriormente ( no estou tirando de novo risos ), ou seja, ele existe para auxiliar a manter o view script (arquivos dos actions) separado dos arquivos Model e Controller. Ele oferece um sistema de Helpers, Filters e variveis escapadas. Um Exemplo para entender CASO: Voc deseja que determinados valores sejam carregados automaticamente em cada pgina, variando de acordo com o controlador e o action, no caso o valor da tag TITLE de cada pgina e o Titulo da pgina para identificar onde o usurio est. No nosso projeto, precisamos identificar cada pgina com ttulos distintos:
1 // pagina home 2 ...

3 <title>Seja Bem Vindo - Tutorial Zend</title> 4 ... 5 <h1>Seja Bem vindo</h1> 6 7 ... 8 9 // pagina quem-somos 10 ... 11 <title>Quem Somos - Tutorial Zend</title> 12 ... 13 <h1>Quem Somos</h1> 14 15 ... 16 17 /** 18 * E ASSIM POR DIANTE!!!! 19 */

Para fazermos isto, precisamos utilizar o View da seguinte forma: Abra o arquivo IndexController.php E insira as linhas dentro do mtodo indexAction():
1 ... 2 public function indexAction() 3{ 4 5 6} 7 ... $this->view->pageTitle = 'Seja Bem-vindo - Tutorial Zend'; $this->view->contentTitle = 'Seja Bem-vindo';

No arquivo view/scripts/index/index.phtml remova todo o contedo gerado automaticamente e coloque:


1 <h1><?=$this->contentTitle;?></h1>

Acesse a pgina home de nosso projeto e veja que o ttulo apareceu l. No entanto, ainda falta definir o TITLE de cada pgina, isto ser feito no arquivo layouts.phtml:
1 ... 2 <title><?= $this->pageTitle;?></title> 3 ...

Atualize a pgina e veja que agora o TITLE possui a string que definimos.

[NOTA] : Faa o mesmo dentro de cada mtodo action de nosso controlador para cada pgina modifique o arquivo view correspondente (quem-somos, servicos, produtos, contato). Em resumo isto: No action voc usa:
1 $this->view->CHAVE = VALOR;

E no view script (arquivo .html do action):


1 $this->CHAVE; // NOTE QUE NO H O view

Bom, vamos ficar por aqui. Mais adiante veremos muita coisa boa.

Resumo
Nesta terceira parte de nosso tutorial voc aprendeu o conceito fundamental de Routes e aprendeu como definir facilmente rotas no arquivo de configurao. Tambm aprendeu como habilitar Layout no Zend framework e modificou o arquivo gerado. Vimos como utilizar o View para trabalharmos com o paradigma de Templates. Nas prximas partes continuaremos e veremos pegar os parametros do URL e como obter valores via GET e POST atravs de Forms criados pelo Zend. Abrao do Giba!

[ Tutorial ] Zend Framework Parte 04


8 de dezembro de 2011Tutorial, Zend Frameworkapplication.ini, getParam, getRequest, router, Tutorial, Zend Framework

getRequest, getParam, Routes, Views

Sumrio
No a parte anterior de nosso tutorial vimos como criar Rotas, Layouts e aprendemos sobre Views. Vamos conhecer agora o Objeto Request e aprender como trabalhar com parametros do URL e fazer redirecionamentos baseados em parametros e rever o Layout e Views.

Clique aqui para ver todos os tutoriais disponveis

Objeto Request

Antes de prosseguirmos, vamos analisar brevemente um dos objetos mais utilizados pelo Zend, o Request. Este objeto um objeto de solicitao muito simples que passado entre as classes de roteamento, dispatchers e controladoras. Ele empacota os nomes dos modules, controllers, actions e parametros opcionais, assim como o resto das solicitaes do ambiente, quer seja HTTP, que o que nos interessa, e para os mais avanados e curiosos, CLI ou PHP-GTK. O objeto passado atravs de Zend_Controller_Front e est disponvel em toda aplicao atravs da chamada $this->getRequest() e pode ser usado da seguinte forma dentro de nossa aplicao:
1 // Como citado anteriormente, o mtodo init o melhor lugar 2 // para guardarmos configuraes e outras variveis globais 3 // aos nossos actions dentro de um controller 4 // por isto vamos testar nosso controller aqui 5 public function init() 6{ 7 8} $this->request = $this->getRequest();

A partir desta declarao podemos ento acessar vrios recursos, tais como Nome do Module, Nome do Controller, Nome do Action e obter os Parametros a partir do URL Vamos testar algumas funcionalidades bsicas e j aproveitar para relembrar o Views:
1 public function init() 2{ 3 4 5 6 7 8 // passamos alguns valores para o view $this->view->module = $this->request->getModuleName(); $this->view->controller = $this->request->getControllerName(); $this->view->action = $this->request->getActionName(); $this->request = $this->getRequest();

9}

Abra o arquivo /modules/default/view/scripts/index.phtml e adicione as linhas:


1 ... 2 <h2>Teste de Objeto Request</h2> 3 <strong>Modulo: </strong> <?= $this->module; ?> 4 <br /> 5 <strong>Controller: </strong> <?= $this->controller; ?> 6 <br /> 7 <strong>Action: </strong> <?= $this->action; ?>

Acesse o url do projeto e veja que apareceram as informaes que o Objeto Request definiu no View de nossa Aplicao. Agora voc comea a entender melhor o funcionamento do VC do MVC. O que aconteceu aqui foi uma lgica de negcio processada pelo Controller e passada ao View no arquivo de apresentao. E para verificar que o mtodo init() est disponvel em todos actions de sua aplicao faa o mesmo com o action servicos. Abra o arquivo /modules/default/view/scripts/servicos.phtml e adicione as linhas:
1 ... 2 <h2>Teste de Objeto Request</h2> 3 <strong>Modulo: </strong> <?= $this->module; ?> 4 <br /> 5 <strong>Controller: </strong> <?= $this->controller; ?> 6 <br /> 7 <strong>Action: </strong> <?= $this->action; ?>

Acesso o url do action http://zend.localhost/servicos Como voc pode ver, os valores passados no mtodo init() para o View permaneceram disponveis e somente houve uma alterao no valor de action, pois o module e o controller continuam os mesmos.

Obtendo Parmetros do URL


Como estamos utilizando MVC seria interessante obtermos valores diretamente do URL para operaes bsicas. Vamos fazer uma simulao aqui. Suponhamos que voc tenha produtos na pgina produto que gostaria de acessar pelo ID, que tradicionalmente seria algo do tipo: http://zend.localhost/produtos?id=1 No nosso caso, para algo mais interessante, queremos aproveitar a deixa dos famosos URLs limpos e MVC, ento gostaramos de algo assim: http://zend.localhost/produtos/id/1 Para fazer isto basta construir o URL deste tipo e obter os parmetros atravs do objeto Request pelo mtodo getParam(CHAVE). Como j vimos anteriormente, o zend entende o URL da seguinte maneira: URL/MODULE/CONTROLLER/ACTION/PARAMETRO1/VALOR1/PARAMETRO 2/VALOR2/etc Ento, no URL http://zend.localhost/produtos/id/1 ID um parametro com a chave id. Vamos utilizar o action produtos para tal simulao e, como no estamos trabalhando com banco de dados ainda, vamos criar um vetor simples contendo alguns produtos:
1 public function produtosAction() 2{ 3 4 5 6 7 8 9 10 11 ), ), 2 => array( 'nome' => 'Celular', 'descricao' => 'Descrio do Celular aqui' $produtos = array( 1 => array( 'nome' => 'TV', 'descricao' => 'Descrio da TV aqui'

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 }

3 => array( 'nome' => 'Notebook', 'descricao' => 'Descrio do Notebook aqui' ), 4 => array( 'nome' => 'Aparelho de Som', 'descricao' => 'Descrio do Aparelho de Som aqui' ), );

$id = $this->request->getParam( 'id' );

if( $id != false ) : // vamos definir os valore encontrados nas chaves do vetor // e passar os mesmos para o View a fim de obter // estes valores no arquivo produtos.phtml $this->view->nome = $produtos[$id]['nome']; $this->view->descricao = $produtos[$id]['descricao']; endif;

Abra o aquivo produtos.phtml dentro da pasta dos views e insira o cdigo abaixo:
1 <h1><?= $this->contentTitle; ?> 2 <?php if( $this->id != '' ) : ?> 3 <h2><?= $this->nome; ?></h2>

4 <div> 5 <?= $this->descricao; ?>

6 </div> 7 <?php endif; ?>

Se voc acessar o URL http://zend.localhost/produtos?id=1, voc vai receber uma bela mensagem de erro informando que a pgina no existe e que o controlador produtos no existe. Neste caso, como vimos o Zend ir entender o URL da seguinte forma:
1 array ( 2 3 4 5) 'controller' => 'produtos', 'action' => 'id', 'module' => 'default',

Para resolver isto teramos que chamar: http://zend.localhost/index/produtos/id/1 O que nos fez voltar ao maldito index no URL novamente. Ento a soluo seria criar um Route para este padro de URL. No arquivo application.ini no final do bloco de Routes que criamos anteriormente adicione as linhas:
1 ;produtos/id/ 2 resources.router.routes.produtosId.route = /produtos/id/:id 3 resources.router.routes.produtosId.defaults.module = default 4 resources.router.routes.produtosId.defaults.controller = index 5 resources.router.routes.produtosId.defaults.action = produtos

Atualizado em 16/12/2011: produtosId deve ser o nome do novo roteamento. Atualizado em 16/12/2011: Cdigo-fonte para download nas partes 5 e 6.

Acesse o URL http://zend.localhost/produtos/id/1 e veja que est acessando agora! NOTA: Voc precisa passar um novo nome para o roteamento de produtos atravs do ID, no caso, eu nomeei produtosId mas poderia ser qualquer coisa. Lembre-se de sempre dar nomes NICOS para cada roteamento, mesmo que sejam 100 roteamos envolvendo o mesmo controller, todos precisaro ter um nome nico. IMPORTANTE O que voc passar para resources.router.routes.produtosId.route Ser o que o Zend ir aceitar no URL e o :id o nome do parametro que queremos passar para o controller. Poderia ser qualquer coisa, e esta seria a chave que obteramos em : $this->request->getParam( CHAVE ); Ento, se quisermos podemos eliminar totalmente a chave do URL e ficarmos com algo do tipo: http://zend.localhost/index/produtos/1 Bastaria modificar o roteamento para:
1 ;produtos/:id 2 resources.router.routes.produtos.route = /produtos/:id 3 resources.router.routes.produtos.defaults.module = default 4 resources.router.routes.produtos.defaults.controller = index 5 resources.router.routes.produtos.defaults.action = produtos

Mas para fins didticos, vamos ficar com o /produtos/id/:id e no /produtos/:id Voc pode colocar inmeros parametros num redirecionamento tal como:
1 ;/produtos/fab/:fabricante/cat/:categoria/marcar/:marca/mod/:modelo/c or/:cor/

resources.router.routes.produtos.route = 2 /produtos/fab/:fabricante/cat/:categoria/marcar/:marca/mod/:modelo/co r/:cor/ 3 ...

Ou simplesmente:
1 2 ;/produtos/:fabricante/cat/:categoria/marcar/:marca/mod/:modelo/cor/: cor/ resources.router.routes.produtosEx.route =

/produtos/:fabricante/:categoria/:marca/:modelo/:cor/ 3 ...

Concluso
Nesta parte de nosso tutorial conheceu o Objeto Request e aprendeu como obter parametros a partir do URL e como criar um redirecionamento baseado nestes parametros. Na prxima parte veremos como criar Forms e enviar emails com o Zend_Mail. Abraos do Giba!

[ Tutorial ] Zend Framework Parte 05


10 de dezembro de 2011Tutorial, Zend Frameworkformularios, post, Tutorial, validao, Zend Framework, zend_mail Formulrios, Zend_Mail

Sumrio
Na parte anterior vimos o Objeto Request e aprender como trabalhar com parametros do URL e fazer redirecionamentos baseados em parametros e fizemos uma revisita no Layout e Views. Vamos aprender agora como criar Forms e enviar emails utilizando o Zend_Mail.

Clique aqui para ver todos os tutoriais disponveis e Aqui para baixar os arquivos do projeto usados neste tutorial

Formulrios
Criar formulrios com o Zend relativamente muito fcil. Voc deve estar se questionando o que este assunto tem de importante, pois voc melhor do que ningum sabe como criar formulrios em HTML e PHP, ou atm mesmo utiliza alguma classe que gera formulrios para voc. Bom, este tema muito importante em todos os casos, pois alm de gerar os formulrios voc pode integrar os formulrios gerados pelo Zend de diversas formas e realizar validaes, filtragens de dados, autenticao tudo de uma forma natural sem sobrecarregar a aplicao Criando Formulrios com o Zend Framework

Para entender, nada melhor que colocar a mo na massa. Ento vamos l. Abra o seu prompt de comando ou terminal e acesse a pasta de nosso projeto. Digite o comando:
1 zf create form contato

A linha de comando acima ir criar um arquivo chamado Contato.php contendo uma classe Application_Form_Contato dentro da pasta /application/forms/ IMPORTANTE: possvel trabalhar com formulrios distintos por mdulos. Entretanto, como o mesmo envolve muitas configuraes, e possui alguns bugs, vamos criar o formulrio da maneira mais simples. O arquivo gerado pelo ZF Tool contem o nome da classe que extendida de Zend_Form e o mtodo init() que tem a mesma finalidade vista para os Controllers. /application/forms/Contato.php
1 <?php 2 3 class Application_Form_Contato extends Zend_Form 4{ 5 6 7 8 9 10 11 12 } public function init() { /* Form Elements & Other Definitions Here ... */ }

Para testar o formulrio gerado pelo ZF Tool, abra o arquivo IndexController.php do mdulo default. Vamos criar um view que disponibilizar o formulrio no nosso arquivo script views/scripts/index/contato.phtml do mdulo default. Para chamar o objeto instanciamos desta forma no controlador: /application/modules/default/controllers/IndexController.php
1 ... 2 public function contatoAction 3{ 4 5 6} $form = new Application_Form_Contato(); $this->view->form = $form;

7 ...

e no arquivo view contato.phtml coloque em qualquer lugar a sentena:


1 <?= $this->form; ?>

IMPORTANTE:Na parte 03 eu no coloquei a rota para a pgina contato no arquivo de configurao. Se voc est seguindo este tutorial a risca e for testar agora, vai receber um erro, ento logo abaixo das linhas onde configuramos as rotas, insira as linhas:
1 resources.router.routes.contato.route = /contato 2 resources.router.routes.contato.defaults.module = default 3 resources.router.routes.contato.defaults.controller = index 4 resources.router.routes.contato.defaults.action = contato

Agora abra a pgina http://zend.localhost/contato e voc no ver nada ( risos ). Claro! No criamos nenhum elemento ainda. Mas para fins de curiosidade, veja o cdigo-fonte. Repare que o Zend criou a tag FORM com alguns atributos mais uma tag DL:
<form enctype="application/x-www-form-urlencoded" action="" method="post"><dl class="zend_form"> 2 </dl></form> 1

Formulrio de Contato
Vamos ento definir atributos para nosso formulrio e adicionar elementos. Como o objetivo deste tutorial ser didtico, vamos criar um formulrio contendo um exemplo dos elementos HTML que mais utilizamos em formulrios.

radio [tratamento] input [nome, email] select [assunto] textarea [mensagem] checkbox [newsletter] submit [enviar]

Para criar os elementos do formulrio, claro, teremos que digitar (risos). Atributos da tag FORM Antes de criamos os elementos, precisamos definir os atributos do formulrio em si, tais como:

method action name id

enctype - embora no vamos fazer uploads e podemos utilizar o gerado pelo Zend, vou deixar a dica

Vou deixar os comentrios dentro do cdigo abaixo para no saturar o texto do tutorial, ento analise o cdigo abaixo.
1 <?php 2 class Default_Form_Contato extends Zend_Form 3{ 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 } } /********************************************** * As definies abaixo so opcionais * e dependem de peculiaridades de seu FORM *********************************************/ $this->setAttrib('enctype', 'multipart/form-data'); /** * Vai gerar o atributo/valor id="form-contato" */ $this->setAttribute( 'id', 'form-contato' ); /******************************************* * As definies abaixo so obrigatrias * todo formulrio deve conter *******************************************/ /** * Vai gerar o atributo/valor name="contato" */ $this->setName( 'contato' ); /** * Vai gerar o atributo/valor action="/contato" */ $this->setAction( '/contato' ); /** * Vai gerar o atributo/valor method="post" */ $this->setMethod( 'post' ); public function init() {

NOTA: Como voc deve ter notado todas as definies foram feitas dentro do mtodo init(). Vamos criar os elementos agora. Analise o cdigo abaixo, creio que ele seja bem intuitivo em relao ao qual campo do formulrio estamos criando:

1 class Application_Form_Contato extends Zend_Form 2{ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 ) ); branco 'Dvidas' => 'Dvidas', 'Elogios' => 'Elogios', 'Reclamaes' => 'Reclamaes', 'Outros' => 'Outros', $assunto = new Zend_Form_Element_Select( 'assunto' ); $assunto->setLabel('Assunto') ->addMultiOptions( array( '' => ' - - Escolha um assunto - - ', // em $email = new Zend_Form_Element_Text( 'email' ); $email->setLabel( 'E-mail' ); $nome = new Zend_Form_Element_Text( 'nome' ); $nome->setLabel( 'Nome' ); ) ) ->setValue('Pelo Nome'); /** * Elementos do formulrio */ $tratamento = new Zend_Form_Element_Radio('tratamento'); $tratamento->setLabel('Como gostaria de ser atendido?') ->addMultiOptions( array( 'Voc' => 'Voc', 'Sr(a).' => 'Sr(a)', 'Pelo Nome' => 'Pelo Nome', public function init() { /** * Definies para o FORM */ $this->setName( 'contato' ); $this->setAction( '/contato' ); $this->setMethod( 'post' ); $this->setAttrib( 'enctype', 'multipart/form-data' ); $this->setAttrib( 'id', 'form-contato' );

45 46 47 48 $newsletter = new Zend_Form_Element_MultiCheckbox( 'newsletter' ); $newsletter->setLabel('Gostaria de Assinar Nosso 50 Newsletter?') 49 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 } } ) ); $submit = new Zend_Form_Element_Submit( 'submit' ); $submit->setLabel( 'Enviar' ); $this->addElements( array( $tratamento, $nome, $email, $assunto, $mensagem, $newsletter, $submit ) ) ->setValue( 'Nenhum' ); ->addMultiOptions( array( 'Tecnologia' => 'Tecnologia', 'Entretenimento' => 'Entretenimentos', 'Curiosidades' => 'Curiosidades', 'Produtos' => 'Produtos', 'Nenhum' => 'No quero receber' $mensagem = new Zend_Form_Element_Textarea( 'mensagem' ); $mensagem->setLabel( 'Mensagem' );

Salve o arquivo e abra novamente a pgina de contato. Veja que o formulrio apareceu.

Entendendo o cdigo
Como voc pode ter notado, para cada elemento existe uma classe correspondente que chamamos atravs de
1 $nome_do_elemento = new Zend_Form_Element_<TIPO_DO_ELEMENTO>( VALOR_DO_ATRIB_NAME );

O prottipo acima deixa bem claro o que cada coisa significa. Para cada elemento existem disponveis vrios mtodos. Em todos elementos utilizamos setLabel() que define o texto que o usurio ver na tela a fim de identificar o campo em questo. [IMPORTANTE]Para elementos do tipo Submit e Button, o setLabel() funciona como o atributo value do elemento, como o caso do boto Enviar que no possui Label, mas utilizamos setLabel(Enviar). No caso de campos como Radio, Checkbox e Select utilizamos o mtodo addMultiOptions() para definir os valores desejados. Este mtodo espera que um array seja passado contendo CHAVE => VALOR, conforme definimos para os campos tratamento|assunto|newsletter. Para os elementos que precisam de um valor default quando o formulrio carregado, utilizamos setValue( VALOR ). Quando utilizado em elementos que o valor parte de um addMultiOptions(), ele sensvel ao caso, ou seja voc precisa passar EXATAMENTE o mesmo valor da chave, veja o caso do campo tratamento. Se colocassemos pelo nome ao invs de Pelo Nome, ele no definiria nada. Ele funciona como checked para checkboxes e radios e selected para selects. Para outros campos de valor nico funciona como value=ALGUM VALOR. E por fim, temos o mtodo addElements() do Zend_Form, que vai esperar um array contendo os objetos criados para cada elemento(campo) de nosso formulrio. Os valores passados so as prximas variveis, j que elas so os objetos. CURIOSIDADE Abra o cdigo-fonte da pgina contado e veja que o Zend adicionou algumas Marcaes HTML utilizando listas de definio. Outros elementos Alm dos elementos que criamos em nosso formulrio, tambm esto disponveis criar elementos:

button reset password hidden image captcha [captcha] apesar de no ser um elemento, atualmente utiliza-se muito e algo bem elaborado no Zend

Qual a Vantagem de se criar Formulrios com o Zend No momento voc pode estar pensando nisto, entretanto, apenas criamos o formulrio. Vamos ver agora como aplicar validao e filtros para entender o poder de se criar formulrios com o Zend.

Validando o Formulrio

Supondo que os campos nome|email|assunto|mensagem so obrigatrios e que os usurios poderiam passar cdigo malicioso aos nossos cdigos ou banco de dados atravs de nosso formulrio, interessante aplicar filtros e no caso de algum campo no ser enviado em branco, vamos informar que estes campos so obrigatrios. Modifique o cdigo:
1 ... 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 $mensagem = new Zend_Form_Element_Textarea( 'mensagem' ); $mensagem->setLabel( 'Mensagem' ) ->setRequired( true ) ->addValidator( 'NotEmpty' ) ->addFilter( 'StripTags' ) ->addFilter( 'StringTrim' ) ) ) ->setRequired( true ) ->addErrorMessage('Escolha o assunto'); branco 'Dvidas' => 'Dvidas', 'Elogios' => 'Elogios', 'Reclamaes' => 'Reclamaes', 'Outros' => 'Outros', $assunto = new Zend_Form_Element_Select( 'assunto' ); $assunto->setLabel('Assunto') ->addMultiOptions( array( '' => ' - - Escolha um assunto - - ', // em $email = new Zend_Form_Element_Text( 'email' ); $email->setLabel( 'E-mail' ) ->setRequired( true ) ->addValidator( 'NotEmpty' ) ->addFilter( 'StripTags' ) ->addFilter( 'StringTrim' ) ->addErrorMessage('Informe o seu email');

$nome = new Zend_Form_Element_Text( 'nome' ); $nome->setLabel( 'Nome' ) ->setRequired( true ) ->addValidator( 'NotEmpty' ) ->addFilter( 'StripTags' ) ->addFilter( 'StringTrim' ) ->addErrorMessage('Informe o seu nome');

39 40 ...

->addErrorMessage('Escreva uma mensagem');

Se voc executar o cdigo agora, no vai acontecer nada! Antes de fazer a coisa funcionar vamos explicar as linhas adicionadas aos elementos nome|email|assunto|mensagem. Preste ateno nos comentrios:
1 $nome = new Zend_Form_Element_Text( 'nome' ); 2 $nome->setLabel( 'Nome' ) 3 4 5 6 7 8 9 10 11 12 // Marca o campo como obrigatrio ->setRequired( true ) // No pode estar vazio ->addValidator( 'NotEmpty' ) // Remove TAGS HTML ->addFilter( 'StripTags' ) // Remove espaos brancos no inicio e fim ->addFilter( 'StringTrim' ) // Define uma mensagem de erro personalizada ->addErrorMessage('Informe o seu nome');

Existem vrios validadores e filtros entre os mais usados so os que voc viu acima, mas ainda existem vrios outros disponveis. No caso do email, alm dos que utilizamos para os outros campos, utilizamos:
1 addValidator('EmailAddress', true);

Obtendo os dados enviados Para que a validao ocorra de verdade preciso que o Zend envie o formulrio e faa algumas verificaes. Caso ele identifique o valor de um dos elementos no corresponde com a validao solicitada, ele volta para a pgina do formulrio e popula novamente o mesmo com os dados. Para fazer isto, abra o arquivo IndexController.php e dentro do mtodo contatoAction() insira o cdigo abaixo:
1 ... 2 public function contatoAction() 3 4 5 6 7 8 $dadosFormulario = $this->getRequest()->getPost(); $form = new Application_Form_Contato(); $this->view->form = $form; {

9 10 11 12 13 14 15 16 17 } 18 ... } if( $form->isValid( $dadosFormulario ) ) { } else { $form->populate( $dadosFormulario ); } if( $this->getRequest()->isPost() ) {

Entendendo o Cdigo Solicitao POST Tem bastante informao nova disponvel agora, mas creio ser fcil de entender. Todo o cdigo gira em torno de uma solicitao POST. Ao invs de utilizar $_POST o Zend oferece mtodos exclusivos para tal. Para obter os dados do Formulrio utilizamos o Objeto Request que j conhecemos junto com o mtodo getPost(). Este mtodo pega a solicitao POST realizada e guarda todos os valores passados pelo formulrio. Isto feito na linha:
1 $dadosFormulario = $this->getRequest()->getPost();

Para verificar se uma solicitao POST foi realizada o Objeto Request utiliza o mtodo isPost(). Na estrutura de controle onde verificamos se h uma solicitao POST h uma condio que verifica se os dados do formulrio correspondem com o que solicitamos ao Zend validar. Isto feito atravs do mtodo isValid(). 1 Se isValid() for verdadeiro, no acontece nada 2 Se for falso popula o formulrio novamente incluindo as mensagens de erros passadas pela validao.
1 ... 2 3 4 5 6 7 8 9 ... } if( $form->isValid( $dadosFormulario ) ) { } else { $form->populate( $dadosFormulario ); }

if( $this->getRequest()->isPost() ) {

Tente enviar o formulrio vazio e veja o resultado. As mensagens de erro apareceram logo abaixo do campo solicitado validao. Agora se voc preencher corretamente os dados ele vai mostrar o formulrio com todos os dados carregados novamente. Como boa prtica de programao web, sempre que voc enviar um formulrio e os dados estiverem preenchidos corretamente, voc deve redirecionar o usurio para outra pgina com alguma mensagem ou para a mesma pgina. Podemos redirecionar o usurio para outra pgina ou para a mesma utilizando:
1 if( $form->isValid( $dadosFormulario ) ) { 2 $this->_redirect( '/contato' ); 3 4 5} // ou // $this->_redirect( '/qualquer-pagina-com-mensagem' );

Seria interessante se fossemos notificados do contato ou salvssemos os dados no banco de Dados. Como este tutorial se estendeu demais sobre o assunto, vou terminar por aqui e vou pular para a parte de envio de emails com Zend_mail, deixando ai como dica e curiosidade para os mais metidos e ensinar como criar Models na prxima parte.

Concluso
Nesta parte de nosso tutorial voc aprendeu a criar Forms e enviar email utilizando o Zend_Mail. Na prxima parte de nosso tutorial vamos aprender como criar criar um sistema de autenticao utilizando Zend_Auth.

BONUS E-Mails com Zend_mail


IMPORTANTEEste procedimento somente disponvel em servidores locais configurados para enviar emails ou em servidores remotos. Voc no conseguir enviar email do localhost. Ento se voc dispe de um servidor dedicado, VPS, cloud, revenda, hospedagem, etc Crie um subdominio no seu site chamado zend e envie os arquivos por FTP e faa o teste abaixo. O Zend Dispe de uma ferramenta muito legal para envio de Emails. Ainda com o arquivo IndexController aberto no mtodo contatoAction(), adicione as linhas abaixo:
1 ... 2 public function contatoAction() 3 4 5 6 $form = new Application_Form_Contato(); $this->view->form = $form; {

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 $mail = new Zend_Mail('utf-8'); $mail->setBodyHtml( $html ); "; $subject = utf8_decode( "Contato pelo site por: " . $nome ); $html = " <html> <body> ".$conteudo." </body> </html> $to = 'contato@seusite.com'; ); $conteudo = sprintf(' Assunto: <STRONG>%s</STRONG><BR> <HR> Tratamento: <STRONG>%s</STRONG><BR> Nome: <STRONG>%s</STRONG><BR> E-mail: <STRONG>%s</STRONG><BR> Mensagem: <STRONG>%s</STRONG><BR> Newsletter: <STRONG>%s</STRONG><BR> ' , $assunto , $tratamento , $nome , $email , nl2br( $mensagem ) , implode(', ', $newsletter ) $tratamento = $form->getValue('tratamento'); $nome = $form->getValue('nome'); $email = $form->getValue('email'); $assunto = $form->getValue('assunto'); $mensagem = $form->getValue('mensagem'); $newsletter = $form->getValue('newsletter'); if( $form->isValid( $dadosFormulario ) ) { if( $this->getRequest()->isPost() ) { $dadosFormulario = $this->getRequest()->getPost();

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 } 68 ... } );

// poderia ser somente texto //$mail->setBodyText( $text ); $mail->setFrom( $email, $nome ); $mail->addTo( $to, 'Contato Site'); $mail->setSubject( $subject ); $mail->send();

$this->_redirect( '/contato' ); // ou // $this->_redirect( '/qualquer-pagina-com-mensagem' } else { $form->populate( $dadosFormulario ); }

Creio que o cdigo acima bem intuitivo. Abraos do Giba!

[ Tutorial ] Zend Framework Parte 06


14 de dezembro de 2011Tutorial, Zend Frameworkdb-table, delete, fetchrow, INSERT, model, update, Zend Framework, zend_db_table_abstract Models, CRUD, Zend_Db_Table

Sumrio
Na parte anterior aprendemos como criar Forms e enviar emails utilizando o Zend_Mail. Vamos agora aprender a trabalhar com banco de dados e ver o conceito de Models dentro do Zend Framework utilizando o DbTable e as operaes bsicas com o paradigma CRUD.

Clique aqui para ver todos os tutoriais disponveis e Aqui para baixar os arquivos do projeto usados neste tutorial

Models

Basicamente, quando falamos de Models falamos de Banco de Dados ou uma coleo de Mtodos dentro de uma Classe Model que permite agilizar processos relacionados a banco de dados. O Model manipulado pelo Controller e os dados retornados ficam disponveis para voc utilizar em qualquer lugar de sua aplicao. Apesar de Model estar relacionado com banco de dados, na verdade, qualquer operao que modele dados pode ser considerado um model, como por exemplo, uma classe de Manipulao de Imagens.

CRUD
Com o sistema de Models do Zend possvel criar um sistema CRUD facilmente, pois ele possui mtodos disponveis atravs da classe Zend_Db_Table_Abstract. Para quem no conhece o significado de CRUD, o mesmo um acrnimo para as quatro operaes bsicas em bancos de dados relacionais:

Create - Criar ou adicionar novas entradas Read (Retrived) Ler, recuperar ou ver entradas existentes Update - Atualizar ou editar entradas existentes Delete (Destroy) Remover entradas existentes

Criando o Model Para criar um Model basta digitar a linha de comando abaixo
1 zf create model NOME_DO_MODEL

Isto criar o arquivo NOME_DO_MODEL.php dentro da pasta /application/models. Mas para trabalhar com bancos de Dados e utilizar a class Zend_Db_Table_Abstract preciso adicionar o parametro db-table ao invs de model:
1 zf create db-table NOME_DO_MODEL NOME_TABElA_NO_BANCO

Isto criar uma pasta dentro de models chamada DbTable e dentro dela o arquivo NOME_DO_MODEL.php. Vamos ver isto na prtica criando o Model Usuario que vamos utilizar para criar nosso Sistema de Autenticao. Digite a linha abaixo:
1 zf create db-table Usuario usuarios

E acesse o arquivo gerado em /application/models/DbTable/Usuario.php. Ele deve conter:


1 class Application_Model_DbTable_Usuario extends Zend_Db_Table_Abstract 2{

3 4}

protected $_name = 'usuarios';

Como voc pode ver o ZF Tool criou uma classe Application_Model_DbTable_Usuario que estendida de Zend_Db_Table_Abstract e dentro da classe a propriedade $_name. Esta propriedade o nome da tabela no banco de dados que passamos na linha de comando. Voc pode alterar manualmente, caso precise futuramente. E tambm pode chamar $this->_name dentro dos mtodos para trocar de tabela caso necessrio.

Mtodos CRUD
O Zend_Db_Table_Abstract uma interface orientada a objetos para as tabelas do banco de dados. Ela oferece mtodos para muitas operaes comuns em tabelas. A classe extensvel, por isto fica fcil modificar e adaptar conforme nossas necessidades. Esta interface foi desenvolvida como implementao do Padro de Projeto Table Data Gateway e tambm inclui uma classe que implementa o Padro Row Data Gateway. Os mtodos mais comuns so:

insert() update() delete() find() fetchAll() fetchRow()

Ns poderamos utilizar diretamente estes mtodos ou inventar moda e criar mtodos do tipo:

getUsuario() addUsuario updateUsuario deleteUsuario

Mas para mantermos as coisas no lugar, vamos utilizar diretamente os mtodos da interface.

Conexo Com o Banco de Dados


Pois ! Antes de mais nada precisamos informar ao Zend como se conectar ao banco de dados. Isto algo fcil, relativamente. Para configurar uma conexo utilizaremos o nosso arquivo de configurao application.ini. Abra o arquivo e na seo [production] insira as linhas:
1 [production]

2 resources.db.adapter = "Pdo_Mysql" 3 resources.db.params.host = "localhost" 4 resources.db.params.username = "root" 5 resources.db.params.password = "" 6 resources.db.params.dbname = "tutorial-zend" 7 resources.db.params.charset = utf8

NOTA Creio que no preciso dizer para voc colocar as suas configuraes ai! As linhas acima so bem intuitivas, mas a mais interessante a primeira onde informamos ao Zend que vamos utilizar o PDO. Nesta linha est o poder da abstrao. Se amanh ou depois voc quiser trocar de banco de dados, basta modificar o valor de resources.db.adapter e voc no precisar fazer mais nada, caso voc tenha utilizado somente as interfaces do Zend para manipulao de banco de dados.

Utilizando o Zend Tools para configurar a Conexo Adicionado: 25/06/13


Voc tambm poderia utilizar o ZF para configurar a conexo com o banco de dados. Para tal, considerando as configuraes anteriores que voc colocou no application.ini, voc dever acessar o diretrio onde voc criou o projeto com o ZF e digitar a linha de comando:
zf configure db-adapter 1 "adapter=Pdo_Mysql&host=localhost&username=root&password=&dbname=tuto rial-zend&charset=utf8"

Ao executar o comando acima, o cdigo gerar todos os parametros de configurao que definimos manualmente antes. Note que todos os parametros de configurao so passados como se fosse um URL separado por &CHAVE=VALOR.

Tabela de Usurios
Antes de prosseguirmos com os experimentos, vamos criar a tabela que o zend ir se comunicar para realizar as operaes CRUD que vamos aprender logo abaixo. Eu utilizei o MySQL, mas se voc tem experiencia com outro banco de dados, sinta-se vontade para utilizar o mesmo. Apenas no modifique os nomes dos campos ainda, para que no haja incompatibilidades com os passos do tutorial.
1 CREATE TABLE IF NOT EXISTS `usuarios` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 4 5 6 `nome` varchar(120) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(120) NOT NULL, `login` varchar(120) NOT NULL, `senha` varchar(30) NOT NULL,

7 PRIMARY KEY (`id`) 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

IMPORTANTE: A tabela acima simples justamente para facilitar no aprendizado e no tomar tempo desnecessrio.

Mtodo insert()
Para inserir um novo registro utilizamos o mtodo insert() juntamente com um array contendo os campos da tabela e os valores a serem registrados. Administrao de Usurios Vamos ento criar agora um controller dentro do mdulo admin a fim de manipularmos os usurios de nossa aplicao. Abra o Prompt de Comando do DOS ou o Terminal, acesse a pasta do projeto e digite:
1 zf create controller usuario 1 admin

Esta linha de comando ir gerar os arquivos do Controller e View para UsuarioController. Vale a pena notar que o nome da classe apareceu agora prefixado com Admin_ e para acessar o nosso controller temos que utilizar admin ao invs de default.
1 class Admin_UsuarioController extends Zend_Controller_Action 2{ 3 4 5 6 7 8 9 10 11 12 13 } public function indexAction() { // action body } public function init() { /* Initialize action controller here */ }

Voc pode testar acessando: http://zend.localhost/admin/usuario. Neste caso, o action ser index e o controller usuario. Note que o layout carregado o mesmo do mdulo default. Por ora deixe como est, mais adiante veremos como trocar de layout. Feito isto, vamos informar ao zend que queremos utilizar nosso Model. Para tal, dentro do mtodo init() do Controller Usuario, vamos criar um objeto a partir de nossa classe Model.
1 ...

2 3 4 5 6 7 ...

public function init() { // No preciso explicar no eh? $this->_db = new Application_Model_DbTable_Usuario(); }

E para testar, vamos criar um action dentro do controller Usuario do mdulo Admin.
1 zf create action add usuario 1 admin

Creio que voc j sabe o que a linha acima significa! Feito isto, vamos criar o cdigo para controlar a criao de um novo usurio.
1 ... 2 public function addAction() 3 4 5 6 7 8 9 10 11 12 13 ... } ); $res = $this->_db->insert( $dados ); { $dados = array( 'id' => null, 'nome' => 'Z Ningum', 'email' => 'zeninguem@teste.com', 'login' => 'zeninguem', 'senha' => md5('123456'),

Fcil, n? Pois , ns criamos um array e passamos ele como valor para o mtodo insert(). Note que foi utilizado o tipo null para o campo id. Isto precisa ser feito assim para que o mtodo insert() retorne o ltimo ID inserido CASO voc precise. Como estamos utilizando uma interface, o Zend j se encarregou de fazer a conexo com o banco de dados que configuramos no arquivo de configurao. Para que a conexo acontea, basta chamar o Model desejado. Por isto que criamos a propriedade $_db em nossa classe controladora de usurios, para deixar a conexo disponvel em todo o controller. Acesse agora a pgina do action que criamos para processar o cdigo que criamos para inserir um novo usurio. O URL ficou assim: http://zend.localhost/admin/usuario/add Verifique no banco de dados que foi inserido um registro contendo as informaes passadas no vetor acima.

O Mtodo update()
Se voc gostaria de atualizar alguma informao, voc utilizar o mtodo update(). Este mtodo tambm precisar de um array contendo os campos e valores. Este mtodo espera que voc passe um ID e como estamos trabalhando com CRUD que normalmente somente atualiza um registro por vez, h uma limitao para este mtodo, que justamente funcionar somente para um registro por vez. Apesar de ter formas de atualizar mais de um registro utilizando o mtodo update(), mais interessante utilizar o mtodo query() do Zend_Db, conforme veremos mais adiante. NOTA: Ns poderamos utilizar um formulrio de cadastro para realizar estas operaes CRUD, mas vamos deixar para ver isto mais adiante na autenticao e controle de usurio, pois at l voc vai ter tempo para fuar e descobrir coisas sozinho. Para atualizar o nosso usurio vamos primeiro criar um novo action:
1 zf create action update usuario 1 admin

E no mtodo updateAction():
1 ... 2 public function updateAction() 3 4 5 6 7 8 9 10 11 12 13 ... $this->_db->update( $dados, 'id = 1' ); } ); { $dados = array( 'nome' => 'Seu Nome Aqui', 'email' => 'seu@email.com', 'login' => 'seu_login', 'senha' => md5('sua_senha'),

Modifique as informaes e abra a pgina: http://zend.localhost/admin/usuario/update. Verifique no banco de dados que as informaes foram atualizadas! Simples, n? O Mtodo update() possui um parmetro adicional que aceita o que seria as clausulas para filtrar a atualizao. Se voc no passar nada, ele exibir uma mensagem de Erro mas far a alterao em todas as linhas da tabela.

O Mtodo delete()

Para excluir um usurio to fcil quando as demais operaes, e o mtodo delete() aceita um nico parametro que deve conter o ID a ser excluido. Crie outro usurio teste para termos outro ID alm do 1 e no perdemos nosso querido usurio criado anteriormente. Feito isto, vamos criar o action para excluir este usurio.
1 zf create action delete usuario 1 admin

e no mtodo deleteAction():
1 ... 2 public function deleteAction() 3 4 { $this->_db->delete( 'id = 2' );

5 } 6 ...

Nem vou comentar! Muito fcil de entender!

O Mtodo fetchRow()
Para obter um resultado da tabela, ns utilizamos o mtodo fetchRow() e em casos mais especficos vamos chamar o mtodo select() que est disponvel dentro de nossa classe DbTable. Para listar um usurio, vamos criar um action:
1 zf create action list usuario 1 admin

E no mtodo listAction():
1 ... 2 public function listAction() 3 4 5 6 7 ... { $usuario = $this->_db->fetchRow( 'id = 1' ); $this->view->usuario = $usuario; }

Basicamente, o resultado foi passado para a varivel $usuario que vamos passar para o nosso View usuario a fim de recuperar as informaes no arquivo view script list.phtml. Abra o arquivo /modules/admin/views/scripts/usuario/list.phtml e insira o cdigo abaixo:
1 <h2>Informaes do Usurio</h2> 2 <table>

3 4 5 6 7 8 9 10 11 12 13 14

<tr> <th>Nome</th> <td><?= $this->usuario->nome; ?> </tr> <tr> <th>Login</th> <td><?= $this->usuario->login; ?> </tr> <tr> <th>E-mail</th> <td><?= $this->usuario->email; ?> </tr>

15 </table>

Acesse a pgina http://zend.localhost/admin/usuario/list e voc ver as informaes do usurio com ID 1 listadas na tela. NOTA: O mtodo fetchRow() retorna um objeto. Se voc desejar utilizar um array, faa a modelagem adicionando toArray(), conforme abaixo:
1 ... 2 $usuario = $this->_db->fetchRow( 'id = 1')->toArray(); 3 ...

Concluso
Nesta parte de nosso tutorial voc conhece o Zend_Db_Table_Abstract e aprendeu a trabalhar com banco de dados e a criar Models atravs do ZF Tool. Tambm aprendeu como realizar as operaes bsicas de um CRUD. Nas proximas partes vamos ver como criar um sistema de autenticao e conhecer outros mtodos de manipulao de banco de dados. isto a! Abraos do Giba!

Potrebbero piacerti anche