Prototype é uma biblioteca javascript bastante utilizada, mas que pra mim nunca chamou atenção (ao contrário do JQuery), mas como tenho utilizado o CakePHP e em sua estrutura de Helpers ele usa esta biblioteca, tive de “perder” um tempinho estudando-a.
Para isso, fiz como meu amigo PorKaria e montei um sisteminha simples de comentários (na verdade o dele era o guestbook, mas no fim fazem a mesmo coisa, hehehe).
Descrição do sistema:
Sistema usando AJAX (na verdade o X aqui é de XHTML, porque não utilizo XML) Permite a inserção de comentários, salvando-os em um banco de dados (MySQL), tudo de forma assíncrona. A bibliote utilizada para implementação da parte em javascript é a Prototype, a formatação (CSS) foi retirada de um tutorial do Tableless sobre formatação de formulários e o PHP foi escrito por mim. Além do cadastro, fiz o que pode se chamar início de um sistema de busca com sugestão (famoso autocomplete). Digo o início porque ele não avalia bem o momento de se fazer a busca e não é possível clicar nos resultados, apenas vê-los.
Estrutura:
- main.php : é a página onde está todo o sistema, apartir dela que é feito a leitura dos comentários e o envio de novos comentários;
- adiciona_comentario.php : nesta página fazemos o processamento dos dados vindos do formulário e os salvamos no banco;
- le_comentario.php : arquivo que recupera do banco todos os comentarios e retorna os dados em uma lista html;
- busca_comentario.php : script que faz a busca dos comentários no banco para o “autocomplete” e retorna-os como uma lista;
- validation.class.php : velho conhecido que faz a validação dos dados… a classe ainda está em implementação, mas já está mais completa do que a versão anterior que compartilhei.
Irei comentar apenas a parte javascript, qualquer dúvida sobre o restante, deixe nos comentários ou email-me.
//Funcao que recupera os dados do banco para apresentar ao usuário
function recupera(){
new Ajax.Updater('comentarios', 'adiciona_comentario.php');
};
O trecho acima define uma função que cria uma nova instância de Ajax.Updater, que fará uma chamada ao arquivo adiciona_comentario.php e usará a resposta para substituir o conteúdo da tag XHTML com ID ‘comentarios’. Ou seja, é essa função que ira carregar os comentários feitos na página.
//Funcao que envia os dados do formulário para serem salvos no banco
function envia(){
new Ajax.Request('adiciona_comentario.php',
{
method: 'post',
parameters: $("adiciona").serialize(),
onCreate: function() {
$('adiciona').hide();
$('enviando').show();
},
onSuccess: function(transport){
$('enviando').hide();
$('adiciona').show();
recupera();
},
onFailure: function(){ alert('Alguma coisa não deu certo...') }
});
}
Este outro trecho define a função envia os dados do formulário para o arquivo adiciona_comentario. Aí é utilizado o objeto Ajax.Request, que é a implementação mais genérica do Prototype para Ajax.
O que é passado para o objeto:
- O arquivo que receberá a requisição
- Aqui vem o segundo parâmetro que é composto por vários subparâmetros
- Método de envio: POST;
- Variáveis enviadas: utilizo a função ‘serialize()’ no formulário, ela transforma os dados dele em uma lista de variáveis, entendíveis pelo navegador e PHP;
- Uma função callback que é disparada quando é criado a requisição. Uso ela para mostrar uma mensagem ‘Enviando…’;
- Uma função callback que é disparada quando é concluído com sucesso a requisição. Ela esconde a mensagem mostrada anteriormente e chama a função ‘recupera()’ para recarregar os comentários;
- Por última uma função callback que é disparada quando ocorre um erro na requisição.
//Funcao que faz uma busca em Ajax e retorna os resultados como em um autocompletar
function fazBusca(event){
new Ajax.Request('busca_comentario.php',
{
method: 'post',
parameters: $('termo').serialize(),
onCreate: function() {
$('resultados').hide();
},
onSuccess: function(transport){
$('resultados').update(transport.responseText);
$('resultados').show();
},
onFailure: function(){ alert('Alguma coisa não deu certo...') }
});
}
Aqui uma função que faz a busca pelos termos digitados. Utiliza o mesmo objeto da função anterior, o Ajax.Request, então não entrarei em detalhes.
//Evento que é disparado quando o documento termina de carregar sua estrutura
document.observe("dom:loaded", function() {
$('enviando').hide();
$('carregando').hide();
$('resultados').hide();
recupera();
$('busca').observe('keydown', fazBusca);
});
Por ultimo utilizo a função ‘observe()’ no elemento ‘document’ para que após concluída o carregamento da página (não incluído aí o carregamento de possíveis imagens), execute alguns comandos:
Com a função ‘hide()’ escondo os elementos de aviso ao usuário;
Com a última linha, faço com que sempre que uma tecla for pressionada (keydown) no elemento com ID ‘busca’, execute a função ‘fazBusca’.
Um bônus:
Muitas pessoas enfrentam problemas com codificação quando trabalham com AJAX, para poupar dores de cabeça é recomendado o uso de UTF8 tanto no seu editor de texto (na hora de criar os códigos), quanto nos header dos documentos e no banco de dados. Tendo certeza que está tudo em UTF8, você provavelmente não terá problemas. Só não esqueça de um detalhe: o PHP não trabalha nativamente com UTF8, então, antes de usar qualquer função que trate uma string, use a função utf8_decode do PHP e depois, mas antes de salvar no banco de dados, utilize a função utf8_encode. Isso será necessário até o lançamento do PHP 6.
Download de todos os arquivos do exemplo.
obs.: descompacte os arquivos numa mesma pasta, em seguida crie um novo diretório chamado ‘lib’ e mova o arquivo validation.class.php para ele.
8 respostas em “AJAX com Prototype”
Ow, deixei um link para seu blog em um de meus mtos blogs q nao atualizo:
http://zerooneworld.blogspot.com/
😀
Coloca a logo do PHP MS aí, igual fiz no meu 😀
[]s
mto bacana seu blog, dei uma olhada nos links e achei coisas interessantes *-*
Obrigado… é difícil atualizar, mas quando faço, faço realmente porque gosto ;P
Legal, vou dar uma estudada nessa parada…
Em que diretorio coloco as pastas do ajax?
Prciso saber qual é a pasta base do cake?
Grata
@Margareth
Não sei se entendi muito bem sua dúvida, vamos lá:
As pastas do ajax que você se refere são as do exemplo e você gostaria de usa-los no CakePHP?
Bom, o exemplo não foi feito para o CakePHP, não utiliza sua estrutura e lógica, só usa a mesma biblioteca de javascript que o CakePHP usa. Então se você desejar usar as funções javascript do exemplo junto com o CakePHP, coloque os arquivos que contém elas dentro da pasta “sua_pasta_raiz/app/webroot/js/”. Daí para utilizar elas você terá de desenvolver os controladores e pra tratar as requisições e as visões para mostrar os resultados.
Caso não seja essa sua dúvida, sinta-se a vontade para faze-la novamente.
Atenciosamente.
Brother, show de bola seu post, mas faltou o arquivo para criação do banco de dados.
Abraço,
Muito bom seu post cara!
Valeu pela iniciativa de compartilhar seu conhecimento.
Também tento fazer este tipo de retribuição em meu blog.
Abraço.