Conheça o Plugfeed | » Início » Desenvolvimento » Ajax » Classe para transação ajax
Conheça o Plugfeed | » Início » Desenvolvimento » Ajax » Classe para transação ajax -->
 
Avaliação: | Publicado em: 03/09/2008
Classe para transação ajax
José Roberto Gomes da Silva programador PHP na RCT Retail, desenvolve trabalhos em PHP/Javascript, Action Script


Classe para transação ajax

Todo programador php se vê frequentemente precisando utilizar códigos javascript para dar maior interatividade em suas páginas web. Pois bem, vou deixar aqui uma contribuição ao método que hoje é bastante utilizado na internet, mas de uma forma diferente. Ajax usando orientação a objeto. A orientação a objeto ainda não está 100% madura no javascript... mas ja podemos brincar um pouco com ela, resolvi deixar desta forma então, mais um exemplo de ajax. Vamos lá.

vamos a nossa base de exemplo.

crio um banco e uma tabela que terá as informações que buscarei no nosso projeto.

create database dbcidades;
CREATE TABLE  `bdcidades`.`tblcidades` (
  `id` int(11) NOT NULL auto_increment,
  `nome` varchar(60) NOT NULL,
  PRIMARY KEY  (`id`)
)

Insiro alguns valores para a nossa consulta.

insert into tblcidades (id,nome)values(1,"Santos");
insert into tblcidades (id,nome)values(2,"São Vicente");
insert into tblcidades (id,nome)values(3,"Guarujá");
insert into tblcidades (id,nome)values(4,"Praia Grande");
insert into tblcidades (id,nome)values(5,"Peruibe");


vamos criar nossa pagina index.html que será a pagina principal do exemplo.


<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Testando Classe Ajax</title>
        <script type="text/javascript" src="ajax.js"></script>
    </head>
    <body>
        <div id="msgCarregando" style="display:none">Carregando...</div>
        <div id="container"></div>
    </body>
</html>


como podem ver apenas coloquei duas div para que nosso exemplo seja executado.


em seguda vou criar a minha pagina php, que fará a consulta com a base de dados e me retornará em forma de xml o conteúdo da consulta

<?php
/*
 * Created on 05/07/2008
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
 
 //Conexão com base de dados
 $db = mysql_connect( "localhost" , "seuusuario" , "suasenha" );
 mysql_select_db( "bdcidades" );
 
 //*************************************************
 
 //Query de consulta que trará a lista de cidades
 $sql = "SELECT id,nome " .
         "FROM tblcidades " .
         "ORDER BY nome";
 
 //executa a query
 $qry = mysql_query( $sql );
 
 //inicia a variável do xml
 $xml = '<?xml version="1.0" encoding="utf-8"?><CoyoteVesgo>';
 
 
 //varre a consulta sql e coloca os valores na variável xml
 while( $rs = mysql_fetch_object( $qry ) ){
    
     $xml .= "<lstCidade>" .
             "<iId>{$rs->id}</iId>" .
             "<sDesc>{$rs->nome}</sDesc>" .
             "</lstCidade>";
            
 }
 
 //fecha o xml
 $xml .= '</CoyoteVesgo>';
 
 //seta o cabeçalho para o tipo xml e retorna em tela
 header('Content-type: application/xml; charset=ISO-8859-1');
 print $xml;
 
?>

salvo o script como getCidade.php


Agora a parte um pouco mais complicada. Não é tão dificil de entender, basta um pouco de atenção para assimilar o código.

este script vou salvar como ajax.js


/**
 * @author José Roberto
 * @version 1.0
 * @deprecated Classe para conexão ajax em javascript
 * @requires function $(), function $$()
 */
function ajax(){
   
    //Declaração das variáveis de controle do objeto
    this.oAjax         = null;
    this.sUrl         = null;
    this.sMetodo     = null;
    this.sMsgSts     = null;
    this.sFunct        = null;
    this.aVar         = Array();
    this.aVal         = Array();
   
    //Método cria o objeto de transação httpRequest
    this.setCreate = function(sUrl , sMetodo , sMsgSts , sFunct ){
       
        //Seta as variáveis do objeto principal
        this.sUrl         = sUrl;
        this.sMetodo     = sMetodo;
        this.sMsgSts     = sMsgSts;
        this.sFunct     = sFunct;
       
        // O try serve para monitora erros no método
        // caso aconteça algum erro o catch será executado chamando um próximo try ou executando um alert com a mensagem de erro
        // caso ocorra tudo bem... o seu objeto ajax será setado e poderá continuar com o código normalmente
        try{
            this.oAjax = new XMLHttpRequest();
        }catch( exception ){
            try{
                this.oAjax = new ActiveXObject("Msxml2.XMLHTTP");
            }catch( exception ){
                try{
                    this.oAjax = new ActiveXObject("Microsof.XMLHTTP");
                }catch( exception ){
                    alert( "Não foi possível inicar o ajax!" );
                    this.oAjax = null;
                }
            }
        }
       
        //Verifica se tudo ocorreu bem para poder setar o cabeçalho de transmissão do ajax
        if( this.oAjax ){
           
            //abre o objeto xmlhttp
            this.oAjax.open( "POST" , this.sUrl , true );
            //seta o cabeçalho
            this.oAjax.setRequestHeader( "Content-Type","application/x-www-form-urlencoded" );
            this.oAjax.setRequestHeader( "encoding","ISO-8859-1" );
           
        }
       
        //retorna o objeto ajax já configurado e pronto para o trabalho
        return this.oAjax;
       
    }
   
    //Método insere os parametros que será enviado pela transação do ajax
    this.setParametro = function( variavel , valor ){
       
        this.aVar.pop( variavel );
        this.aVal.pop( valor     );

    }
   
    //Método retorna os parametros que foram inseridos com o método setParametro
    this.getParametro = function(){
       
        var sParametro = null;
       
        //varre o array de parametros variável e valor na string sParametro
        // Essa string é utilizada no evento send, e passa as variáveis pela transaçao do ajax
        for(var i = 0 ; i < this.aVar.length ; i++ ){
           
            sParametro += ( ( i > 0 ) ? "&" : "" );
            sParametro += this.aVar[ i ] + "=" + this.aVal[ i ];
               
        }
       
        //retorna a string formatada
        return this.sParametro;
       
    }
   
    //Método executa o send do ajax, enviando as variáveis definidas
    this.execute = function(){
       
        //seta as variáveis do objeto oAjax
        //Isso é necessário pois no onreadystatechange estaremos dentro do objeto oAjax, e não poderemos acessar
        //as variáveis do objeto ajax. assim repasso elas para o oAjax
        this.oAjax.sFunct     = this.sFunct;
        this.oAjax.sMsgSts     = this.sMsgSts;
        this.oAjax.sMetodo     = this.sMetodo;
       
        //Método monitora o status do evento send do objeto oAjax
        //Nesse caso utilizo somente o numero 1 e o numero 4... os demais ignoro
        this.oAjax.onreadystatechange = function(){
            switch( this.readyState ){
            case 0:
                //Não iniciado
                break;
            case 1:
                //caso esteja carregando exibe mensagem carregando na tela... ou quaquer outra coisa que queira fazer
                $( this.sMsgSts ).style.display = "block";
                break;
            case 2:
                //Enviando dados
                break;
            case 3:
                //Carregando ou recebendo dados
                break;
            case 4:default:
                //Completo
                //Verifica se houve erro no retorno
                if ( this.status == 200 ){
                    $( this.sMsgSts ).style.display = "none";
                    switch( this.sMetodo ){
           
                        case "txt": retornoAjax( this.responseText     ); break;
                        case "xml": default: retornoAjax( this.responseXML ); break;
                       
                    }
                }
                else
                    return false; //retorna false em caso de erro
                break;
            }
           
        }
       
        //Inicia a transação ajax
        this.oAjax.send( this.getParametro() );
       
    }
       
}

/*
 * Função que será chamada pela classe ajax, retorna os valores da transação vindas por xml ou Text
 * Neste exemplo utilizo o xml... mas podeira retorna um text, depende do php que será chamado
 */
function retornoAjax( objAjax ){
   
    //recupera a lista do xml vindo por objAjax
    var xml = $$( objAjax , "lstCidade" );
   
    //cria uma lista
    var dl     = document.createElement( "dl" );
   
    //varre o array da lista de cidades que está em xml
    for( var i = 0 ; i < xml.length ; i++ ){
       
        //cria uma sublista para guarda os valores que será extraido do xml
        var dd         = document.createElement( "dd" );
        //cria um ítem com o ponteiro do xml
        var item     = xml[ i ];
       
        //recupera o código e o nome da cidade da lista       
        var iCod     = $$( item , "iId"         )[ 0 ].firstChild.nodeValue;
        var sNom     = $$( item , "sDesc"     )[ 0 ].firstChild.nodeValue;
       
        //preenche a sublista com o codigo e o nome da cidade em questão
        dd.innerHTML = "Código = " + iCod + "| Nome =  " + sNom;
        //inclui a sublista na lista principal
        dl.appendChild( dd );
       
    }
   
    //inclui a lista principal na div container
    $("container").appendChild( dl );
   
}

/**
 * Função pega um elemento através de um id passado por parametro
 */
function $( sTarget ){
    var ret = null;
    try{
        ret = document.getElementById( sTarget );
    }catch( exception ){
        alert( "Nenhum objeto para retorno!" );
        ret = null;
    }
    return ret;
}

/**
 * Pega um elemento através do tagName
 */
function $$( oObj , sTarget ){
    var ret = null;
    try{
        ret = oObj.getElementsByTagName( sTarget );
    }catch( exception ){
        alert( "Nenhum objeto para retorno!" );
        ret = null;
    }
    return ret;
}


/*
 * Para chamar o objeto ajax e printar na tela a consulta do sql vinda do php através de xml temos o seguinte código:
 */

//Inicia um novo objeto ajax
var oObj = new ajax();

//Cria e configura o metodo de transação ajax
oObj.setCreate( "getCidade.php" , "xml" , "msgCarregando" , "exibeTela" );
//Define os parametros de envio
oObj.setParametro( "modo" , "getList" );

//evento onload do browse
window.onload=function(){
    //executa a transação ajax
    oObj.execute();
       
}


junto ao trecho do código coloquei duas funções que são bastante importante. são elas:

$() = função para retorna um objeto de tela pelo id

$$() = função que retorna um elemento pelo seu tagname

utilizo essas funções para recuperar os elementos do formulário ou os elementos vindo do ajax por xml

outra função importante no código:

retornoAjax() = essa função fica encarregada de trabalhar a informação que é trazida pelo objeto ajax.

Existe duas formas de retorno para a classe ajax aqui no exemplo, xml ou texto. Mas ainda poden ser criados retornos como um preenchimento de combo, ou um array, ou até mesmo quem sabe retornar uma tabela montada toda em DOM. que coisa linda não é mesmo.


Bem galera, essa foi minha contribuição para o ajax, espero que tenham gostado, os arquivos que utilizei para o artigo estão no zip e podem ser baixados.

Abraço ao pessoal da RCT

até a próxima



Arquivos anexos ao artigo

Já que é PHP , porque simplesmente você não usa-se a class xajax , disponivel no www.xajaxproject.org ?
Pq se eu passar a utilizar código pronto, estou limitando meu aprendizado a utilização de frameworks ja pronto. Costumo usar jquery, mas ainda monto minhas classes para descobrir novas formas e métodos para trabalhar!!!
Fernando, copiar é facil.. quero ver criar na unha tudo :D