Weblosofia com CSS, Jquery, Javascript, Ajax, PHP etc.
por Alexandre Magno
Postado em Abril 04th, 2009 por Alexandre Magno
Melhores práticas, Plugins, jQuery avançado, Jquery
Já expliquei em posts anteriores como usar o validade e como usar o Ajax Form. Agora irei mostrar como os dois em conjunto oferece uma solução completa para controle de formulários, validação cliente, remota e envio de dados por Ajax de uma forma simples, intuitiva, de fácil manutenção e para qualquer situação.
Será usado um exemplo prático com um formulário simples que possui os seguintes campos:
As validações que serão feitas serão as seguintes:
O código da marcação HTML é bem direto:
<form name="validate" id="validate" action="enviar_dados.php" method="post"> <label for="nome">Nome:</label> <input type="text" name="nome" /> <label for="idade">Idade:</label> <input type="text" name="idade" /> <label for="email">E-mail:</label> <input type="text" name="email" /> <label for="pais">País:</label> <select type="text" name="pais"> <option value="">Selecione</option> <option value="brasil">Brasil</option> <option value="canada">Inglaterra</option> </select> <input type="submit" value="Validar" /> </form>
Depois de ter inserido o jQuery, Validate e Form Plugin no cabeçalho, podemos usá-lo para validar o formulário de acordo com as regras estabelecidas. Irei demonstrar o código e depois explicar cada item:
$(function(){
$("#validate").validate({
submitHandler: function(form) {
$(form).ajaxSubmit({
dataType: 'html',
success: response
});
},
rules: {
nome: {
required: true,
remote: 'remote.php'
},
idade: {
required: true,
minAge: 18
},
email: {
required: true,
email: true
},
pais: 'required'
},
messages: {
nome: {
required: 'Você não preencheu seu nome',
remote: 'Este nome ja existe'
},
idade: {
required: 'Você não preencheu sua idade'
},
email: {
required: 'Você precisa preencher um e-mail',
email: 'Endereço de e-mail não válido'
},
pais: 'Você precisa escolher um país'
}
});
});
A diferença deste código em relação ao post anterior sobre o validate é o fato de agora existir uma validação remota. Observe a nova regra 'remote', em que podemos passar uma url que será passado o valor daquele campo (por padrão como get), então ele irá esperar uma resposta no formato JSON com simplesmente um valor true ou false. Neste caso, como no código abaixo ele verifica se já existe um nome 'alexandremagno':
<?php
$nome = $_GET['nome'];
if($nome == 'alexandremagno') {
echo 'false';
} else {
echo 'true';
}
?>
Vale lembrar que este não é um código utilizado na prática, pois é simplesmente como demonstração. No server-side, devemos verificar nomes duplicados de acordo com o banco de dados, então provavelmente seria um select verificando se já existe este nome no banco de dados. O exemplo simples ilustra a situação. Com o este método, poderemos unificar no validate para toda resposta sobre validação, mesmo que seja remota. Não haverá mais desta forma diferenciação entre validação cliente/servidor. Apesar disto, a verificação no back-end deve ser feita (para usuários que não tenha javascript habilitado ou que desabilitem o javascript).
Este método é onde os dois plugins se encontram. Com este método podemos controlar o que irá acontecer no envio do formulário. Quando não é utilizada, ela irá enviar o formulário normalmente. Após utilizá-la, podemos passar o formulário como parâmetro e usá-lo para por exemplo, impedir que o formulário seja enviado e assim podermos utilizar um envio por ajax ou qualquer lógica dependendo da situação. Neste caso nós o utilizamos para chamar o Ajax Form:
submitHandler: function(form) {
$(form).ajaxSubmit({
type: 'post',
success: response
});
},
No sucesso, passamos uma função chamada response que irá enviar os dados e retornar a mensagem de sucesso que será inserida no DOM como se segue:
function response(data) {
$("#validate").resetForm();
$('#mensagem').remove();
var mensagem;
if(data) {
mensagem ='Dados validados com sucesso';
} else {
mensagem = 'Não foi possível validar os dados';
}
$('<div id="mensagem">'+mensagem+'</div>')
.hide()
.insertAfter('h1')
.fadeIn('slow');
}
A função response aceita o parâmetro data que é o retorno da requisição feita por ajax. Vale lembrar que este uso pode ser totalmente não-obstrusivo, pois várias frameworks já possuem métodos em suas classes para identificar a natureza da requisição e retornar o tipo de dado adequado. Neste caso o retorno é uma parte de HTML que pode ser usado para ser inserido no DOM.
Primeiramente usamos um método do Form Plugin que limpa todos os dados do formulário, depois remove qualquer div com o id mensagem para evitar que seja inserida novamente. Logo depois os dados vindos da requisição são inseridos com um efeito fade logo após o título. Tive que utilizar o método hide do jQuery antes, pois o efeito fade pode é percebido em um elemento que esteja inicialmente escondido.
Exemplo da integração do Validate com o Form Plugin
Desta forma, o controle de formulário fica totalmente na responsabilidade desses dois plugins integrados. Para formulários maiores e lógicas mais complexa podemos seguir o mesmo raciocínio sem maiores problemas.
Artigos relacionados
Hugo Senna comentou:
24th Abril, 2009 às 12:31 am
na hora de inserir dados com acentos, nao esta indo corrento para o banco de dados. o que fazer para resolver ?
Alexandre Magno comentou:
24th Abril, 2009 às 12:11 pm
@Hugo: você pode usar o htmlentities como padrão ou modificar o charset na requisição ajax para utf-8. Espero ter ajudado e boa sorte…
Caio comentou:
13th Maio, 2009 às 4:25 pm
Ola Alexandre.
Li reli tentei me matei e ainda não consegui. A validação acontece normalmente porém o evento submit não ocorre.
Meu codigo:
Descrição:
” id=”descricao” title=”Descrição do Nível” />
” />
/*** Ajax ***/
$(’#frmNivel’).validate({
submitHandler: function(form) {
$(form).ajaxForm({
dataType: ‘json’,
success: resposta,
url: ‘cadastra_nivel.php’
});
},
rules: {
descricao: { required: true }
},
messages: {
descricao: “Preencha com uma descrição”
}
});
Caio comentou:
13th Maio, 2009 às 4:26 pm
Ocorreu um erro ai no post acima. O campo eh um input text
Alexandre Magno comentou:
14th Maio, 2009 às 11:13 pm
Os comentário não aceita tags normais. Está ocorrendo algum erro de script que impeça o funcionamento?
Caio comentou:
18th Maio, 2009 às 11:20 am
Acontece que o ‘dataType’ quando colocado ‘json’ nada acontece. Agora seguindo seu exemplo e colocando ‘post’ (que ainda nao descobri porque desse parametro) ai ele funciona mas meu retorno eh diferente e precisaria ser json
Alexandre Magno comentou:
18th Maio, 2009 às 9:39 pm
@Caio: O ‘dataType’ especifica a resposta e a opção type que seria get ou post. Já corrigi o post. Para o tipo json você precisa especificar o callback em que ele será avalidado (http://malsup.com/jquery/form/#api). Espero ter ajudado e boa sorte.
Ricardo comentou:
27th Maio, 2009 às 9:55 pm
Muito bom esse exemplo.
Só estou com uma dificuldade. Estou usando este exemplo em um form de contato, esta validando e enviando blz, só não consegui entender como enviar a mensagem de sucesso?
Abraços
Alexandre Magno comentou:
28th Maio, 2009 às 8:36 pm
@Ricardo: A mensagem de sucesso pode ser manipulada da forma como desejar. Se o retorno do servidor vir sucesso da mesma forma que você manipula para a mensagem. Você pode trazer a resposta diretamente do server ou escrever a string via javascript. Existem várias possibilidade, o importante é você saber como está acontecendo para fazer da forma mais apropriada com a situação. Espero ter ajudado, abraços e boa sorte…
Ricardo comentou:
29th Maio, 2009 às 2:27 pm
O problema é que não manjo muito disso, somente estou querendo usar no meu site.
No seu exemplo de onde e como vem a resposta? pq não consegui localizar.
Abraços
Alexandre Magno comentou:
1st Junho, 2009 às 8:40 pm
@Ricardo: A resposta vem do arquivo enviar_dados.php em que o código está no post no código php. Fiz uma modificação para que você entendesse melhor, por que o objetivo do post aqui é para ensinar e ter uma visão geral, não simplesmente copiar e colar. Espero ter ajudado. Abraços e boa sorte.
Ricardo comentou:
3rd Junho, 2009 às 10:05 am
Alexandre
Agora deu certo.
Obrigado pela atenção e paciência.
Abraços e que Deus te abençoe.
Giovanni Ramos comentou:
22nd Junho, 2009 às 5:26 pm
Salve galera.. eis uma dica, para aqueles que tiveram problemas com acentuação usando o AjaxForm. Resolvi da seguinte forma:
Nas páginas utilizo o charset iso-8859-1, e para gravar CORRETAMENTE no banco de dados, a função utf8_decode().
Diego Rocha comentou:
18th Outubro, 2009 às 4:36 pm
Boa tarde Alexandre Magno, muito bom mesmo, só estou com uma dúvida quanto a forma do select no remote.php, eu uso mysql estou usando o script para cadastro como posso estar fazendo para que o meu select veja todos os registro no banco de dados e mostre se é true ou false somente uma vez, já tentei de tudo mais não esta dando certo.
Deis de já muito obrigado esse post esta sendo de grande ajuda para mim.
Alexandre Magno comentou:
19th Outubro, 2009 às 1:58 pm
@Diego: Olá diego, não entendi muito bem o seu problema. Para o remote, você pode fazer uma conexão no banco normalmente, realizar o select de acordo com os dados passados. Espero ter ajudado, abraços.
Adriana comentou:
30th Outubro, 2009 às 3:05 pm
Parabens pelo conteudo! Eu estou com a mesma duvida do Ricardo… Nao consegui entender como faco para manipular minhas mensagens de sucesso (ou erro) - Meu arquivo sni-edit.php realiza a operacao corretamente no bd como faco o retorno? Ta assim:
$(form).ajax.submit({
dataType: ‘html’,
sucess: resposta}); …
So nao sei manipular a funcao resposta … e para mensagens de erro? Caso algo nao funcione no bd?
})
Alexandre Magno comentou:
1st Novembro, 2009 às 10:33 pm
@Adriana: A função resposta você tem como parâmetro o dado retornado pelo php no seu caso. Ou seja, você precisa ter algum tipo de retorno (seja JSON, XML ou até mesmo html). Se der algo errado por exemplo você pode simplesmente retornar um json e obter os valores desejados por javascript e dar algum tipo de feedback para o usuário. Espero ter ajudado, abraços…
Fernando COsta comentou:
28th Novembro, 2009 às 8:34 pm
http://plugins.jquery.com/project/JQF1
Cara! Da uma olhada nesse plugin! Finalmente um plugin de form style completo! Funciona tudo! input file, selects… tem ate busca em selects… Testei em uma porrada de browser… tudo funcionando!
Alexandre Magno comentou:
30th Novembro, 2009 às 9:19 am
@Fernando: Muito bom Fernando! Bastante completo…
Marcelo comentou:
8th Dezembro, 2009 às 10:31 am
olá Alexandre, O que eu faço com um retorno verdadeiro passar para a próxima pagina dando um submit normal com post e tudo mais? to validando um dado se ele for falso vai aparecer uma mensagem de erro isso ja fiz mas, se ele for verdadeiro eu quero que va para proxima pagina que é uma pagina de consulta como eu faço
Alexandre Magno comentou:
9th Dezembro, 2009 às 8:37 am
@Marcelo: O return false serve para não propagar o comportamento padrão do elemento, no caso do submit enviar os dados. Desta forma se no controle do submit não tiver return false ou nenhum retorno ou até mesmo return true ele irá processar a função e no final irá enviar os dados novamente, o mesmo acontece para links e outros elementos que propagam eventos. Espero ter ajudado, boa sorte…
Rodrigo comentou:
11th Dezembro, 2009 às 10:21 am
Se colocasse os arquivos para download ajudaria muito
abraço
Alexandre Magno comentou:
11th Dezembro, 2009 às 10:47 am
@Rodrigo: Próximos tutoriais irei colocar para download… mas para este tutorial tem todos arquivos necessários nos exemplos…
Estvão comentou:
11th Janeiro, 2010 às 9:29 am
Cara eu estou com uma dúvida foda e urgente!! Usei o validator bonitinho quando o usuario não existe no db ele aparece a imagem bonitinha e tal, agora quando o usuario existe, como eu uso o header(”Location: ../minhaPagina.php”); para carregar ?
Cláudio comentou:
19th Janeiro, 2010 às 2:04 pm
Olá, ótimo conteúdo.
Eu não consegui validar a idade através do minAge, então criei um remote separado pra ele e coloquei:
Também surgiu uma dúvida, que aqui no meu não valida o select box do campo país.
Abraço.
anderson comentou:
22nd Janeiro, 2010 às 12:35 pm
Você tem algum exemplo que passe os dados via GET ou POST em ajax de campos type= ‘file’ no formulario.
ficarei aguardando resposta limaand@gmail.com
Alexandre Magno comentou:
23rd Janeiro, 2010 às 12:05 pm
@anderson: Dê uma olhada em http://jquery.malsup.com/form/#file-upload
Espero que ajude, abraços e boa sorte…
Alex Sandro comentou:
15th Fevereiro, 2010 às 11:02 pm
Cara, tenho um código que valida meu form com jquery. Este código tb faz mascara para alguns campos. Até entao funciona normal. Agora preciso gravar em um banco, mas antes preciso validar se ja nao existe cpf, rg e email cadastrado. Peguei esse seu codigo só que nao funciona em conjunto com a mascara, saberia uma solução?
O código da mascara eu faço assim:
$(document).ready(function()
{
//Mascaras
$(”#cpf”).mask(”999.999.999-99″);
$(”#cep”).mask(”99.999-999″);
$(”#telRes”).mask(”(99) 9999-9999″);
$(”#telCel”).mask(”(99) 9999-9999″);
$(”#dataDeNascimento”).mask(”99/99/9999″);
$(”#dependente1dataNascimento”).mask(”99/99/9999″);
$(”#dependente2dataNascimento”).mask(”99/99/9999″);
$(”#dependente3dataNascimento”).mask(”99/99/9999″);
$(”#dependente4dataNascimento”).mask(”99/99/9999″);
$(”#dependente5dataNascimento”).mask(”99/99/9999″);
//Validação
$(”#formulario”).validate(
{
rules: {
nome: {required: true},
e ai continua a minha validação…
abraço
reinaldo comentou:
25th Março, 2010 às 4:31 pm
está muito ruim esse exemplo, não bate com o descrito acima!!!
Ed comentou:
26th Março, 2010 às 2:53 am
Cara eu não consigo fazer a função do ajax, como que eu especifico a página que o formulario deveria submeter
coloca o código inteiro ou disponibiliza pra download
flw
Alexandre Magno comentou:
26th Março, 2010 às 1:05 pm
@reinaldo e @ed: O intuito desses tutoriais não são “copy n paste”, é para ensinar a utilizar o que foi descrito e para quem está aprendendo usar para solucionar um determinado problema. Provavelmente não estão conseguindo por que não entenderam e não estão aplicando da forma correta.
Thiago comentou:
4th Abril, 2010 às 2:01 am
Alguem poderia me enviar os arquivos desse exemplo para meu email ? Obrigado
Danilo comentou:
10th Maio, 2010 às 2:42 pm
Olá, você poderia me dar uma dica de como resolver esse problema?, pois estou usando a validação para verificar se já existe um cpf no banco, mas eu utilizo o mesmo formulario para alterar o cadastro da pessoa, e acontence que na alteração ele tb verifica novamente o cpf e não permite proceguir com o mesmo cpf.
Fabrício Fernandes comentou:
20th Maio, 2010 às 10:23 am
Alexandre Magno, há mto tempo procurei por uma validaçao como essa .. aqui funcionou tudo perfeitamente, muito obrigado e sucesso na carreira..
Alexandre Magno comentou:
20th Maio, 2010 às 11:02 am
@Fabrício: Sim, esta combinação dos dois plugins é perfeita para qualquer situação que envolve validação de formulários via javascript e envio por ajax. Que bom que tenha ajudado. Muito obrigado e um grande abraço…
Fabrício Fernandes comentou:
31st Maio, 2010 às 10:13 am
Alexandre, caso eu queira que quando a pessoa clicar para enviar, apareça um aviso em ajax na div de “enviando…” + um gif de um preloader e em seguida aparecendo a confirmação ou o erro de envio, só que tudo isso apareça na div em tempo determinado depois sumiriam, seria complicado?
Sempre estou visitando seu blog, caso você saiba e tenha disponibilidade de fazer esta implementação, com certeza estarei aqui para conferir, abraços…
Os seguintes campos estão incorretos ou faltando