Weblosofia com CSS, Jquery, Javascript, Ajax, PHP etc.
por Alexandre Magno
Postado em Janeiro 22nd, 2008 por Alexandre Magno
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.
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:
Vamos ao código:
$("#carregando").hide(); $("#carregando").ajaxStart(function(){ $(this).fadeIn('fast'); $('#erro_form').fadeOut('fast'); }); $("#carregando").ajaxStop(function(){ $(this).fadeOut('fast'); }); //validando o formulário $('#erro_form').hide(); function validar(formData,jqForm,options) { var check = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/; var nome = $('input[@name=nome]').fieldValue(); var email = $('input[@name=email]').fieldValue(); var assunto = $('input[@name=assunto]').fieldValue(); var mensagem = $('textarea[@name=mensagem]').fieldValue(); var status = ""; if(!nome[0]) { status += ' <li>O nome está vazio</li> '; } if(!email[0]) { status += ' <li>E-mail vazio</li> '; } if(!check.test(email[0])) { status+=' <li>E-mail inválido</li> '; } if(!assunto[0]) { status += ' <li>O campo assunto está vazio</li> '; } if(!mensagem[0]) { status += ' <li>O campo mensagem está vazio</li> '; } if(status!="") { $('#erro_form ul').empty(); $('#erro_form').fadeIn('slow'); $('#erro_form ul').append(status); return false; } } // Callback do retorno do ajax; function resultado(responseText,statusText) { $('#erro_form').empty().hide(); var resultado = $('resposta',responseText).text(); if(resultado) { $('#erro_form').append(' e-mail enviado com sucesso, aguarde que entrarei em contato ').fadeIn('slow'); } else { $('#erro_form').append(' Não foi possível enviar o e-mail ').fadeIn('slow'); } $('#form_contato').resetForm(); } $('#form_contato').ajaxForm({ url: '/portfolio_dev/site/enviar', beforeSubmit: validar, dataType: 'xml', success: resultado, type: 'POST' });
Tudo que foi visualizado e executado no formulário de contato mostrado foi feito com este código.
Vamos a explicação:
No próximo post irei mostrar como seria enviado este mesmo formulário utilizando o ajaxForm em conjunto com o validate.
Artigos relacionados
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
Ricardo comentou:
29th Agosto, 2008 às 5:29 pm
Como fazer para que o formulário não seja exibido novamente quando os dados forem preenchidos de forma correta, ou seja, que abra uma outra página?
Parabéns pelo artigo. Excelente!
Alexandre Magno comentou:
29th Agosto, 2008 às 11:41 pm
@Ricardo: Muito obrigado! Você pode especificar uma propriedade target e passar o id do form para atualizar o formulário e o retorno ao invés de ser um xml, ser um pedaço de html com a parte da página que será substituida. Espero ter ajudado, abraços e boa sorte.
Ricardo comentou:
1st Setembro, 2008 às 5:27 pm
Sim você ajudou muito. Já realizei os testes com essas alterações e está OK! Obrigado!
david comentou:
22nd Setembro, 2008 às 3:18 pm
Muito bom o post.
Rodrigo comentou:
3rd Outubro, 2008 às 12:12 pm
o link http://www.alexandremagno.net/portfolio_dev/site/contato não está funcionando.
Alexandre Magno comentou:
3rd Outubro, 2008 às 12:43 pm
@Rodrigo: Desculpe pelo ocorrido, estou resolvendo este problema com a hospdedagem, isto aconteceu depois que solicitei a migração para PHP 5. Creio que até segunda estará funcionando normalmente.
Rodrigo de Oliveira comentou:
3rd Outubro, 2008 às 1:06 pm
hummm, então tem como me enviar por email os códigos?
Junio gonzaga comentou:
21st Novembro, 2008 às 9:44 am
alexandre, parabéns pelo post, pelo blog e pelo seu site… Sou programador em PHP e iniciante em jquery…poderia disponibilizar para que eu possa estudar e ver como é que funciona apos o post do form ( no caso , o que acontece quando a URL ‘/portfolio_dev/site/enviar’ é chamada? ) como é o arquivo php que gera o xml?
Seria de muita valia para mim…Desde já agradeço
Alexandre Magno comentou:
21st Novembro, 2008 às 10:31 am
@Junio: o recebimento do post pelo PHP seria exatamente o mesmo se não fosse por ajax. O modo como o PHP deve retornar já está implícito na função resultado, que trata o retorno. Basicamente ele navega em um nó de XML com a tag resposta, sendo assim a estrutura que o PHP irá retornar tem um nó principal com a tag resposta e um valor dentro.
O valor irá retornar 1 ou 0 que correstponde ao sucesso e falha. Só não esqueça de levar em consideração que o tipo de retorno tem que ser xml, então o content-type no arquivo PHP tem que vir logo no início.
De qualquer forma, vou colocar o XML retornado neste post para ficar melhor o entendimento.
Espero ter ajudado, abraços…
Renato Lira comentou:
8th Julho, 2009 às 11:20 pm
Olá Magno… Parabéns pelo acervo cara, esta sendo de grande valia pra mim seu site
agora tenho uma dúvida…
o arquivo PHP que vai efetivar o envio do e-mail esta no sub-diretorio da linha 89 (portfolio_dev/site/enviar) ou eu estou viajando ?! (shuaihsi)
é pq na verdade sou beeem iniciante no assunto..
desde ja obrigado ![]()
Alexandre Magno comentou:
9th Julho, 2009 às 9:49 am
@Renato: Obrigado, fico feliz que tem sido útil em seus projetos. Recomendo que leia o post http://www.alexandremagno.net/blog/2009/04/04/controle-completo-de-formularios-ajax-form-e-validate/ que possui a integração completa entre o Validate e o Ajax Form. Por eu ter usado uma framework cakePHP (e qualquer MVC funcionaria similar) a url é mapeada, então na verdade esta url é um arquivo php, ou seja, você deverá passar o arquivo que irá receber os dados via post. Espero ter ajudado. Abraços e sucesso…
Junior comentou:
6th Agosto, 2009 às 9:48 am
Alexandre, como eu faria para executar o form com um evento click. A idéia seria de acordo com o botão clicado usar um option diferente.
Abraço
Alexandre Magno comentou:
6th Agosto, 2009 às 11:44 am
@Junior: Eu não entendi muito bem o que você quer fazer. Abraços…
Junior comentou:
6th Agosto, 2009 às 5:40 pm
A idéia é a seguinte…
Eu colocar dois botões só que cada botão submeter com options diferentes. Por exemplo um botão usar a url: incluir.php e a outra salvar.php
Alexandre Magno comentou:
6th Agosto, 2009 às 9:16 pm
@Junior: Não seria melhor enviar os dois para o mesmo lugar e o server trataria de acordo com o que foi passado no form. Exisste realmente a necessidade de separar a logica de envio em dois arquivos?
Espero ter ajudado e abraços…
Jeovane comentou:
28th Dezembro, 2009 às 8:28 pm
Primeiramente gostaria de parabenizar pela iniciativa, seus tutoriais são ótimos
No entanto estou tendo um pequeno problema ao usar esse script que voce explicou acima.
Tenho um formulário de cadastro que tem como action para cadastrar os dados no banco um outro arquivo cad_usuario.php, e dentro desse arquivo tem um consulta que não deixa cadastrar mais de um CPF igual e ele dá um HEADER para uma pagina quando realizo um cadastro com sucesso, no entanto, usando esse script acima quando tento realizar um cadastro com um mesmo CPF igual ele não cadastra no entanto não me dá nenhuma mensagem dizendo que o CPF já está no banco, e quando realizo um cadastro com sucesso ele não dá o HEADER.
Então eu gostaria de saber o que que eu tenho que fazer para corrigir esses dois problemas.
Alexandre Magno comentou:
4th Janeiro, 2010 às 1:20 pm
@Jeovane: Olá, fico feliz que esteja sendo útil os tutoriais. Primeiro de tudo o que você quer dizer com o header? Você especifica um cabeçalho no php e verifica no retorno da requisição? Caso positivo esta não é a melhor forma de lidar com esta situação.
Qual o retorno quando já existe o CPF?
Marcondes comentou:
23rd Abril, 2010 às 11:44 am
Este plugin é free???
Mavi comentou:
5th Maio, 2010 às 7:00 pm
Alexandre meus parabéns, como sempre pelo alto valor técnico de seus posts e da facilidade de entendimento com suas explicações! Bom, algumas coisas que notei no seu outro site alexandremagno.net que tem esse mesmo formulário, é que lá onde tem o caminho pro form, no action, é vazio! claro, se tem essa opção é porque na liha 88 está o caminho para o script em php, url: ‘/portfolio_dev/site/enviar’, e só pra esclarecer mesmo, se não estivesse usando cake, aqui seria o caminho do script php né?! Outra coisa que notei é que aqui você fez o reset, mas não ficou faltando o submit não?! tipo:
$(’#form_contato’).submit(function(){
return false;
});
});
Alexandre Magno comentou:
6th Maio, 2010 às 7:24 pm
@Mavi: Fico muito feliz que tenha gostado. Bem, eu não coloquei no action do form por que nesta versão usada no site não estava funcionando corretamente, mas nas versões mais recentes do plugin não tive este problema, é até melhor por que você não precisa se preocupar com caminho, além de ser totalmente não obstrusivo (pode funcionar sem o javascript, pois o post poderá ser dado normalmente).
Em relação ao submit, o próprio ajaxForm internamente realiza este evento.
Um grande abraço…
Mavi comentou:
21st Maio, 2010 às 8:15 pm
Caro Alexandre Magno, só tem um probleminha, é que estou tendo dificuldade com o script em php. Claro entendi tudinho da parte do jQuery form plugin e ficou muito bem explicado. também estive lá na página do plugin e li muita coisa só não acertei no script php. Tentei vários, inclusive os que já tenho funcionando, mas nenhum funcionou corretamente, será que você poderia disponibilizar aqui o script php que você usou para o plugin funcionar corretamente?
Abraço!
Alexandre Magno comentou:
22nd Maio, 2010 às 7:08 pm
@Mavi: vou disponibilizá-lo e colocar neste post.
Os seguintes campos estão incorretos ou faltando