Categorias

Arquivos

Ajax form

Postado em Janeiro 22nd, 2008 por Alexandre Magno

projetos jQuery, Ajax, Jquery

Vou falar neste post sobre um plugin para jQuery que deve ser aprendido como parte de sua documentação: o jQuery form plugin

Ele é muito útil para enviar formulário usando ajax, além de controlar a validação client-side de maneira triunfante. Se você não tem idéia de como usar o jQuery para pegar os valores do formulário de uma maneira fácil para ser passado pelo método $.post do jQuery, ou usa o método value() para fazer isto, depois deste plugin você vai fazer isto de uma maneira muito mais eficiente.

Exemplo ilustrativo

Para vocês entenderem o que estou falando, acessem este link: http://www.alexandremagno.net/portfolio_dev/site/contato. Tentem enviar o formulário sem preencher nenhum campo, ou deixando campos vazios e e-mail incorretos. O formulário fez a validação de uma maneira bonita, simples e intuitiva. Isto pode ser totalmente configurado para o plugin, a imaginação é o limite ;-) .

Preencha corretamente o formulário e envie(aproveite e deixe uma mensagem para mim :-) ). Ele foi enviado usando ajax, com todos os campos passados para o jQuery, processados pelo php, retornado pelo XML e devolvido ao usuário. Tudo feito pelo plugin. Tentem enviar também sem preencher algum campo ou digitar um e-mail não válido, ele irá mostrar uma validação eficiente e personalizável.

Se deseja então pegar os valores do formulário via javascript para passar para o php com o ajax, além disso tudo externamente, sem usar scripts inline, esta é a solução ideal. Vou colocar o script aqui e explicar o seu código. Não se esqueça que os passos necessários para ele funcionar não ilustrei aqui por ser bastante trivial e ter abordado em outros posts, como inserir no head a framework jQuery e o plugin, que pode ser baixado no seguinte endereço:

jQuery Form Plugin

Vamos ao código:

  1. $("#carregando").hide();
  2.  
  3. $("#carregando").ajaxStart(function(){
  4. $(this).fadeIn('fast');
  5. $('#erro_form').fadeOut('fast');
  6. });
  7.  
  8. $("#carregando").ajaxStop(function(){
  9. $(this).fadeOut('fast');
  10. });
  11.  
  12. //validando o formulário
  13. $('#erro_form').hide();
  14. function validar(formData,jqForm,options) {
  15.  
  16. var check =
  17. /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
  18. var nome = $('input[@name=nome]').fieldValue();
  19. var email = $('input[@name=email]').fieldValue();
  20. var assunto = $('input[@name=assunto]').fieldValue();
  21. var mensagem = $('textarea[@name=mensagem]').fieldValue();
  22. var status = "";
  23.  
  24. if(!nome[0]) {
  25.  
  26. status += '
  27. <li>O nome está vazio</li>
  28.  
  29. ';
  30.  
  31. }
  32. if(!email[0]) {
  33. status += '
  34. <li>E-mail vazio</li>
  35.  
  36. ';
  37. }
  38. if(!check.test(email[0])) {
  39. status+='
  40. <li>E-mail inválido</li>
  41.  
  42. ';
  43. }
  44. if(!assunto[0]) {
  45. status += '
  46. <li>O campo assunto está vazio</li>
  47.  
  48. ';
  49. }
  50. if(!mensagem[0]) {
  51. status += '
  52. <li>O campo mensagem está vazio</li>
  53.  
  54. ';
  55. }
  56. if(status!="") {
  57. $('#erro_form ul').empty();
  58. $('#erro_form').fadeIn('slow');
  59. $('#erro_form ul').append(status);
  60. return false;
  61. }
  62. }
  63.  
  64. // Callback do retorno do ajax;
  65. function resultado(responseText,statusText) {
  66.  
  67. $('#erro_form').empty().hide();
  68. var resultado = $('resposta',responseText).text();
  69. if(resultado) {
  70.  
  71. $('#erro_form').append('
  72.  
  73. e-mail enviado com sucesso, aguarde que entrarei em contato
  74.  
  75. ').fadeIn('slow');
  76.  
  77. }
  78. else {
  79. $('#erro_form').append('
  80.  
  81. Não foi possível enviar o e-mail
  82.  
  83. ').fadeIn('slow');
  84. }
  85. $('#form_contato').resetForm();
  86.  
  87. }
  88.  
  89. $('#form_contato').ajaxForm({
  90. url: '/portfolio_dev/site/enviar',
  91. beforeSubmit: validar,
  92. dataType: 'xml',
  93. success: resultado,
  94. type: 'POST'
  95. });

Tudo que foi visualizado e executado no formulário de contato mostrado foi feito com este código.

Vamos a explicação:

  • Linhas 1 a 7: Aqui não é um método específico do plugin, mas sim para controlar todas as requisições ajax, como o plugin usa ajax, este método pode ser aplicado normalmente. Há uma div com o id de carregando que inicialmente fica escondida e com método ajaxStart ela é mostrada através do método fadeIn. o ajaxStart é executado quando uma requisição httprequest está em processamento e ainda não foi finalizada. Reparem que na linha 8 é ocultada uma div com id erro_form. Esta div contém as mensagens de validação e é ocultada para evitar que ela seja mostrada quando o e-mail está sendo enviado. Se você enviar diretamente, sem nenhum erro, esta linha não executará nenhuma ação, no entanto, no caso dela estar mostrada, ela será escondida e ao mesmo tempo aparecerá uma tela de carregando para alertar o usuário que o e-mail está sendo enviado.
  • Linhas 8 a 10: O método ajaxStop é executado quando a requisição httprequest é finalizada. Assim a div com o id de carregando é escondida após o final da requisição.
  • Linha 13: Esta linha esconde inicialmente a div com id erro_form. Quando houver algum erro de validação, ela será mostrada.
  • Linhas 14 a 61: Estas linhas merecem uma atenção especial. Esta função é um callback do plugin, e será especificada na sua inicialização e será executada antes do formulário ser enviado por ajax. Os erros de validação no lado cliente serão especificadas nesta função, caso ela retorne falso, o formulário não será enviado, do contrário ele será enviado e será executada outra função que falaremos mais abaixo. Os parâmetros passados não serão usados para este script por que serve para fazer uma validação mais geral e neste caso será mais personalizado. O parâmetro formData, por exemplo, armazena em um array todos os valores do formulário, mas ao invés disso eu usei o médodo fieldValue() do próprio plugin. Este plugin é bastante versátil e possui várias maneiras de se atingir o mesmo objetivo.
    • Linha 16: Aqui será passada a variável verificaEmail uma expressão regular que verifica a validade do e-mail.
    • Linhas 17 a 20: Os dados do formulário são pegos através do método fieldValue() que retorna um array com os valores dos campos escolhidos pelos seletores.
    • Linha 21: Coloco a variável status como uma string vazia, pois ela irá ser concatenada de acordo com a quantidade de erros
    • Linha 23 a 54: Os dados preenchidos são comparados e verficiados se são vazios e assim a variável status vai sendo acumulada de acordo com a quantidade de campos vazios. Repare que há valores somente de campos únicos, o que retorna um array de um valor.
    • Linha 55 a 60: Se o status foi preenchido, a div erro_form é preenchida com o valor de status(uma string com uma lista não ordenada) e assim é dado um fadeIn para visualização do usuário e é dado um return false para o formulário não ser enviado, caso não entre nesta estrutura condicional, o plugin irá executar um callback de sucesso mostrado abaixo.
    • Linha 64 a 86: Este é a função a ser executada quando o plugin passa sem problemas pela função anterior. Aceita dois parâmetros: responseText(retorno do ajax, que pode ser json, xml, html etc.) e o statusText(se estiver tudo ok ele equivale a success). O responseText, neste caso, foi um xml com um nó chamado resposta que contem verdadeiro ou falso, caso o e-mail tenha sido enviado ou não. Este retorno é manipulado via jQuery de acordo com o contexto. Quando você navega pelo dom usando os seletores jQuery, normalmente passamos apenas um parâmetro, nisto está implícito que o contexto é o documento(document). No entanto, o programador pode selecionar de acordo com outros contextos, como o body, uma div e no caso de um xml retornado por ajax, o contexto seria o objeto de retorno(neste caso o contexto seria o nó principal). Ficou confuso? Acho que esse assunto merece um post especial.
      O retorno do xml foi armazenado na variável resultado e caso seja verdadeiro, é retornado ao usuário uma mensagem de sucesso, do contrário, um aviso de que algo deu errado.
    • Linhas 88 a 94: O método que prepara o formulário para ser enviado por Ajax. Aceita como parâmetro um objeto com as configurações, neste caso, foi passada a url, a função a ser executada para validação e a função a ser executada no retorno. Se não for especificada alguma url, o padrão será o action do form.

No próximo post irei mostrar como seria enviado este mesmo formulário utilizando o ajaxForm em conjunto com o validate.


Comentários

Assine o RSS para comentários

Rangel Viotti comentou:

10th Fevereiro, 2008 às 10:17 am

Cavalheiros. Tudo muito legal mas eu tenho uma única dúvida:

se eu tivesse vários…

Selecione
Opção 01
Opção 02
Opção 03
Opção 04
Opção 05
Opção 06
Opção 07

Como eu poderia usar o jquery para validar as option lists????

admin comentou:

11th Fevereiro, 2008 às 8:19 am

@Rangel: Eu não testei com o ajaxForm, mas seria o mesmo raciocínio de um input, use o método fieldValue que retornará um array de opções.

Hebert comentou:

27th Março, 2008 às 10:38 am

Parabéns pelo post.

No caso, aguardo se novo artigo utilizando jform com jvalidate, pois estou penando para trabalhar com os dois em conjunto…

admin comentou:

27th Março, 2008 às 11:47 am

@Hebert: Obrigado cara, desculpe pela demora, vou ver se adianto ele para publicar neste fim de semana…

Odilon comentou:

28th Abril, 2008 às 10:40 pm

Excelente artigo Alexandre. Muito bom o exemplo. Como faço para copia-lo ? Quando uso copy/paste, vem junto várias linhas com “#” no inicio.
Grato, Odilon

admin comentou:

29th Abril, 2008 às 12:18 pm

Estou indo dar uma reformada no blog e irei instalar o plugin para visualizar o texto “puro” (plain text). Peço desculpas.
Mas o legal é você digitar o código e personalizar a sua maneira, assim fica melhor de aprender, isto falo por experiência própria…
De qualquer forma, estou dando uma reforma geral no blog para melhorar certos aspectos de acordo com o feedback de vocês.
Abraços e obrigado!

Odilon comentou:

1st Maio, 2008 às 12:15 pm

Claro, você está certissimo. Foi só uma pequena preguiça.

Mas tenho algumas dúvidas; sou um velho dinossauro, inexperiente em Web, naveguei por seu site (muito bem feito, por sinal) e verifiquei que você utiliza o CakePHP. Não conheço essa ferramenta, mas deve ser muito interessante e como também não conheço o jQuery, gostaria de entender algumas coisas:

A URL de acesso ao seu site é:”http://www.alexandremagno.net”, que logo encaminha para “/portfolio_dev/site.”
Bom, o link para a página de contato é fácil de identificar:

admin comentou:

5th Maio, 2008 às 10:14 am

@Odilon: Muito obrigado cara. Aquele site foi a primeira experiência que tive com o cakePHP e aprendi que só com a mão na massa para aprender as coisas. O encaminhamento da URL se deve a estrutura de diretórios mesmo, por que tenho o blog e o site. Mas o cakePHP trabalha com urls deste tipo. portfolio_dev é onde fica o site e a pasta site é um ‘controller’ que dispara uma ação (index subentendida). Compliquei? A estrutura de url do cakePHP é sempre na forma ‘/controler/action/restante’. Difícil explicar muito com um comentário só :-). Você pode dar uma olhada em http://www.cakephp.com.br/ . Espero ter ajudado. Abraços e boa sorte!

Odilon comentou:

5th Maio, 2008 às 11:11 pm

Eu quem agradeço Alexandre. Seus posts são muito úteis.
Meu formulário de envio de email já está ativo !!! Sem cakePHP… mas funcionando!
Abusando, reparei que sempre que há algum erro no jQuery, por exemplo numa chamada com parâmetros inválidos, ficamos sem saber o que está acontecendo.
Tem como ligar algum “debug” ou algo semelhante, para acompanhar o que está acontecendo e facilitar a depuração de erros?
Outra dúvida, não consigo enviar emails com a função nativa mail(). Meu provedor não aceita envio de emails sem autenticação. Qual função com autenticação de emails você sugere ? Estou em dúvidas quanto à phpMailer e a mimemessage.

Grato, Odilon

admin comentou:

6th Maio, 2008 às 10:58 am

Esse erro no jQuery acho que se deve por que a página é atualizada e justamente o script se “perde” neste tempo. eu já usei o phpMailer e achei muito bom.
Espero ter ajudado e obrigado pela confiança.

Eduardo de Souza comentou:

23rd Maio, 2008 às 10:35 am

Olá amigo adorei o plugin, agora só fiquei com um problema, não sei se vcs já tiverão, o meu retorno é um arquivo Excel, é eu não estou encontrando uma solução para o retorno, quando eu retorno para um DIV ele joga o arquivo todo bagunçado nele. Se poder me ajudar vai ser de um bom agrado, + foi excelente essa solução.

Ruben Zevallos Jr. comentou:

2nd Junho, 2008 às 2:25 am

Cheguei aqui procurando informações sobre Formulários com AJAX e encontrei mais que isso… vou dar uma lida e participar com comentários

Ruben Zevallos Jr. comentou:

2nd Junho, 2008 às 3:16 am

Parece que o http//www.malsup.com/jquery/form/ não está no ar…

Tiago comentou:

1st Julho, 2008 às 12:16 am

ola não entendi algumas coisas, eu tenho que puxar o jquery-form.js na minha pagina e tb adicionar este codigo que, vc colocou, e o form como fica??
quando eu tento acessar este link da um erro:
http://www.malsup.com/jquery/form/

nos exemplos que eu vi não tem o mesmo codigo q vc citou, pq?
obrigado

admin comentou:

2nd Julho, 2008 às 9:56 am

@Tiago: O link as vezes fica fora do ar. Você precisa do js no plugin logo após o jQuery e depois ter um código para a página que contém o formulário que você deseja validar. Mas isto é um script / tutorial para aprender como faz.
Boa sorte e abraços…

Tiago comentou:

3rd Julho, 2008 às 12:29 pm

hum entendi, vou tentar aqui vlwww
parabens pelo tutorial ficou mto bom
obrigado

Deixe seu comentário

Os seguintes campos estão incorretos ou faltando

  • Listagem dos campos faltando
(Não será publicado) * Campos obrigatórios