10 Março 2006

Combos Dinâmicas

Vou explicar um pouco de como trabalhar com elementos SELECT do HTML de forma inâmica e com conteúdo atualizavel via AJAX.
Para isso é necessário que se tenha uma combo. Abaixo segue um exemplo em HTML:
<select name="cmbteste" id="cmbteste">
<optgroup label="Grupo 1">
<option>teste1</option>
<option>teste2</option>
<option>teste3</option>
<option>teste4</option>
</optgroup>
</select>

Esse combo fica assim:

O Elemento <optgroup></optgroup> gera um grupo dentro do combo. Para o elemento SELECT existem as seguintes propriedades diferentes dos demais:
Size: define o numero de elementos que irão aparecer, como nesse exemplo que foi informado com a propriedade size = 2:

Multiple: define se pode ser selecionado mais de um elemento. Exemplo: multiple="multiple"

Para selecionar mantenha pressionada a tecla CTRL e clique nos elementos
Vamos agora a um exemplo de uso da combo, mas de forma dinâmica. Vou criar 2 funções que farão a atualização da combo, uma vai enviar os dados via AJAX e outra vai receber o retorno da solicitação:
function Cidades(estado){
url = "http://localhost/buscacidade.php";
pars = "estado=" + estado;
var myAjax = new Ajax.Request( url, {method: 'post',
parameters: pars,
onComplete: retCidade});
}

function retCidade(or1){
total = $("cmbcidade").length;
for(i=0;i<total;i++){
$("cmbcidade").remove(0);
}

if (or1.responseText == ""){
$("cmbcidade").options.add(
new Option("Nada encontrado",0));
}else{
eval(or1.responseText);
for(i=0;i<cidade.length;i++){
$("cmbcidade").options.add(
new Option(cidade[i].Nome,cidade[i].ID));
}
}
}

A função Cidade(estado) recebe como paramêtro o estado que ele realizará a consulta, fazendo essa pelo método Ajax.Request que já conhecemos de outro tutorial.
Fazemos 2 eventos na função retCidade(or1), a primeira é limpar a combo. Para isso é necessário fazer um loop que varra todos os elementos e os remova.
total = $("cmbcidade").length;
for(i=0;i<total;i++){
$("cmbcidade").remove(0);
}

O método remove(index) do elemento select faz com que o item com index informado no parametro seja removido. Depois o que fazemos é transformar o retorno (caso haja retorno) em linguagem JavaScript com a função eval():
eval(or1.responseText);

Por fim incluimos um item utilizando o método add da collection options do elemento select. Complexo? É não, olha abaixo:
$("cmbcidade").options.add(
new Option(cidade[i].Nome,cidade[i].ID));

Isso funcionaria também sem a ajuda da prototype:
document.forms[0].cmbcidade.options.add(
new Option(cidade[i].Nome,cidade[i].ID));

Só para finalizar, esse é o código PHP:
<?
header("Content-type: text/html; charset=ISO-8859-1");
switch ($_REQUEST["estado"]){
case "SP":
cidades("Araraquara,Araras,Americana,Judiaí,Santos,
São Carlos,São Paulo"
);
break;
case "RJ":
cidades("Rio de Janeiro,Parati,Angra dos Reis");
break;
case "PR":
cidades("Curitiba,Camboriú");
break;
case "SC":
cidades("Florianópolis,Blumenau");
break;
case "RS":
cidades("Porto Alegre,Gramado,Canela,Caxias do Sul");
break;
}
function cidades($par1){
$city = split(",",$par1);
if (count($city)==0)
return;
echo "var cidade = new Array();\n";
for ($i=0;$i<count($city);$i++){
echo "cidade[$i] = new Object();\n";
echo "cidade[$i].Nome='".$city[$i]."';\n";
echo "cidade[$i].ID='".$i."';\n";
}
}
?>

Como resultado de tudo isso temos o seguinte exemplo: Exemplo 1

Comentários:
Pedro, boa noite...

Estou iniciando na linguagem ajax e estou precisando fazer exatamente o que você fez aqui no tutorial de Combos Dinamicas. Inicialmente estava tentando fazer conectado ao banco de dados do meu servidor (MySQL5), mas como não obtive exito, procurei na net e vi o seu tutorial que por sinal é muito interessante e mais simples de fazer e que iria também atender minha necessidade. Porém fiz de acordo com o que manda o tutorial mas dá erro na hora de atualizar o combo. Diz que a página contém erros. Por ex:

Escolhi o estado = SP quando vai fazer o "refresh" nas combos, dá um erro no IE de Erros na Página, dou um duplo clique e aparece lá: Linha 28 Caracter 7 Erro de Sintaxe, vou na tal da linha e aponta para:

eval(or1.responseText);

Porém eu notei o seguinte: Quando eu coloco na variavel url da função Cidades, o endereço do meu site ex: www.meusite.com.br/buscacidade.php não funciona, mas quando eu aponto pro link da sua máteria (http://ajax.lolados.com/exemplos/buscacidade.php), funciona perfeitamente. Tentei colocar http://localhost/buscacidades.php e ele fica travado em aparecer nada.
Meu servidor é um FreeBSD 6
Apache 22
PHP 5
MySQL 5

Si puder me ajudar vou ficar muito agradecido pois estou precisando muito fazer isso. Meu email é andreluizpr@gmail.com

Fico no aguardo caso possa me ajudar...

Obrigado

André
 
amigo como eu coloco um link no resultado do 2combo? tipow quando selecionar SP - ai apareci
case "SP": cidades("Araraquara,Araras,Americana,Judiaí,Santos, São Carlos,São Paulo");
ai quando selecionar Araras ir para araras.php intendi.
estou querendo usar isso ai tipow um sistema de busca de categoria e subcategoria intnde amigo.
grato
hygor_sandro@hotmail.com
 
Oi Pedro.
Coloquei o código no meu PC e coloquei a URL como no seu código, funcionou blz, mas na hora em que direciono para a (url = "http://localhost:8080/teste/buscacidade.php") no localhost da minha máquina a combo retorna vazio. Seria possível eu ver o código do seu arquivo http://ajax.lolados.com/exemplos/buscacidade.php ? ou alguma dica?
Desde já agradecido.
 
Bom dia/tarde

Estou usando a prototype
e utilizando Dom para criar duas combos de uma vez
Primeiro crio as combos e
depois chamo a funcao que carrega os dados nas combos
porem a mesma so funciona se eu chamar uma alert antes de preencher cadas combo - ao contrario todos os dados sao preenchidos em uma unica combo ??!!

Alguem tem alguma soluco?

obrigadoo
educav2@hotmail.com
 
Postar um comentário





<< Início

This page is powered by Blogger. Isn't yours?

Assinar Postagens [Atom]