Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

carcleo

Autocompletar Formulario Clientes

Mensagens Recomendadas

carcleo

Pessoal. Boa noite!

Preciso de uma ideia de como fazer isso:

Tenho um formulário de cadastro de clientes.

nome, documento, endereço........

Bom, estou querendo fazer com que, à medida que o usuário estiver entrando, letra a letra do nome de um novo cliente, seja feita uma busca no banco de dados para saber se há uma correspondência do que já foi digitado no campo nome do formulário com alguma inicial de algum nome já cadastrado no banco de dados.

Se houver, que seja pego todos os campos daquele registro e povoar os outros campos do formulário.

Isso, letra a letra sem precisar submeter o formulário.

Alguma orientação?

No aguardo!

Carlos Rocha

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

AJAX+JSON

tens cuidado com o que pretendes, olha que para isso acontecer, necessitas de fazer um pedido ao servidor a cada alteração do conteúdo da caixa !!!


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

Sim.

Talvez eu não tenha me expressado bem.

Consegui fazer o seguinte código Javascript:

function autocompletar(n,ac_array)
{
for (i=0;i<ac_array.length;i++)
{
 if (n.value = ac_array[i])
 {
  n.value=ac_array[i];
 }
 else
 {
  n.value=ac_array[i];
 }
}
}

A variável 'n', carrega o campo em si. (this na chamada à função);

A variável ac_array, carrega uma consulta ao banco de dados com os nomes dos clientes que lá tem. (É um vetor php passado para um vetor Javascript.)

 <label id="label_nome_cad_clientes" for="nome_cad_clientes">Nome :</label>
 <input type="text" name="nome_cad_clientes" id="nome_cad_clientes" value="" size=60 maxlength=60  backspace="false" onkeyup="autocompletar(this,new Array(<?php echo $nomes_js; ?>))" /><br />

Bom, essa função esta indo razoavelmente bem.

Quando aperto por exemplo a letra C, ele completa com o Nome Carlos Rocha. Mas, se eu não quiser Carlos Rocha, quiser por exemplo, Cleonice, eu não consigo pois ele já completa com Carlos Rocha de novo.

O que tenho que fazer para conseguir esse efeito?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

Bom, consegui esse código que funciona com duas restrições:

A) Se o nome for Carlos e não carlos, caso a primeira letra for c minúsculo, o código não acha o nome no array.

B) Tenho outros campos no forumulário tipo:documento, endereço..... que gostaria de autopreencher também com os dados vindos do banco mas com esse código não é possível. Ele só autopreenche o próprio campo.

//fruits = new Array('cleber','mamao','melancia','mercadoria','marmelada');
//names = new Array('tom','dick','harry','john','petter','foo','bar');
function autocompletar(n,ac_array){
if (n.value == "") return 0;
if (event.keyCode == 8 && n.backspace){
n.value = n.value.substr(0,n.value.length-1);
n.backspace = false;
}
var r = n.createTextRange();
tmp= n.value;
if (tmp == "")return 0;
for (z=0;z<ac_array.length;z++){
tmp2 = ac_array[z];
count = 0;
for (i = 0;i<tmp.length;i++){
if (tmp2.charAt(i) == tmp.charAt(i)){
count++
}
}
if (count == tmp.length){
diff = tmp2.length - tmp.length;
if (diff <= 0) break;
kap = "";
for (i=0;i<tmp2.length;i++){
if (i >= tmp.length) kap += tmp2.charAt(i);
}
n.backspace = true;
r.text += kap;
r.findText(kap,diff*-2);
r.select();
return 0;
}
}
n.backspace = false;
return 0;
}

Alguma solução?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

Estou quase lá:

Estou precisando tirar duas duvidas agora:

a)

Tenho o código abaixo:

...
  document.getElementById("complemento_"+form_get+"_clientes").value=complemento clientes;
  document.getElementById("bairro_"+form_get+"_clientes").value=bairro_clientes;
  document.getElementById("cidade_"+form_get+"_clientes").option[0].value=cidade_clientes;
  document.getElementById("cidade_"+form_get+"_clientes").option[0].text=cidade_nome;
  document.getElementById("estado_"+form_get+"_clientes").option[0].value=estado_clientes;
  document.getElementById("estado_"+form_get+"_clientes").option[0].text=estado clientes;
...

Os campos texto, Não select recebem os valores certinho.

Mas, os campos select option, cidade e estado, apenas o campo cidade recebe os valores value e text em seus options.

Já testei e o valor do estado clientes esta chegando.

O que vem para baixo de estado.text deixa de receber os valores. Mas quando retiro cidade e estado o resto da certo.

<label id="label_cidade_cad_clientes" for="cidade_cad_clientes">Cidade :</label>
<select name="cidade_cad_clientes" id="cidade_cad_clientes" size="1" style="width:220px">
 <option id="opcoescidade" value="#">Primeiro selecione o estado!</option>
</select><br />

Outra dificuldade é o:

2)

Tenho o código abaixo:

// Javascript Document
function mascara(e,src,mask)
{
if(window.event) { _TXT = e.keyCode; }
else if(e.which) { _TXT = e.which; }

if(_TXT > 47 && _TXT < 58)
{
var i = src.value.length; var saida = mask.substring(0,1);
var texto = mask.substring(i);

if (texto.substring(0,1) != saida)
{ src.value += texto.substring(0,1); }

return true;
}
else
{
if (_TXT != 8) { return false; }
 else { return true; }
}
}

Essa função mascara os campos.

Acontece que chamo ela a partir de um evento. onkeypress por exemplo. Mas agora, estou chamando ela no momento em que populo o formulário na função anterior.

Porem, nesse lugar, não há eventos? O que posso passar como parâmetro em lugar de 'e' da função mascara(e,src,mask) para funcionar?

Editado por carcleo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
lsoares

A não ser que tenhas razões muito fortes para não usar uma biblioteca (e.g. quereres causar o mínimo de carga) então acho que devias seguir a recomendação de usar uma biblioteca. O JQuery UI Autocomplete que já foi referido acima mais que uma vez é uma hipótese.

exemplo: http://jsbin.com/oniji4/1/edit

Se não quiseres mesmo usar uma biblioteca... ainda se coloca a questão: porquê reinventar a roda?

Podes usar um script qualquer:

http://www.codeproject.com/Articles/8020/Auto-complete-Control

Editado por lsoares

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

Consegui fazer usando apenas Ajax e xml.

Aquele esquema do combo estado / cidades. Lembra?

Esta tudo funcionando bem. Porem não é tão eficiente quanto Jquery que mostra lista a partir da input text.

O que eu fiz foi mostrar nos campos do form a primeira combinação.

Mas agora preciso de, se o usuário pressionar backspace, limpar os campos do form.

O que estou fazendo:

Tenho a função abaixo:

 function LimpaCampos(form_get)
 {
alert(event.keyCode);
if (event.keyCode==8)
{
 document.getElementById("dcto_"+form_get+"_clientes").value="";
 document.getElementById("nome_"+form_get+"_clientes").value="";
 document.getElementById("endereco_"+form_get+"_clientes").value="";
 document.getElementById("numero_"+form_get+"_clientes").value="";
 document.getElementById("complemento_"+form_get+"_clientes").value="";
 document.getElementById("bairro_"+form_get+"_clientes").value="";
 document.getElementById("cidade_"+form_get+"_clientes").options[0].value="";
 document.getElementById("cidade_"+form_get+"_clientes").options[0].text="";
 document.getElementById("estado_"+form_get+"_clientes").options[0].value="";
 document.getElementById("estado_"+form_get+"_clientes").options[0].text="";
 document.getElementById("cep_"+form_get+"_clientes").value="";
 document.getElementById("email_"+form_get+"_clientes").value="";
 document.getElementById("tel_"+form_get+"_clientes").value="";
 document.getElementById("cel_"+form_get+"_clientes").value="";
}
 }

A ideia aqui é, se o usuário pressionar bakspace ou delete, limpar os campos do formulário.

Mas acontece que, para qualquer tecla que pressiono, o alert no início da função me diz qual tecla é.

Mas a tecla backspace não diz.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.