Iniciando com Zend Framework

Embed Size (px)

Citation preview

  • 8/14/2019 Iniciando com Zend Framework

    1/19

    Iniciando com Zend FrameworkPor Rob Allen, www.akrabat.com

    Traduo: Adler Brediks Medrado, http://www.neshertech.net/adlerReviso do documento 1.3.0

    Copyright 2006, 2007

    Este tutorial pretende dar uma introduo bsica ao uso do Zend Framework atravs de umaaplicao baseada em bancos de dados.

    NOTA: Este tutorial foi testado com as verses 0.9 e 0.9.1 do Zend Framework. Existe umagrande chance de ser compatvel com verses posteriores, mas certamente no funcionarcom verses anteriores a 0.9.

    AVISO para a verso 0.9: Se voc fez o download da verso 0.9 do Zend Framework, entovoc precisar editar o arquivo library/Zend/Db/Table/Row/Abstract.php e adicionar Home Page

    Atravs do tempo de vida de uma aplicao, uma aplicao escrita desta forma se tornapassvel de difcil manuteno conforme o cliente continue requisitando mudanas que soincludas em diversos locais de seu cdigo.

    Um mtodo que melhora a manuteno de uma aplicao separar o cdigo de um arquivoem trs partes distintas (e normalmente arquivos separados):

    Model A parte de modelo de uma aplicao a parte que se preocupa com os dadosespecficos a serem mostrados. No cdigo de exemplo acima, o conceito de

    news. Dessa forma, model geralmente relacionado com a lgica denegcios de uma aplicao e administra o carregamento e o salvamento dedados em um banco de dados.

  • 8/14/2019 Iniciando com Zend Framework

    2/19

    View A view consiste em uma pequena parte da aplicao que responsvel emmostrar a informao ao usurio. Normalmente, o HTML.

    Controller O controller amarra o view e o model para garantir que as informaescorretas sejam mostradas na pgina.

    O Zend Framework usa a arquitetura Model-View Controller (MVC). Isto usado para separar

    as diferentes partes de sua aplicao para tornar o desenvolvimento e manuteno mais fcil.

    RequisitosO Zend Framework possui os seguintes requisitos:

    PHP 5.1.4 (or maior) Um servidor web que suporte a funcionalidade de mod_rewrite (reescrita de URLs).

    Este tutorial assume que esteja sendo utilizado o Apache.

    Obtendo o FrameworkO Zend Framework pode ser baixado de http://framework.zend.com/download/stable nosformatos .zip ou .tar.gz. No momento em que o tutorial era escrito, a verso 0.9 era a verso

    corrente. Voc precisa baixar a verso 0.9 para este tutorial funcionar.

    Estrutura de diretriosApesar de que o Zend Framework no designa uma estrutura de diretrio, o manualrecomenda uma estrutura comum. Esta estrutura assume que voc tenha controle completosobre a sua configurao do Apache, no entanto, ns queremos tornar a vida um pouco maisfcil, ento usaremos uma modificao.

    Comece criando um diretrio no diretrio raiz do servidor web chamado zf-tutorial. Isto significaque a URL que apontar para a aplicao ser: http://localhost/zf-tutorial.

    Crie os seguintes subdiretrios para receber os arquivos da aplicao:

    zf-tutorial//application

    /controllers/models/views

    /filters/helpers/scripts

    /library/public

    /images/scripts/styles

    Como voc pode ver, ns separamos diretrios para os arquivos de model, view e controller dasua aplicao.Imagens, scripts e arquivos CSS so guardados em diretrios separados sob o diretrio public.Os arquivos do Zend Framework sero colocados no diretrio library. Se ns precisarmosutilizar outras bibliotecas, elas podero ser colocadas l.

    Extraia o arquivo descarregado, no meu caso, ZendFramework-0.9.1-Beta.zip, para umdiretrio temporrio. Todos os arquivos foram colocados em um subdiretrio chamadoZendFramework-0.9.1-Beta. Copie o contedo de ZendFramework-0.9.1-Beta/library/Zend para zf-tutorial/library/. Seu diretriozf-tutorial/libraryagora deve conter um sub-diretrio chamado Zend.

    InicializandoO controller do Zend Framework, Zend_Controller projetado para dar suporte a websites com

  • 8/14/2019 Iniciando com Zend Framework

    3/19

    urls limpas. Para alcanar isso, todas as requisies precisam passar por um nico arquivochamado index.php, conhecido como bootstraper. Isto nos prov um ponto central para todasas pginas da aplicao e garante que o ambiente est configurado corretamente para rodar aaplicao. Ns alcanamos isso usando um arquivo .htaccess no diretrio raiz zf-tutorial:

    zf-tutorial/.htaccess

    RewriteEngine onRewriteRule .* index.php

    php_flag magic_quotes_gpc offphp_flag register_globals off

    A RewriteRule muito simples e pode ser interpretada como para qualquer url, redirecionepara index.php.Ns tambm setamos um par de diretivas php para segurana e sanidade. Estes valores jdeveriam estar setados corretamente no php.ini, mas ns queremos ter certeza disso. Note quea flag php_flag no .htaccess s funcionar se voc estiver usando mod_php. Se voc usaCGI/FastCGI, ento voc dever se certificar que o seu php.ini est correto.Porm, requisies para imagens, arquivos JavaScript e CSS no devero ser redirecionadospara o nosso arquivo de inicializao. Mantendo estes arquivos dentro do subdiretrio pblico,

    ns podemos facilmente configurar o Apache para servir estes arquivos diretamente com outroarquivo .htaccess em zf-tutorial/public :

    zf-tutorial/public/.htaccessRewriteEngine off

    Apesar de no ser estritamente necessrio, ns podemos adicionar mais um par de arquivos.htaccess para garantir que nossos diretrios application and library estejam protegidos:

    zf-tutorial/application/.htaccessdeny from all

    zf-tutorial/library/.htaccess

    deny from all

    Note que para que os arquivos .htaccess sejam usados pelo Apache Note that for .htaccess , adiretiva de configurao AllowOverride precisa estar setada como All no seu arquivo httpd.conf.A idia aqui apresentada de usar mltiplos arquivos .htaccess do artigo Blueprint for PHPApplications: Bootstrapping (Parte 2) de Jayson Minard. Eu recomendo a leitura das duaspartes.

    O arquivo de inicializao: index.phpO arquivo zf-tutorial/index.php o nosso arquivo de bootstrap e ns o iniciaremoscom o cdigo a seguir:

    zf-tutorial/index.php

  • 8/14/2019 Iniciando com Zend Framework

    4/19

    // run!$frontController->dispatch();

    Repare que ns no colocamos a tag ?> no final do arquivo porque isso no necessrio edeixar isso for a ir prevenir alguns erros difceis de debugar quando utilizar o redirecionamentovia funo header() caso exista algum espao em branco aps a tag ?>.

    Vamos percorrer o arquivo.

    error_reporting(E_ALL|E_STRICT);date_default_timezone_set('Europe/London');

    Estas linhas iro nos garantir que ns veremos qualquer erro que gerarmos (assumindo que adiretiva display_errors esteja como on). Ns tambm selecionamos nosso fuso-horriocorrente conforme requerido pelo PHP 5.1+. Obviamente voc deve escolher o seu fuso-horrio.

    set_include_path('.' . PATH_SEPARATOR . './library'. PATH_SEPARATOR . './application/models/'. PATH_SEPARATOR . get_include_path());

    include "Zend/Loader.php";

    O Zend Framework projetado para que seus arquivos estejam no include_path. Ns tambmcolocamos nosso diretrio de modelos (models) no include_path para que ns possamoscarreg-los facilmente depois. Para iniciar, ns precisamos incluir o arquivoZend/Loader.php que nos dar acesso classe Zend_Loader que possui as funesestticas que nos permitir carregar qualquer outra classe do Zend Framework.

    Zend_Loader::loadClass('Zend_Controller_Front');

    Zend_Loader::loadClass carrega a classe desejada. Isto feito pela converso dosunderscores do nome da classe em separadores de diretrio e adicionando .php no final.Dessa forma, a classe Zend_Controller_Front ser carregada do arquivo

    Zend/Controller/Front.php. Se voc seguir a mesma conveno para as suas prpriasbibliotecas de classes, ento voc poder utilizar Zend_Loader::loadClass()paracarreg-las tambm.A primeira classe que ns precisamos a front controller.

    A front controller utilizar uma classe de roteamento que mapeia a URL requisitada para afuno correta que ser utilizada para mostrar a pgina.Para que o roteador seja operado, ele precisa tirar qual parted a URL o caminho para o nossoindex.php e ento ele poder procurar pelos elementos da URI.Isto feito pelo objeto Request. Ele faz um bom trabalho de auto-deteco da URL basecorreta, mas caso no funcione para a sua configurao, ento voc pode sobrescrev-lousando a funo $frontController->setBaseUrl().

    Ns precisaremos configurar o front controller para que ele saiba em qual diretrio se encontraos nossos controllers.

    $frontController = Zend_Controller_Front::getInstance();$frontController->setControllerDirectory('./application/controllers');$frontController->throwExceptions(true);

    Como isto um tutorial e ns estamos executando um sistema de testes, eu decide instruir ofront controller para disparar todas as excees que ocorrerem. Por padro, o front controllerir captur-los para ns e armazen-los na propriedade _exceptions do objeto Responseque ele cria. O objeto response guarda toda a informao sobre a resposta para a URLrequisitada. Isto inclui os cabealhos http, o contedo da pgina e as excees. O frontcontroller ir enviar os cabealhos e mostrar o contedo da pgina antes de ele completar o

    trabalho.Isto pode ser um pouco confuso para as pessoas que so novatas com o Zend Framework,

  • 8/14/2019 Iniciando com Zend Framework

    5/19

    ento mais fcil apenas re-jogar as excees. claro que em um servidor de produo vocno dever mostrar os erros ao usurio de forma nenhuma.

    Finalmente, ns chegamos no ponto principal e vamos rodar nossa aplicao:// run!$frontController->dispatch();

    Se voc digitar http://localhost/zf_tutorial/para testar, voc certamente encontrar um errosimilar a:

    Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message'Invalid controller specified (index)' in

    Isto est nos dizendo que ns no configuramos nossa aplicao ainda. Antes defazermos isso, ns iremos discutir o que ns iremos construir, ento vamos fazer issoa seguir.

    O WebsiteNs iremos construir um sistema muitos simples estoque para mostrar a nossa coleo de CD.A pgina principal ir listar a nossa coleo and nos permitir adicionar, editar e excluir CDs.Ns iremos gravar nossa lista em um banco de dados em um esquema como este:

    Campo Tipo Null? Descrio

    Id Integer No Primary key, AutoincrementArtist Varchar(100) NoTitle Varchar(100) No

    Pginas necessriasAs pginas a seguir sero necessrias

    Home page Ir mostrar a lista dos lbuns e providenciar links para edit-los e

    deleta-los. Um link que permitir adicionar novos lbuns tambm estardisponvel.Adicionar New Album Mostrar um formulrio para adicionar um novo lbumEdit Album Mostrar um formulrio para edio de um lbumDelete Album Esta pgina ir confirmar que ns queremos deletar um lbum e ento o

    deletar.

    Organizando as pginasAntes de ns configurarmos nossos arquivos, importante entender como o framework esperaque as pginas sejam organizadas. Cada pgina da aplicao conhecida como uma ao eaes so agrupadas em controllers. Ex: para a URL com o formato

    http://localhost/zf-tutorial/news/view , o controller news e a ao view. Istopermite um agrupamento de aes relacionadas. Por exemplo, o controller news pode teraes atual, arquivadas e ler.O sistema de MVC do Zend Framework tambm suporta mdulos para agrupar controllers, masesta aplicao no grande o suficiente para nos preocuparmos com isso.

    O Controller do Zend Framework reserve uma ao especial chamada index como uma aopadro. Isto , uma url como http://localhost/zf-tutorial/news/ executar umaao index que est no controller news. O Controller do Zend Framework tambmreserve um controller padro para caso nenhuma seja solicitado. No nenhuma surpresa seele se chamar index tambm. Dessa forma, a url http://localhost/zf-tutorial/ irfazer com que a ao index no controller index seja executada.

    Como este um simples tutorial, ns no iremos nos incomodar com coisas complicadascomo login.

  • 8/14/2019 Iniciando com Zend Framework

    6/19

    Isso pode esperar por um tutorial separado...

    Como ns temos quarto pginas que se aplicam a lbuns, ns iremos agrup-las em um nicocontroller como quatro aes. Ns devemos usar o controller default e as quatro aes sero:

    Pgina Controller Ao

    Pgina principal Index IndexAdicionar novo lbum Index AddEditar lbum Index EditExcluir Album Index Delete

    Bom e simples.

    Configurando o ControleAgora ns estamos prontos para configurar o nosso controller. No Zend Framework, ocontroller uma classe que precisa ser denominada {Nome}Controller. Veja que {Nome}precisa comear com uma letra maiscula. Esta classe precisa estar em um arquivochamado {Nome}Controller.php dentro do diretrio de controllers especificado.Novamente, {Nome} precisa iniciar com uma letra maiscula e todas as outras precisam serminsculas. Cada ao um mtodo pblico dentro da classe de controle e precisa se chamar{ao}Action. Neste caso, {ao} deve iniciar como uma letra minscula.

    Assim, nossa classe de controle denominada IndexController que est definida emzf-tutorial/application/controllers/IndexController.php :

    zf-tutorial/application/controllers/IndexController.php

  • 8/14/2019 Iniciando com Zend Framework

    7/19

    para cada pgina de nossa aplicao. Caso isso no funcione com voc, confira na seoDefeitosque se encontra no final deste tutorial e veja se te ajuda.

    hora de construirmos a view.

    Configurando a VisoO Componente de viso do Zend Framework chamado, de certa forma sem surpreender,Zend_View. O componente de viso nos permitir separar o cdigo que mostra a pgina docdigo dos mtodos de ao.

    O uso bsico do Zend_View :$view = new Zend_View();$view->setScriptPath('/caminho/para/arquivos_de_visao');echo $view->render('view.php');

    Podemos observar facilmente que se ns colocarmos este esqueleto diretamente em cada umde nossos mtodos de ao, ns iremos repetir o cdigo de configurao, o que no interessa da ao. Ns devemos de preferncia, fazer a inicializao da viso em algum local e

    ento acessar o nosso objeto que j est inicializado, em cada um dos mtodos de ao.Os projetistas do Zend Framework previram este tipo de problema e a soluo foi criar oZend_Controller_Action para ns. L tem dois mtodos auxiliares: initView() e render().O mtodo initView() cria um objeto Zend_View para ns e determina-o para a propriedade$view, deixando pronto para que sejam atribudos dados a ele. Ele tambm configure o objetoZend_View para procurar em views/scripts/{controller} pelos scripts de viso que devem serrenderizados. O processo de renderizao de um script de viso feito pelo render(), quevai (por padro, ao menos) renderizar o script {ao}.phtml e anexar isso ao corpo doobjeto Response. O Objeto Response pe usado para combinar todos os cabealhos, contedode corpo e excees geradas como resultado do uso do sistema de MVC. O front controllerento automaticamente envia os cabealhos e em seguida o corpo do contedo no final.

    Para integrar a viso na nossa aplicao ns precisamos inicializar a viso no mtodo init() eento assegurar que chamaremos o mtodo render() em cada ao. Ns precisamos tambmcriar alguns arquivos de viso com cdigo para testes de exibio.

    A seguir, as mudanas necessrias no IndexController (mudanas em negrito).Como voc pode ver, ns adicionamos um novo mtodo chamado init(), que automaticamente executado pelo construtor do Zend_Controller_Action para ns. Isto nosgarante que a viso foi inicializada no incio e ns podemos ter confiana que ela est prontapara uso nos mtodos de ao.

  • 8/14/2019 Iniciando com Zend Framework

    8/19

    zf-tutorial/application/controllers/IndexController.php

    zf-tutorial/application/views/scripts/index/add.phtml

  • 8/14/2019 Iniciando com Zend Framework

    9/19

    zf-tutorial/application/views/scripts/index/edit.phtml

    zf-tutorial/application/views/scripts/index/delete.phtml

    O teste para cada controle/ao dever mostrar os quatro ttulos em negrito.

    Cdigos HTML comumRapidamente notamos que existem muito cdigo HTML comum em nossas views. Ns iremoscolocar o cdigo html que obvio em dois arquivos: header.phtml e footer.phtml dentro dodiretrio scripts. Ns poderemos ento utiliz-los para armazenar o cdigo HTML comum esomente fazer uma referncia a eles da template de viso.

    Os novos arquivos so:

    zf-tutorial/application/views/scripts/header.phtml

    (Repare que ns corrigimos o HTML, ento ns estamos compatveis com o padro tambm!)

    zf-tutorial/application/views/scripts/footer.phtml

    Novamente, nossas vises precisam de mudanas:

    zf-tutorial/application/views/scripts/index/index.phtml

    zf-tutorial/application/views/scripts/index/add.phtml

    zf-tutorial/application/views/scripts/index/edit.phtml

  • 8/14/2019 Iniciando com Zend Framework

    10/19

    zf-tutorial/application/views/scripts/index/delete.phtml

    EstilosMesmo que isso somente um tutorial, ns precisaremos de um arquivo CSS para tornar anossa aplicao um pouco apresentvel! Isso causa um pequeno problema porque atualmentens no sabemos como referenciar o arquivo CSS porque a URL no aponta para o diretrioraiz correto. Para resolver isso, ns usamos o mtodo getBaseURL() que parte da requisio(request) e passamos isso para a viso (view). Isto provm para ns a pequena parte da URLque ns desconhecemos.

    Altere o IndexController::init() para que se parea com isso:

    zf-tutorial/application/controllers/IndexController.php...

    function init()

    {$this->initView();$this->view->baseUrl = $this->_request->getBaseUrl();

    }...

    Ns precisamos adicionar o arquivo CSS para a seo do arquivo header.phtml:

    zf-tutorial/application/views/scripts/header.phtml...

  • 8/14/2019 Iniciando com Zend Framework

    11/19

    #formbutton {

    margin-left: 100px;}

    a {color: #800000;

    }

    Isto deve tornar ligeiramente mais bonito!

    O Banco de dadosAgora que temos o controle da aplicao separado da viso, hora de olhar a seo demodelo da nossa aplicao. Lembre-se que o modelo a parte que lida com o ncleo daaplicao (tambm chamado de regras de negcio) , no nosso caso, lida com o banco dedados. Ns faremos uso da classe Zend_Db_Table do Zend Framework que usada parapesquisar, inserir, alterar e excluir linhas de uma tabela do banco de dados.

    ConfiguraoPara usar a Zend_Db_Table,ns precisamos dizer a ela qual o banco de dados queusaremos e tambm o usurio e a senha. Como ns preferimos no colocar estes dados dentroda nossa aplicao, ns usaremos um arquivo de configurao para guardar esta informao. O Zend Framework oferece a classe Zend_Config para oferecer um acesso orientado aobjetos a arquivos de configurao. O arquivo de configurao pode ser um arquivo INI ou umarquivo XML. Ns usaremos o arquivo INI:

    zf-tutorial/application/config.ini[general]db.adapter = PDO_MYSQLdb.config.host = localhostdb.config.username = rob

    db.config.password = 123456db.config.dbname = zftest

    Obviamente voc deve usar o seu nome de usurio, senha e banco de dados, no o meu!

    muito fcil usar o Zend_Config:$config = new Zend_Config_Ini('config.ini', 'section');

    Repare que neste caso, Zend_Config_Ini carrega uma seo do arquivo INI e no todas assees do arquivo (mas todas as sees podem ser carregadas se voc desejar). Ele suportauma notao no nome da seo para permitir que sejam carregadas sees adicionais.Zend_Config_Ini tambm trata o ponto no parmetro como separadores hierrquicos quepermite o agrupamento de parmetros de configurao relacionados. No nosso config.ini, osparmetros servidor (host), usurio (username) e o nome do banco de dados (dbname) seroagrupados em $config->db->config.

    Ns iremos carregar o nosso arquivo de configurao no nosso arquivo de inicializao(index.php):

  • 8/14/2019 Iniciando com Zend Framework

    12/19

    Parte relevante de zf-tutorial/index.php...Zend_Loader::loadClass('Zend_Controller_Front');Zend_Loader::loadClass('Zend_Config_Ini');Zend_Loader::loadClass('Zend_Registry');

    // load configuration

    $config = new Zend_Config_Ini('./application/config.ini', 'general');$registry = Zend_Registry::getInstance();$registry->set('config', $config);

    // setup controller...

    As mudanas esto em negrito. Ns carregamos as classes que vamos utilizar(Zend_Config_Ini and Zend_Registry) e ento carregar a sesso general deapplication/config.iniem nosso objeto $config. Finalmente ns atribuimos o objeto$config ao registro para que possamos recuper-lo em qualquer lugar da aplicao.

    Nota: Neste tutorial, ns no precisamos guardar o $config no registro, mas uma boa

    prtica em uma aplicao real que voc ter mais que uma configurao de banco de dadosno arquivo INI. Porm, esteja avisado que o registro um pouco global e causa dependnciasentre objetos que no deveriam depender um do outro, se voc no for cuidadoso.

    Configurando Zend_Db_TablePara usar a Zend_Db_Table, ns precisaremos informar a configurao de banco de dedosque ns carregamos. Para fazer isso ns precisamos criar uma instncia da Zend_Db e entoregistra-la usando o mtodo esttico Zend_Db_Table::setDefaultAdapter() .Novamente, ns fazemos isso no arquivo de inicializao (adies em negrito):

    Parte relevante de zf-tutorial/index.php...Zend_Loader::loadClass('Zend_Controller_Front');Zend_Loader::loadClass('Zend_Config_Ini');Zend_Loader::loadClass('Zend_Registry');Zend_Loader::loadClass('Zend_Db');Zend_Loader::loadClass('Zend_Db_Table');

    // load configuration$config = new Zend_Config_Ini('./application/config.ini', 'general');$registry = Zend_Registry::getInstance();$registry->set('config', $config);

    // setup database$db = Zend_Db::factory($config->db->adapter,

    $config->db->config->asArray());Zend_Db_Table::setDefaultAdapter($db);

    // setup controller...

    Criando a tabelaEu estarei usando MySQL e ento o comando SQL para criar a tabela :

    CREATE TABLE album (id int(11) NOT NULL auto_increment,artist varchar(100) NOT NULL,title varchar(100) NOT NULL,PRIMARY KEY (id)

    )

    Execute o comando em um client MySQL como o phpMyAdmin ou o cliente de linha decomando padro.

  • 8/14/2019 Iniciando com Zend Framework

    13/19

    Inserindo albums de testeNs precisaremos inserir algumas linhas na tabela para que ns possamos testar afuncionalidade de recuperao da pgina principal. Eu estarei pegando os primeiros dois CDsHot 100 do site Amazon.co.uk:

    INSERT INTO album (artist, title)VALUES

    ('James Morrison', 'Undiscovered'),('Snow Patrol', 'Eyes Open');

    O ModeloZend_Db_Table uma classe abstrata, ento ns temos que derivar nossa classe que especfica para gerenciar os albums. No importa como denominaremos a nossa classe, masfaz sentido que ela tenha o mesmo nome que a tabela do banco de dados. Assim, nossa classeser denominada lbum como a nossa tabela que se chama lbum. Para informar aZend_Db_Table o nome da tabela que iremos gerenciar, ns temos que setar a propriedadeprotegida $_name para o mesmo nome da tabela. Tambm, Zend_Db_Table assume que achave primria da sua tabela seja denominada id que auto-incrementada pelo banco de

    dados. O nome deste campo pode ser mudado tambm se necessrio.

    Ns iremos guardar nossa classe lbum no diretrio models:

    zf-tutorial/application/models/Album.php

  • 8/14/2019 Iniciando com Zend Framework

    14/19

    Ns iremos listar os lbuns em uma tabela com indexAction():

    zf-tutorial/application/controllers/IndexController.php...function indexAction(){

    $this->view->title = "My Albums";$album = new Album();$this->view->albums = $album->fetchAll();$this->render();

    }...

    O mtodo Zend_Db_Table::fetchAll() retorna uma Zend_Db_Table_Rowset que nospermitir iterar pelas linhas retornadas no arquivo de template da view:

    zf-tutorial/application/views/scripts/index/index.phtml

  • 8/14/2019 Iniciando com Zend Framework

    15/19

    $filter = new Zend_Filter_StripTags();

    $artist = $filter->filter($this->_request->getPost('artist'));$artist = trim($artist);$title = trim($filter->filter($this->_request->getPost('title')));

    if ($artist != '' && $title != '') {

    $data = array('artist' => $artist,'title' => $title,

    );$album = new Album();$album->insert($data);

    $this->_redirect('/');return;

    }}

    // set up an "empty" album$this->view->album = new stdClass();$this->view->album->id = null;

    $this->view->album->artist = '';$this->view->album->title = '';

    // additional view fields required by form$this->view->action = 'add';$this->view->buttonText = 'Add';

    $this->render();}...

    Observe como ns checamos a varivel $_SERVER['REQUEST_METHOD']para ver se oformulrio foi submetido.. Se ele foi, ns recuperamos o artista e o titulo do array post eusamos a classe Zend_Filter_StripTagspara garantir que nenhum html seja permitido.Ento, assumindo que eles foram informados, ns utilizamos nossa classe de modelo,lbum(), para inserir a informao em uma nova linha na tabela do banco de dados.

    Depois que ns adicionamos o lbum, ns redirecionamos usando o mtodo_redirect() docontrole para voltarmos raiz da nossa aplicao.

    Finalmente, ns deixamos a view pronta para o formulrio que vamos usar na template. Nspodemos ver que a ao edit do formulrio ser bastante similar com esta, ento ns usaremosum arquivo de template comum (_form.phtml) que chamado de indexAdd.tpl.php eindexEdit.tpl.php:

    As templates para adicionar lbum so:

    zf-tutorial/application/views/scripts/index/add.phtml

    zf-tutorial/application/views/scripts/index/_form.phtml

  • 8/14/2019 Iniciando com Zend Framework

    16/19

  • 8/14/2019 Iniciando com Zend Framework

    17/19

    O Template :

    zf-tutorial/application/views/scripts/index/edit.phtml

    Mudana!Voc no deve ter deixado de perceber que os mtodos AddAction() e EditAction() so muitosimilares e que as templates add e edit so idnticas. Alguma mudana necessria!

    Eu deixarei isso como um exerccio para voc, prezado leitor...

    Excluindo um lbumPara arredondar a nossa aplicao, ns precisamos adicionar a excluso. Ns temo um link

    Delete perto de cada lbum em nossa pgina de listagem e ele tem que executar uma exclusoquando ele clicado passando os parmetros por GET. Isto pode estar errado. Relembrandonossa especificao HTTP, ns no devemos fazer uma ao irreversvel usando GET edevemos usar POST. O recente accelerator beta do Google trouxe este ponto a tona paramuitas pessoas.

    Ns mostraremos um formulrio de confirmao quando o usurio clicar em excluir e se eleclicar em sim, ns faremos a excluso.

    O cdigo parece um pouco familiar com as aes de adicionar e editar:

    zf-tutorial/application/controllers/IndexController.php...

    function deleteAction(){$this->view->title = "Excluir Album";

    $album = new Album();if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') {

    Zend_Loader::loadClass('Zend_Filter_Alpha');$filter = new Zend_Filter_Alpha();

    $id = (int)$this->_request->getPost('id');$del = $filter->filter($this->_request->getPost('del'));

    if ($del == 'Yes' && $id > 0) {$where = 'id = ' . $id;$rows_affected = $album->delete($where);

    }} else {

    $id = (int)$this->_request->getParam('id');if ($id > 0) {

    $this->view->album = $album->fetchRow('id='.$id);

    if ($this->view->album->id > 0) {$this->render();return;

    }}

    }

    // redireciona listagem novamente

    $this->_redirect('/');}...

  • 8/14/2019 Iniciando com Zend Framework

    18/19

    Novamente, ns usamos o mesmo truque de checar o mtodo de requisio para verificar seiremos mostrar o formulrio de confirmao ou se ns devemos realizar a excluso, via classelbum(). Como insert e update, a atual excluso feita via uma chamada aZend_Db_Table::delete().

    Observe que ns retornamos imediatamente aps setar o response. Isto porque nspodemos redirecionar de voltar para a listagem de lbuns no final do mtodo. Assim, se algumadas checagens falharem, ns voltamos listagem de lbuns sem precisar chamar_redirect() diversas vezes dentro do mtodo.

    O Template um simples formulrio:

    zf-tutorial/application/views/indexDelete.tpl.php

    Cannot find album.

    DefeitosSe voc est tendo problemas ao executar outra ao diferente de index/index, ento oproblema que o roteador est incapaz de determinar em qual subdiretrio seu website est.Das minhas investigaes, isso normalmente acontece quando a url para seu website difere docaminho para o diretrio raz do servidor web.

    Se o cdigo padro no funcionou para voc, ento voc deve setar a varivel $baseURL parao valor correto do seu servidor:

    zf-tutorial/index.php

    ...

    // setup controller$frontController = Zend_Controller_Front::getInstance();$frontController->throwExceptions(true);$frontController->setBaseUrl('/meusubdiretorio/zf-tutorial');$frontController->setControllerDirectory('./application/controllers');...

    Voc dever substituir '/meusubdiretorio/zf-tutorial/'pela URL correta para oindex.php. Por exemplo, se seu index.php http://localhost/~ralle/zf_tutorial/index.php ento ovalor correto para $baseUrl '/~ralle/zf_tutorial/'.

    Concluso

    Isto conclui nossa viso geral construindo uma aplicao MCV simples, mas completamentefuncional usando o Zend Framework. Eu espero que voc tenha achado interessante e

  • 8/14/2019 Iniciando com Zend Framework

    19/19

    informativo. Se voc achou que algo est errado, por favor, me envie um email para:[email protected]!

    Este tutorial mostrou apenas o bsico do Zend Framework; ainda existem muitas classes aserem exploradas. Voc realmente deveria ir e ler o manual(http://framework.zend.com/manual) e olhar o wiki (http://framework.zend.com/wiki) para mais

    introspeces! Se voc est interessado no desenvolvimento do framework, ento o wiki dedesenvolvimento (http://framework.zend.com/developer) o seu lugar.