Bem, vou mostrar como se usa AJAX com o Zend Framework. O zend framework utiliza um esquema parecido com o Struts, as Actions.

Estarei utilizando tambem o mootools para facilitar a criação do objeto “AJAX. Estarei considerando que você já está familarizado com o uso do Zend Framework.

Na estrutura da minha aplicação eu tenho um Controller que por sua vez possui diversas actions, e tenho tambem a camada de acesso a dados.

A nossa aplicação será um formulário que possui um input box para digitar um cep e ele irá buscar no banco de dados e retornar os dados.

Resposta:

Um esquema de formulário:

HTML:

<form>  
<input type="text" id="cepInsert" />  
<input type="button" value="ok" onclick="buscaCep()" />  
</form>

Javascript:

function buscaCep(){  
 
    var cep = $('cepInsert').value;  
    var queryString = {"cep": cep };  
    var opcoes =  
    {  
        "method":"get",  
        "data": queryString,  
        "onComplete": completouSolicitacao  
    };  
 
    var ajaxObj = new Ajax("<?php echo $this->baseUrl ?>/cep/buscacep", opcoes).request();  
}

A função buscaCep pega o cep digitado e monta a QueryString com esse dado e depois cria o objeto AJAX e faz a requisição. O onComplete é a função que será chamada após a requisição ter sido completada.

Javascript:

function completouSolicitacao( info ){  
        var obj = Json.evaluate( info );  
 
        if(obj.erro == true){  
            alert(obj.msgErro);  
            return;  
        }  
 
       alert(obj.endereco);  
    }

A função completouSolicitação apenas pega o objeto JSON retornado e exibe um alert com as informações.

A string montada será essa: "aplicacao/cep/buscaCep?cep=27500200"

Como falei antes, o zend possui controladores e actions, nesse caso o cep é o controller e o buscacep é um action que faz parte do mesmo.

CepController.php:

PHP:

function buscacepAction(){  
 
            // LOADER  
            Zend_loader::loadClass("Zend_Json");  
            Zend_Loader::loadClass('CepDAO');  
 
                        $this->_helper->viewRenderer->setNoRender();
                       
            $cepString = $this->_request->getParam("cep",-1);  
 
            // Instanciando o objeto de acesso a dados  
            $cepDAO  = new CepDAO();  
 
            $retorno = $cepDAO->recuperaCep($cepString);  
 
            // Verificando se ocorreu erro  
            if($retorno['erro'] == true){  
                @$obj->msgErro = "Cep não encontrado.";  
                $obj->erro = true;  
 
            }else {  
 
                $cep = $retorno['cep'];  
 
                @$obj->erro       = false;  
                $obj->endereco = $cep->s_endereco;  

 
            }  
            // envia o objeto default para o encode  
            $objJson = Zend_Json::encode( $obj );  
            // coloca na camada de visao  
           $this->_response->appendBody($objJson);
                   
        }//buscaCep

CepDAO

PHP:

<?php  
 
class CepDAO extends Zend_Db_Table {  
 
        protected $_name     = "cep";
   protected $_primary  = "s_cep";
   
    public function recuperaCep($cep){  
        $retorno['erro'] = false;  
        try{  
 
            $where   = $this->getAdapter()->quoteInto("s_cep = ?",$cep);  
            $cep     = $this->fetchRow($where);  
            // Verifica se o cep foi encontrado  
            if ($cep != null){  
                // Foi Encontrado  
                $retorno['cep'] = $cep;  
 
            } else {  
                // Não foi Encontrado  
                $retorno['erro']    = true;  
                $retorno['msgErro'] = 2;  
            }  
 
        }catch ( Zend_Db_Exception $e ){  
            // Excecao  
            $retorno['erro']    = true;  
            $retorno['msgErro'] = 1;  
        }  
 
        return $retorno;  
    }//recuperaCep  
}//CepDAO

Página de teste: clique aqui

Endereço de trackback para este post

Trackback URL (clique direito e copie atalho/localização do link)

8 comentários

Comentário de: Luiz [Visitante]
Olá, Muito bom este seu exemplo, está tudo muito bem explicado parabéns mesmo..
Só uma coisa, não consegui implementar seu exemplo em meu sistema pois você não disponibilizou a classe CepDAO....
Existe alguma maneira de se implementar sem utilizar uma classe para conexão com o banco de dados ?
15.10.08 @ 06:45
Comentário de: mrxrsd [Membro] Email
Olá Luiz,
Você não precisa implementar a classe de conexão para o banco, poderá fazer isso mesmo na classe de controle, apesar disso não ficar muito adequado com o padrão MVC.

Irei alterar o post e disponibilizar a classe CepDAO, porém ela é bem primária, apenas pega um registro de um cep e retorna.
15.10.08 @ 11:48
Comentário de: Luiz [Visitante]
Bom dia mrxrsd,

Estive olhando e realmente não há necessidade de se ter o CepDAO conforme havia mencionado..
Estou ainda aprendendo a manipulação deste componente (ZEND_JSON) tudo está meio obscuro a transação das informações entre o Controller -> Ajax -> PHP.

Minha maior dúvida é quanto ao Controller, escrevi a rotina para realizar um Select retornando a informação que me interessa, mas como todo controller tem que ter um arquivo *.phtml tendo como mesmo nome a Action, neste caso não precisa porque ?

Como posso testar uma vez que não sei onde está acontendo o erro, pois, ao clicar no botão não acontece nada, nenhum "alert" é jogado em tela...
Como saber se a variável ajaxObj está recebendo algo ?

Gostaria encaricidamente de pedir sua ajuda para verificar o que estou fazendo de errado... você me ajudaria ?

Desculpe se estiver incomodando...OK

Muito Obrigado

Luiz
16.10.08 @ 05:52
Comentário de: mrxrsd [Membro] Email
Olá,

Realmente toda action procura uma visão de mesmo nome, por isso temos a linha de comando:

$this->_helper->viewRenderer->setNoRender();

Esse comando evita isso de acontecer, mas porque precisa fazer isso? Pois não queremos que ele vá para uma outra página, queremos que ele faça o processamento e retorne os dados para a tela atual. Essa é a idéia do AJAX, realizamos a chamada em "background", ou seja, sem realizar um post da página e depois tratamos o retorno via javascript. Os dados são retornado para a página através do comando:

$this->_response->appendBody($objJson);


Agora sobre o que está acontecendo no controller, você pode debuggar normalmente como faria com qualquer aplicação sua.
16.10.08 @ 06:18
Comentário de: Paulo Sette [Visitante]
não estou conseguindo configurar! acho q é pq o mootools mudou a versão! alguem pode me ajudar?
04.02.09 @ 09:15
Comentário de: mrxrsd [Membro] Email
Qual erro exatamente está acontecendo ?
04.02.09 @ 09:23
Comentário de: Alexandre [Visitante] Email
Olá
Estou tentando aplicar seu tutorial no meu sistema, mas inicialmente percebi que o javascript não está reconhecendo a sintaxe: var queryString = {"cep": cep }; tentei dar um alert na var queryString e não deu nada, então mudei a sintaxe para:
var queryString = "?cep=" + cep; e aí deu certo o alert, então pensei que a sintaxe de {} e : não estão sendo reconhecidas pelo javascript.
baixei o mootools: mootools-1.2.2-core-nc.js
renomei-o para mootools.js e coloquei-o no cabeçado da página:
src="baseUrl();?>/scripts/jquery/mootools.js" type="text/javascript"

Será que estou fazendo alguma coisa errada?
Pode me ajudar?
01.07.09 @ 06:55
Comentário de: Alexandre [Visitante]
Olá, qual versão do mootools vc utilizou?
02.07.09 @ 05:40

Esse post tem 1 feedback esperando moderação...

Deixe seu comentário


Seu endereço de e-mail não será revelado nesse site.

Sua URL será exibida.
(Quebras de linha se tornam <br />)
(Nome, e-mail & website)
(Permitir que usuários o contatem através de um formulário eletrônico (seu e-mail não será exibido.))