AJAX com Prototype
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.









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
Citar
[Reply]
mto bacana seu blog, dei uma olhada nos links e achei coisas interessantes *-*
Citar
[Reply]
Dotti Reply:
fevereiro 1st, 2009 at 10:31 am
Obrigado… é difícil atualizar, mas quando faço, faço realmente porque gosto ;P
Citar
[Reply]
Legal, vou dar uma estudada nessa parada…
Citar
[Reply]
Em que diretorio coloco as pastas do ajax?
Prciso saber qual é a pasta base do cake?
Grata
Citar
[Reply]
Dotti Reply:
março 4th, 2009 at 4:55 pm
@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.
Citar
[Reply]
Brother, show de bola seu post, mas faltou o arquivo para criação do banco de dados.
Abraço,
Citar
[Reply]