Apesar de eu ter criado a série de artigos sobre AJAX + CPAINT, estou criando essa nova, com artigos rápidos explicando o uso da Prototype. Segundo o site oficial: "Prototype is a JavaScript Framework that aims to ease development of dynamic web applications.". Melhor explicando:
- É um framework JavaScript, contido em um pequeno e único .js;
- Possui funções de DHTML, shortcuts (exemplo: em vez de document.getElementById(’elementoId’), simplesmente diga $(’elementoId’));
- Uma das abstrações de AJAX mais completas e rápidas de implementar;
- etc.
Bom, faça já o download.
Nesse primeiro artigo da série, uma busca muito, muito simples, com retorno em HTML, para você entender como é a interação da Prototype com o PHP. Na verdade não existe interação (a Prototype é apenas esse pequeno JS!), e sim, uma série de Chamadas (feita por ela) -> Respostas (pelo PHP ou qualquer outra linguagem do lado de servidor que você utilize). Vamos ao código:
busca.php
$Buscar = $_GET[’buscar’];
switch($Buscar)
{
case ’cidade’:
$Retorno = array(’Curitiba’, ’São Paulo’, ’New York’);
break;
case ’dinheiro’:
$Retorno = array(’Milhão’, ’Bilhão’, ’Trilhão’);
break;
case ’desejos’:
$Retorno = array(’Casamento’, ’Família’, ’Riqueza’);
break;
}
if(sizeof($Retorno))
{
foreach($Retorno as $R)
{
$HTML .= ’<li>’ . $R . ’</li>’;
}
$HTML = ’<ul>’ . $HTML . ’</ul>’;
echo utf8_encode($HTML);
}
?>
formulario.html
<head>
<title>PHP e Prototype - #1</title>
<style type="text/css">
<!–
* {
font-family: ’Trebuchet MS’;
font-size: 11px;
}
.ativo {
display: inline;
}
.oculto {
display: none;
}
div {
margin: 10px;
}
–>
</style>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
function Buscar()
{
// Ação que ocorre quando inicia a chamada,
// e quando ela é finalizada
Ajax.Responders.register({
onCreate: function(){
$(’loading’).className = ’ativo’;
},
onComplete: function(){
$(’loading’).className = ’oculto’;
}
});
// A chamada AJAX propriamente dita
new Ajax.Request(’busca.php’,
{
method:’get’,
parameters: $(’formBusca’).serialize(true),
onSuccess: function(transport) {
var response = transport.responseText || "Nada Encontrado";
$(’retorno’).innerHTML = response;
},
onFailure: function(){ alert(’Something went wrong…’) }
});
}
</script>
</head>
<body>
<div id="busca"><form id="formBusca"><input type="text" name="buscar" onblur="Buscar();"/> <span id="loading" class="oculto"><img src="load.gif" border="0"/> Carregando…</span></form> </div>
<div id="retorno"></div>
</body>
</html>
Passo-a-passo
- Como é de se esperar, sempre inclua a prototype:
<script type="text/javascript" src="prototype.js"></script>. - A função $ é um atalho para document.getElementById. Agora acostume-se. Use e abuse!
- Não é necessário declarar nem instanciar nada. Você só chama a prototype quando for utilizá-la. No nosso caso, ela é chamada dentro da função Buscar. A chamada AJAX é simplesmente feita pelo comando:
new Ajax.Requeste, assim inserindo os variados parâmetros. São dezenas deles, que tentarei explicar no decorrer de toda a série. Você pode ver a lista completa na documentação oficial. - Primeiro defino o modo de envio:
method:‘get’,(pode ser ‘post’) . - Os dados que envio:
parameters: $(‘formBusca’).serialize(true),. Nesse caso eu envio todos os campos do formulário. No PHP eles são recebidos simplesmente dentro da variável $_GET (ou $_POST). Exemplo: se no formulário há um campo nome e email, o PHP receberá: $_GET[’email’] e $_GET[’nome’]. - Defino como o retorno será tratado:
onSuccess: function(transport) {. Nesse exemplo o PHP imprime texto com "echo", logo a resposta vem como texto puro, dentro de response.Text. Caso não venha nada, o || é tratado, e a resposta fica "Nada encontrado". O que quer que seja a resposta, eu passo para o div retorno.
var response = transport.responseText || "Nada Encontrado";
$(‘retorno’).innerHTML = response;
}, - E defino um tratamento de erro (caso ocorra perda de conexão, por exemplo):
onFailure: function(){ alert(‘Something went wrong…’). - Logo acima do Request, temos a criação de "Responders". O que fazem? Eles executam uma ação quando um Request é criado e outra quando o Request é destruído. Através dos Responders você pode criar mensagens de "loading" por exemplo, ou alguma outra interação necessária.
Ajax.Responders.register({
onCreate: function(){
$(‘loading’).className = ‘ativo’;
},
onComplete: function(){
$(‘loading’).className = ‘oculto’;
}
});
Veja que na criação, ele exibe o div de loading, e na destruição do objeto, ele oculta. - Simples, não? Veja o PHP como fica limpo. E o JavaScript mais limpo ainda.
Veja esse exemplo em funcionamento. Digite "dinheiro" e aperte TAB, digite "cidade", e depois qualquer coisa.
Referências
- Documentação da API do objeto AJAX: http://www.prototypejs.org/api/ajax
- Introdução ao objeto AJAX, com exemplos: http://www.prototypejs.org/learn/introduction-to-ajax









28/10/2007 às 21:20:53
o arquivo busca.php de exemplo, não funciona..
28/10/2007 às 22:08:48
Olá Adair, se ver o exemplo em funcionamento, tudo está ok. Acontece que no código aqui no artigo, as aspas na verdade estão com acentos ` e não aspa. Copie o código, procure por ` e substitua por aspa simples ‘, que tudo funciona.
O exemplo inclusive é o mesmo código.
Abraços.
30/10/2007 às 13:32:01
No exemplo o arquivo se chama buscar.php e dentro da função vc está chamando busca.php. Acho que por isso que o Adair não conseguiu fazer funcionar.
30/10/2007 às 20:03:24
Obrigado Rafael, bem notado. Eu não havia percebido essa mistura dos nomes.
Corrigido.
Abraços!
26/11/2007 às 16:27:38
opa,
como vc faz para tratar quando acontece um erro no PHP, ou seja, para mostrar a mensagem que o apache retorna com o erro php?
se puder dah um toque no email
valew
13/12/2007 às 18:01:13
Boa tarde, Alfred
Muito bom! Realmente gostei do seu blog
se precisar de algo conta comigo
abraço
05/04/2008 às 10:51:31
tá muito bom e fácil de perceber, já agora pode dizer-me para que serve o ajax.update do prototype?
23/04/2008 às 13:00:35
Eu frequento o 12º do Liceu e ando em informática, contudo agora no ultimo ano tenho que apresentar uma PAT (Prova de Aptidão Tecnológica), o meu assunto incide no ajax, se me puder dar conselhos, agradecia.
Gostei do seu Web Site.
Da-me um aviso no meu email, agradecia.
Sem outro assunto .
30/04/2008 às 19:52:53
Parabens, muito bom o artigo.
21/06/2008 às 10:04:55
Olá, estou pesquisando para usar o ajax. mas não sei com quem usar
CPAINT OU PROTOTYPE O QUE ACHA??
24/08/2009 às 16:10:00
Mesmo com os ajustes indicados, não funciona este exemplo.