Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
O sustenido (#) indica cdigo comentado para o Apache, por isto no ser executado. Caso o seu esteja assim, remova o (#) da linha do include:
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!
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"
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
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/
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.
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!
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.
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.
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.
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 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
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
$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
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
<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().
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:
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:
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:
Note que estamos utilizando index em todos os urls. Ns gostaramos de algo como:
Na prxima parte de nosso tutorial, vamos descobrir como fazer isto atravs de Routes.
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!
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:
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:
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
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
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/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
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';
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;
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!
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.
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}
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.
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' ), );
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>
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/
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!
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 ...
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:
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 ...
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; {
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.
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();
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
3 4}
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:
Ns poderamos utilizar diretamente estes mtodos ou inventar moda e criar mtodos do tipo:
Mas para mantermos as coisas no lugar, vamos utilizar diretamente os mtodos da interface.
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.
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,
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 ...
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 ...
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!