Neste artigo, pretendo apresentar ao Leitor a tecnologia AJAX, resolvendo algumas confuses sobre o que
realmente , e como e onde deve ser usada. Este artigo apresenta um exemplo de como implementar uma
soluo AJAX sem auxlio de Frameworks. Aps palestrar sobre o assunto no 1 PHPDF RoadShow (E no PHP
Conference 2007 em So Paulo) decidi por todo material das palestras em um artigo, que foi publicado pela
primeira vez na PHP Magazine, e que agora re-publico aqui em meu Blog. Esta primeira parte esta dividida
em duas pois descobri que meu WordPress fica louco com artigos grandes. E e breve este artigo ter uma
sequencia que entrar no uso de FrameWorks.
Desde que comecei a pesquisar sobre AJAX devo admitir que me apaixonei pela forma que ele permite
executar tarefas simples e avanadas de forma amigvel, simples e gil. Desde ento, tenho procurado
repassar este contedo, contribuindo brevemente com o site AJAX Online (www.ajaxonline.com.br) e
publicando diversos artigos em meu blog pessoal.
1. AJAX: detergente ou tecnologia?
O caminho para o aprendizado de AJAX no muito longo, mas mesmo assim possui diversos atalhos que
podem agilizar no desenvolvimento, porm podem acabar saindo pela culatra mais tarde, pois prejudicam
o conhecimento. O primeiro passo e tambm o ponto de maior confuso, a velha pergunta, O que
AJAX?. Leigos lhe diro que um detergente, alguns diro que uma nova linguagem de programao, eu
lhes digo que se trata apenas de uma nova forma de ver algo mais antigo.
O AJAX um conjunto de tcnicas novas, envolvendo diversas tecnologias antigas, dentre elas: Javascript,
XML, Document Object Model (DOM). Dentre estas tecnologias o nico elemento novo o XMLHttpRequest,
e mesmo assim ele no to novo quanto parece.
O XMLHttpRequest surgiu pela primeira vez em 2000, criado pela Microsoft para ser usado no Outlook Web
Access. Em 2002 a Mozilla incorporou o objeto em seus browsers e somente em 2006 foi lanado o primeiro
draft na W3C. Neste ponto d inicio o grande hype da Web 2.0 e o AJAX comea a ser amplamente
utilizado.
Conceitualmente, AJAX significa Asynchronous JavaScript and XML ou Javascript Assncrono e XML, mas na
prtica possvel utilizar objetos com notao JSON (JavaScript Object Notation) tambm, ao invs de XML.
Mais adiante vou discutir as vantagens e desvantagens disto. O grande conceito de AJAX permitir que o
cliente se comunique com o servidor atravs deste request, que realizado em segundo plano, sem
recarregar a pgina, efetivamente unindo a tecnologia client-side com a tecnologia server-side e
potencializando a comunicao.
Ateno: use com moderao! Embora seja algo muito legal, o AJAX no deve ser usado em qualquer lugar, pois,
ao invs de ajudar, pode tornar truncada a experincia do usurio, evite usar AJAX, por exemplo, como sua forma
de navegao principal.
1 = loading (carregando)
2 = loaded (carregado)
3 = interactive (interagindo)
4 = complete (pronto)
Send(content) este mtodo inicia a comunicao com a URL e recebe apenas o parmetro (opcional)
de que contedo deve enviar. Este contedo est em formato de URL, ou seja, var=valor&var2=valor2.
Abort() este mtodo simples e pode ser muito importante, pois finaliza uma requisio que ainda
no retornou qualquer resposta do servidor, e til em casos onde novas requisies podem ocorrer
descartando as anteriores sem respostas, como em campos de auto-complete.
Separei o sistema em trs mdulos: javascript (verde), HTML (amarelo) e PHP (azul), para podermos ver a
interao entre essas linguagens. No mdulo de javascript, ser realizada toda a operao de AJAX
propriamente dita, como demonstrado na figura acima. Para isso, devemos criar 3 funes: uma para criar o
request, uma para enviar a mensagem e outra para receber o retorno e publi
car no mural.
No PHP precisamos de duas funes: uma que receba os dados e grave no banco e outra que formate o
retorno e envie de volta para o javascript. Neste caso, estamos usando XML, mas o uso de JSON ser
demonstrado em futuros artigos. A estrutura do retorno XML proposta a seguinte:
1
2
3
4
5
No HTML teremos apenas um campo de input, um boto e um div que representa o mural.
A figura abaixo demonstra como as funes interagem entre sim, de forma simplificada. Escolhi separar o
sistema em 3 arquivos, onde cada um representa um dos mdulos acima descritos.
14
15
16
17
18
19
20
21
22
}
}
}
if (!request)
alert("Error initializing XMLHttpRequest!");
else
return request;
}
Agora devemos definir a funo que vai enviar estes dados. Esta funo deve chamar a funo anterior para
obter um request, e ento iniciar seu processamento. O prximo passo buscar o texto do campo e montar
a requisio. Usaremos o mtodo POST e, com isso, devemos definir o header de Content-Type, passando o
texto do campo com o nome de varivel msg.
Neste momento, tambm importante definirmos a funo que ser executada ao final da requisio,
usando o onreadystatechange. Para dar um efeito a mais neste momento, tornamos visvel um DIV com o
texto Carregando para que o usurio possa saber que algo est acontecendo.
1
function enviaDados(){
2
//Novo Request
3
linkReq = criaRequest();
4
5
if(linkReq != undefined){
6
//Pegar dados
7 var msgBox = document.getElementById('msgBox');
8
9 //Montar requisio
10
linkReq.open("POST","mural.ajax.php",true);
11 linkReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
12 linkReq.onreadystatechange = recebeDados;
13
14
var params = "msg="+msgBox.value;
15
16
//Carregar DIV de "loading"
17 document.getElementById('loading').style.display = 'block';
18
19
//Enviar
20
linkReq.send(params);
21
22
//Esvaziar form
23
msgBox.value = "";
24
}
25
26
}
Definimos a funo recebeDados como o retorno do request, mas ela ser chamada a cada alterao de
estado. Portanto, precisamos verificar o novo estado para sabermos se o resultado final j foi retornado.
Uma vez confirmado o estado 4, podemos tratar o retorno.
Para isso, como foi definido o retorno em XML, leremos os dados da varivel responseXML, lendo os campos
atravs de DOM e inserido este retorno no DIV, dentro de uma DIV prpria da mensagem. Esta manipulao
toda feita atravs de DOM com funes que esto disponveis desde o incio dos browsers.
1
function recebeDados(){
2
3 //Verificar pelo estado "4" de pronto
4 if (linkReq.readyState == '4'){
5
6
//Pegar dados da resposta XML
7
var xmlRes = linkReq.responseXML;
8
9 //Verificar erro
10
var erro = xmlRes.getElementsByTagName('erro');
11
12
if (erro[0].firstChild.nodeValue == '1'){
13 alert("Erro no retorno"+erro[0].firstChild.nodeValue);
14 }else{
15 //Pegar mensagem
16 var msg = xmlRes.getElementsByTagName('item');
17
18
//Pegar DIV destino
19 var targetDiv = document.getElementById('msgList');
20
21
//Montar Nova msg
22
var mDiv = document.createElement('div');
23
mDiv.id = "msg_"+msg[0].id;
24
mDiv.innerHTML = msg[0].firstChild.nodeValue;
25
26
//Adicionar ao destino
27
targetDiv.appendChild(mDiv);
28
29 //Remove loading
30 document.getElementById('loading').style.display = 'none';
31
}
32
33
}
34
}
3.3 Mdulo PHP
Este mdulo simples e, na verdade, pode ser substitudo por qualquer linguagem server-side. Como uma
requisio AJAX nada mais do que uma requisio normal feita em segundo plano, o nosso arquivo PHP
trabalha como qualquer outro script, recebendo dados, processando e retornando, sendo a nica diferena
que vamos retornar XML e no HTML.
Ao invs de criar duas funes como defini anteriormente, vou apenas implementar um script de forma
estruturada que execute as aes das duas funes. A primeira parte deve receber os dados e gravar em
banco, utilizei neste exemplo um banco mysql e as funes normais de mysql para no complicar muito o
aprendizado. A segunda parte deve pegar os mesmos dados e convert-los em uma sada XML, de acordo
com o padro que escolhemos.
1 //Conexo com banco
2 $db = mysql_connect("localhost","user","senha");
3 $db_selected = mysql_select_db('phpajax', $db);
4
5 //Simular processo demorado para vermos o carregando (descartar em produo)
6 sleep(3);
7
8
//Receber dados
9 //Gravar no banco
10
$sql = "INSERT INTO mural (msg) VALUES ('".$_POST['msg']."')";
11
$res = mysql_query($sql);
12
13
//XML de Retorno
14
$xmlDoc = new DOMDocument('1.0','iso-8859-1');
15 $response = $xmlDoc->createElement('response');
16 $response = $xmlDoc->appendChild($response);
17
18
//Elemento de erro
19 $erro = $xmlDoc->createElement('erro',($res)? "0":"1");
20 $erro = $response->appendChild($erro);
21
22
//Elemento item
23 $item = $xmlDoc->createElement('item',$_POST['msg']);
24 $item->setAttribute('id',mysql_insert_id());
25
$item = $response->appendChild($item);
26
27
header('Content-Type: application/xml');
28
29
echo $xmlDoc->saveXML();
3.4 Mdulo HTML
Como descrito vrias vezes, este simples arquivo tem um DIV de carregando, um DIV que ser o Mural e um
campo de input com boto, sem o uso de um form, pois os dados so obtidos diretamente pela funo
enviaDados.
1 <script src="mural.funcs.js"></script>
2 <div id="form"><textarea id="msgBox" cols="10" rows="3"></textarea>
3
4 <input onclick="enviaDados();" type="button" value="Enviar" /></div>
5 <div id="loading">Carregando...</div>
3.5 Produto Final
Para ver o produto final funcionando, verifique o endereo abaixo:
http://hosted.rafaeldohms.com.br/cursos/php_ajax/pratica1/mural.php
E faa download do cdigo fonte neste endereo:
http://hosted.rafaeldohms.com.br/cursos/php_ajax/php_ajax_pratica1.zip
Este exemplo como eu disse, apenas apresenta os dados uma vez enviados, e no mostra novamente os
mesmos quando a pgina re-carregada.
Consideraes finais
Neste primeiro artigo, espero ter apresentado a todos o que realmente AJAX e dissolvido alguns dos mitos
que circulam por toda internet em relao tecnologia. Considero o AJAX parte fundamental da internet e
pea importante no desenvolvimento de sites que aproximem o usurio e tornem sua experincia na web
algo mais natural e intuitivo. Por isso, seu aprendizado algo muito importante e saber usar este recurso de
forma crua qualifica o profissional e pode auxiliar muito na hora do aperto. Em um prximo artigo
(programado para Setembro), irei me aventurar no mundo dos frameworks, mostrando como obter uma
maior produtividade em seus trabalhos, facilitando muito o as tarefas dirias.
Caso tenham alguma dvida ou problema, sintam-se a vontade para visitar meu blog ou utilizar o contato
abaixo, pois estarei disponvel para tirar qualquer dvida.