Em fevereiro de 2006, quando ainda não conhecia nada de AJAX, escrevi o artigo Simulando AJAX?, onde usei PHP e JavaScript para criticar o preenchimento de um campo e exibir, quando correto, a descrição correspondente após a utilização da tecla Tab, sem o refresh da página.
Retomo agora o exemplo, para demonstrar a mesma funcionalidade com o uso do objeto XMLHttpRequest do AJAX, mas com uma “cara” nova e bem mais elegante :-).
Apesar de se tratar de uma aplicação simples tem como vantagem evitar a lógica para validar os campos do lado do cliente com JavaScript, que em alguns casos é inviável de ser realizada e somente é efetuada do lado do servidor após o formulário ser submetido (neste post, este aspecto não é considerado).
Além do mais, na maioria dos casos, é bem mais simples escrever a lógica de validação com a linguagem utilizada no desenvolvimento de seus aplicativos e, ainda, com a possibilidade de se aproveitar estruturas já construídas.
Acredito, também, que quando se trata de performance, apesar de não ser um desenvolvedor contumaz, não há perda significativa que justifique o não uso da ferramenta AJAX.
Escopo
Neste experimento mostraremos exemplos comuns de validações, com o uso de um formulário contendo apenas o campo Id Categoria a ser preenchido e da tabela wp-categories do Viche, a saber:
- Preenchimento obrigatório do campo;
- Se o dado informado é numérico;
- E, a verificação da existência ou não da categoria na tabela.
Observe que a terceira crítica é um caso clássico, pelo menos até onde eu sei, em que o JavaScript sozinho não resolve.
A linguagem utilizada do lado do servidor é o PHP, que usa na interação com o JavaScript/AJAX uma técnica que permite a acentuação correta das mensagens exibidas, descoberta através da dica fornecida no artigo Acentuação para conteúdos carregados por AJAX do El Micox e de autoria de Fabrício Nogueira Magri, com o título Palavras acentuadas com AJAX.
O código Javascript está, também, embutido no XHTML do experimento, e a função retirada do artigo mencionado é a url_decode(str), enquanto que no PHP é utilizada a função rawurlencode($resposta). Os detalhes sobre as funções podem ser vistos diretamente no artigo do Fabrício e com informações adicionais bem interessantes.
Detalhamento
Serão descritos apenas os pontos que considero importantes no experimento.
O primeiro é a chamada do objeto XMLHttpRequest criado através da função criaxmlhttp():
<input id="id_cad" name="id_cad" size="6" value="" maxlength="8" onblur="valida_cat(this.value,'S','N','verifica_cat')" type="text">
onde utilizo o evento onblur e a função valida_cat() com os seguintes parâmetros:
- O conteúdo digitado no campo Id Categoria;
- Se o campo é de preenchimento obrigatório ou não;
- O tipo do campo, no caso numérico; e
- Uma função auxiliar a ser acionada no programa PHP para a verificação da existência ou não da categoria na tabela.
Outro ponto, é a chamada da função passada como parâmetro pelo objeto XMLHttpRequest, no programa PHP:
if ($funcao != "") {
$resposta = call_user_func($funcao, $id);
echo $resposta;
return;
}
em que fazemos uso da função call_user_func() de modo a permitir a generalização da rotina para executar qualquer procedimento adicional definido como parâmetro na url do objeto XMLHttpRequest.
E, finalmente, a decodificação correta dos acentos para que as mensagens sejam exibidas em um bom português:
echo rawurlencode($resposta); // no PHP
e
var resposta = url_decode(xmlhttp.responseText); // no JavaScript
de acordo com as orientações do Fabrício anteriormente mencionadas.
Você deve ter notado que na resposta da função não faço uso de rawurlencode(), isto porque se encontra definida no XHTML a meta tag que estabelece o charset como UTF-8, o padrão do WordPress.
Ah! veja agora o experimento em ação.
Feliz Natal com muita paz e muito VICHE.
Eduardo Nunes
abr 05, 2008 @ 11:15:42
primiramente obrigado por cotribuir com sua solução, sua lógica realmente procede embora vc tenha exibido somente o ponto A e C
O ponto B é o que realmente esta pegando, como eu vou chamar uma função php através de uma requisição js ??
no meu caso todos os meus codigos de js estado dentro de um arquivo chamado arquivo.js e faço a requisição deste arquivo no php nas páginas que utilizo
Vamos analisar seu exemplo:
Show de bola, é exatamente assim que eu passo o conteúdo dos campos para a metodologia ajax, através do Oblur executando uma função js.
Agora aqui vc deu um nó na minha cabeça:
Outro ponto, é a chamada da função passada como parâmetro pelo objeto XMLHttpRequest, no programa PHP:
if ($funcao != “”) {
$resposta = call_user_func($funcao, $id);
echo $resposta;
return;
}
desculpe minha ignorância, pois estou começando no ajax, mas como eu vou chamar uma função PHP dentro de uma requisição xml que por sua vez esta no arquivo.js ? O.o
vou desmontrar minha situação.
Ponto A (enviando dados para a função JS através do métido Onblur)
);”>
Ponto B ????? pelo que entendi o correto seria enviar os dados (ponto A) já encodados (foi mal a neologia), e é ai que estou agarrado…
Ponto C (através do meu codigo js eu codifico os dados recebidos com unescape e substituo a div id no documento de destino com o valor repassado através do xmlrequest
if (req.readyState == 4) {
if (req.status==200) {
texto=unescape(req.responseText.replace(/\+/g,” “));
document.getElementById(“div”).innerHTML = texto;
} else {
alert(“Houve um problema ao obter os dados:\n” + req.statusText);
}
}
Se puder me ajudar enviando o codigo completo para o meu email eu ficarei muito grato.
Atenciosamente,
Eduardo Nunes
Marlene de Oliveira
fev 07, 2008 @ 11:19:54
Gostaria de validar o campo quando numérico, texto.
Conforme o usuário vai preenchendo os campos já valida.
Acho que o seu exemplo me ajudaria.
Se possível, me envia o código por email.
Obrigada novamente.
Marlene
Marlene de Oliveira
fev 07, 2008 @ 11:16:30
Oi !
Você poderia enviar o código completo por email?
Obrigada.
Marlene
thiago jose santana diniz
nov 16, 2007 @ 02:41:21
lembrando que eh em c..,eu esquece de colocar o tipo da linguagem,,flw…
thiago jose santana diniz
nov 16, 2007 @ 02:40:04
vc’s sabem como se faz a transferencia dos dados de uma pessoa dalista dinãmica para um lista duplamente encadeada.]
se alguém poder me ajudar eu agradeço,pois estou aprendendo a programar agora na faculdade..
blz..
elton
jul 20, 2007 @ 16:30:25
tem como me enviar os fontes do Experimento Ajax #4 – Validação de Campos
21306
mar 08, 2007 @ 12:25:23
ryhi 8ip09p[09o tuy76i89,
jyjhkytytgtrrtet5rty45y6
lk,
Wanderlei Hüttel
jan 19, 2007 @ 10:48:27
Tem como mandar o código completo por email???
Valeu
Micox
dez 26, 2006 @ 08:19:01
Muito bom o artigo e muito bom a versão não-ajax também.
(valeu pelo link) :-)