Maio 11, 2008
Utilizando AJAX com o Zend Framework
Posted by programatik under ajax, framework, javascript, php, zend | Etiquetas: ajax, framework, js, mootools, php, zend |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.
Um esquema de formulário:
<form> <input type="text" id="cepInsert" onblur="buscaCep()" /> </form>
O onblur é para quando o componente html perder o focus chamar a função buscaCep().
Função buscaCep():
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.
Função completouSolicitacao:
function completouSolicitacao( info ){
var obj = Json.evaluate( info );
if(obj.erro == true){
alert(obj.msgErro);
return;
}
alert(obj.logradouro+ " " + obj.bairro+ " " + obj.cidade);
}
A função completouSolicitação apenas pega o objeto JSON retornado e exibe um alert com as informações.
A string montada será essa:
http://localhost/aplicacao/cep/buscaCep?cep=27535010
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
class cepController extends Zend_Controller_Action
{
function buscacepAction(){
// LOADER
Zend_loader::loadClass("Zend_Json");
Zend_Loader::loadClass('CepDAO');
$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->logradouro = $cep->s_logradouro;
$obj->bairro = $cep->s_bairro;
$obj->cidade = $cep->s_cidade;
$obj->uf = $cep->s_uf;
$obj->cep = $cep->s_cep;
}
// envia o objeto default para o encode
$objJson = Zend_Json::encode( $obj );
// coloca na camada de visao
$this->view->obj = $objJson;
}//buscaCep
} //cepController
?>
cepDAO.php:
<?php
class CepDAO extends Zend_Db_Table {
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
?>
Para cada action, o zend framework procura uma camada de visao de mesmo nome, ou seja, para o buscaCepAction ele irá buscar uma buscaCep.phtml.
O nosso buscaCep.phtml vai apenas ter uma linha que vai ecoar o objeto JSON.
buscaCep.phtml:
<?php echo $this->obj ?>
O resultado ecoado pela buscaCep.phtml vai ser algo do tipo:
Cep não encontrado:
{”erro”:true,”msgErro”:”Cep não encontrado.”}
Cep encontrado:
{”erro”:false,”logradouro”:”R. João Cabral Flexa”,”bairro”:”Cabral”,”cidade”:”Resende”,”uf”:”RJ”,”cep”:”27535010″}
E pronto, nossa aplicação AJAX está funcionando.