Irei mostrar uma abordagem de validação de formulário em AJAX utilizando o Zend Framework. Iremos fazer uso da própria classe de validação do Zend, o Zend_Validate. Você deve estar se perguntando qual é a vantagem de fazer a validação via ajax.

Sinceramente? Com o uso do Zend_Form, é quase nula, pois ele faz o controle dos dados para você, mas quem não se habituou com o uso do Zend_Form, fazer o controle dos dados após o post quando dá erro de validação é realmente entediante, nessa hora que entra o ajax.

Resposta:

Começamos com um formulário simples:

HTML:

<form name="frm" >  
 <table>  
  <tr>  
   <td>  
    Nome do Produto:  
   </td>  
   <td>  
     <input type="text" id="nomeProduto" name="nomeProduto"/>  
   </td>  
  </tr>  
  <tr>  
   <td>  
    Valor Produto:  
   </td>  
    <td>  
    <input type="text" id="valorProduto" name="valorProduto" />  
   </td>  
  </tr>  
 </table>  
 <input type="button" value="Inserir" onclick='javascript:validar()' />  
</form>

Código javascript da camada de visão:

Javascript:

// Pegando os valores e montando o objeto ajax  
function validar(){  
      var nome = $('nomeProduto').value;  
      var valor   = $('valorProduto').value;  
      var queryString = {"nomeProduto": nome, "valorProduto": valor };  
      var opcoes =  
            {  
                "method":"get",  
                "data": queryString,  
                "onComplete": completouSolicitacao  
            };  
     var ajaxObj = new Ajax("<?php echo $this->baseUrl ?>/Index/insereproduto", opcoes).request();  
}  
 
function completouSolicitacao(info){  
      var obj = Json.evaluate( info );  
                         
      if ( obj.erro == true ){
           var msg = "";                         
           for (var i in obj.msg){     
                msg += obj.msg[i] + '\n';
           }
           alert(msg);
      } else {
           alert("Inserido com sucesso");
      }
}

Lembre-se de adicionar a biblioteca do mootools para auxilicar a criação do objeto ajax

HTML:

<script type="text/javascript" src='http://ajax.googleapis.com/ajax/libs/mootools/1.11/mootools.js' ></script>

Código do controller:

PHP:

private function validainsereproduto($nome, $valor){
                 
       // Dando Loader na classes de validacao  
       Zend_Loader::loadClass('Zend_Validate_StringLength');  
       Zend_Loader::loadClass('Zend_Validate_Float');  
                       
                       
       // Instanciando os validadores  
       $validadorNome     = new Zend_Validate_StringLength(1,100);  
       $validadorValor    = new Zend_Validate_Float();  
                 
       // Setando as mensagens e os tipos de validação  
       $validadorNome->setMessage(  
                      "Campo nome e obrigatorio.",  
                      Zend_Validate_StringLength::TOO_SHORT);  
 
       $validadorNome->setMessage(  
                      "Campo nome maior que o permitido.",  
                      Zend_Validate_StringLength::TOO_LONG);  
 
       $validadorValor->setMessage(  
                       "Campo valor nao e um numero valido.",  
                       Zend_Validate_Float::NOT_FLOAT);  
                 
       $msg = array();
       $validadorNome->isValid($nome);
       $msg = array_merge($msg,$validadorNome->getMessages());
       $validadorValor->isValid($valor);
       $msg = array_merge($msg,$validadorValor->getMessages());

       if ( count($msg) > 0 ) {
            $retorno['erro'] = true;                                                                           
            $retorno['msg'] =  $msg;
       }
       else
       {
            $retorno['erro'] = false;
       }
                                   
  return $retorno;
}
                 
function insereprodutoAction(){
                 
      Zend_loader::loadClass("Zend_Json");  
                               
      // Pegando os valores da camada de visao            
      $nome       = $this->_request->getParam("nomeProduto");  
      $valor      = $this->_request->getParam("valorProduto");  
         
      //Chama a função responsável por fazer a validação
      $retorno = $this->validainsereproduto($nome,$valor);
      //Verifica se o é um request ajax
      if($this->_request->isXmlHttpRequest()){  
               $this->_helper->viewRenderer->setNoRender();
               if ( $retorno['erro'] == true ){
                        @$obj->erro = true;
                        $obj->msg    = $retorno['msg'];
               }
               else
               {
                        @$obj->erro = false;
               }
                                                 
               $objJson = Zend_Json::encode( $obj );                
               $this->_response->appendBody($objJson);
       }
       else
       {
       //  Verificando se os valores digitados sao válidos  
       //  mesmo quando o post não é ajax devemos validar os dados,
       //  pois alguém mal intencionado pode
       //  chamar o post pulando a validação ajax
           if ( $retorno['erro'] == false ){  
                 
                  // Executa os procedimentos para insercao      
                  var_dump('Inserido com sucesso');
           } else {  
                  // Deu erro na validacao  
                  var_dump('Erro');

           }  
                               
           $this->_forward('cadastroproduto');
    }
}



Página de teste: clique aqui

Endereço de trackback para este post

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

Feedbacks esperando moderação

Esse post tem 24 feedbacks 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.))