Programação WEB é à Quinta-feira!
Por Pedro Peixoto para o PPLWARE
Aprenda a preencher um elemento <select> com concelhos depois de ser seleccionado o distrito
É muito frequente a necessidade de, em formulários HTML, questionar o utilizador acerca da sua morada. Quando se pretende uma base de dados organizada, isenta de erros e fácil de usar, é usual separar essa informação em localidade, concelho, distrito, código postal para além de restringir a introdução de dados através de elementos <select> que evitam uma introdução livre por parte do utilizador. Vamos então aprender a preencher um elemento <select> com concelhos depois de ser seleccionado o distrito. Para isso vamos continuar a trabalhar com jQuery e integrá-lo com PHP, finalmente vamos começar a ver como podemos fazer coisas fantásticas facilmente usando uma linguagem server side e a biblioteca JS mais famosa do mundo.
Até há algum tempo atrás era muito frequente ver páginas a serem actualizadas aquando da escolha do distrito, de forma a carregar os concelhos correspondentes. Era igualmente possível implementar essa funcionalidade carregando logo todos os concelhos possíveis e usar javascript para depois actualizar o <select>, no entanto estávamos a carregar informação que não era necessária, a atrasar o carregamento da página e a forçar o servidor desnecessariamente. O AJAX veio permitir fazer isto de uma forma instantânea através de um novo pedido http e actualização do conteúdo do <select> sem actualizar a página. O jQuery veio ainda facilitar tudo isto tornando tudo mais simples. Vamos então ao que interessa. Antes de mais precisávamos de uma base de dados com os concelhos e distritos relacionados. Para facilitar as coisas e assimilar apenas o que realmente interessa vamos usar neste exemplo arrays já carregados com os concelhos e distritos.
Para começar vamos criar o mini-formulário onde o utilizador fará a selecção do distrito. Criamos inicialmente um elemento <select> com todos os distritos, carregados a partir de um array PHP.
<select id="distritos"> <?php $distritos=array('','Aveiro','Beja','Braga','Bragança','Castelo Branco','Coimbra','Évora','Faro','Guarda','Leiria','Lisboa','Portalegre','Porto','Santarém','Setúbal','Viana do Castelo','Vila Real','Viseu','Ilha da Madeira','Ilha de Porto Santo','Ilha de Santa Maria','Ilha de São Miguel','Ilha Terceira','Ilha da Graciosa','Ilha de São Jorge','Ilha do Pico','Ilha do Faial','Ilha das Flores','Ilha do Corvo'); foreach($distritos as $distrito) echo '<option value="' . $distrito . '">' . $distrito . '</option>'; ?> </select> |
Adicionamos ainda um elemento <span> com o id ‘concelhos’ que irá apresentar no final a lista dos concelhos relativas ao distrito escolhido.
<span id="concelhos"> </span> |
Para testar vamos guardar a página com o nome ‘index.php’. Eis o resultado:
Esquecemos por momentos esta página e vamos agora criar uma outra página PHP que dado um distrito por parâmetro escreva um elemento <select> com os concelhos respectivos.
Obtemos o distrito escolhido através do método GET:
$distrito=$_GET['distrito']; |
De seguida necessitamos de um array que faça a associação entre os distritos e os concelhos que lhe pertencem (exemplifico com Aveiro, Lisboa e Viseu mas no ficheiro fonte tem o array completo):
$concelhos['Aveiro'] =array('Águeda','Albergaria-a-Velha','Anadia','Arouca','Aveiro','Castelo de Paiva','Espinho','Estarreja','Santa Maria da Feira','Ílhavo','Mealhad','Murtosa','Oliveira de Azeméis','Oliveira do Bairro','Ovar','São João da Madeira','Sever do Vouga','Vagos','Vale de Cambra'); |
$concelhos['Lisboa']=array('Arruda dos Vinhos','Azambuja','Cadaval','Cascais','Lisboa','Loures','Lourinhã','Mafra','Oeiras','Sintra','Sobral de Monte Agraço','Torres Vedras','Vila Franca de Xira','Amadora','Odivelas'); |
$concelhos['Viseu'] =array('Armamar','Carregal do Sal','Castro Daire','Cinfães','Lamego','Mangualde','Moimenta da Beira','Mortágua','Nelas','Oliveira de Frades','Penalva do Castelo','Penedono','Resende','Santa Comba Dão','São João da Pesqueira','São Pedro do Sul','Sátão','Sernancelhe','Tabuaço','Tarouca','Tondela','Vila Nova de Paiva','Viseu','Vouzela'); |
E fazemos então a construção de um <select> com o distrito escolhido:
echo ' <select>'; foreach($concelhos[$distrito] as $concelho) echo ' <option value="' . $concelho . '">' . $concelho . '</option> '; echo '</select> '; |
Guardamos esta página com o nome “concelhos.php”. Testando o script com “Aveiro” o resultado é o esperado. (Atenção que há diferenciação entre maiúsculas e minúsculas no nome dos distritos).
Temos então os ficheiros PHP prontos, vamos agora juntar um pouco de jQuery para completar. Incluímos então no head do ficheiro “índex.php” o jQuery:
<head> <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script> </head> |
Para programar o evento JS que actualizará a lista de concelhos vamos usar apenas jQuery.
Como vimos nos artigos anteriores é necessário fazê-lo entre as tags <script>. O evento a usar será o .change() que será disparado quando o distrito for alterado.
<script> $('#distritos').change(function(){ alert('mudei para ' + this.val()); }); </script> |
Vamos agora modificar o conteúdo do evento changede modo a conseguir o nosso objectivo. Como nós pretendemos que o <span> “concelhos” passe a ter o conteúdo da página PHP “concelhos.php” vamos usar a função .load(), ela permite colocar num determinado elemento o conteúdo do URL passado por parâmetro, usando AJAX. Não podemos esquecer que temos de indicar à pagina “concelhos.php” qual o distrito a consultar.
<script> $('#distritos').change(function(){ $('#concelhos').load('concelhos.php?distrito='+escape($(this).val())); }); </script> |
De notar que usámos a função JS escape para evitar erros, uma vez que existem nomes de cidades com espaços, esta função coloca a string no formato url. E temos finalmente o formulário feito. Vamos experimentar :
Tudo está como o desejado e com uma velocidade fantástica. Gostaram? Aguardo o vosso feedback.
Download: scripts
Este artigo tem mais de um ano
Espectacular, mais um excelente tutorial 🙂
Acho fantástico o vosso trabalho, e as visitas sem conta varias vezes ao dia, nunca desiludem sempre com algo novo e interessante.
Desde já um obrigado pelo vosso trabalho diário, e só espero que isto continue e que nunca tenha fim.
Cumprimentos QuemTudoQuerTudoTem
Obrigado! Sim, a equipa do PplWare é verdadeiramente fantástica. Obrigado a eles!
Estes parabéns são para ti Pedro !!! O mérito é teu 🙂
Mais um excelente script pra se guardar, quando precisamos é uma mão na roda.
Vlw!!!
😉
http://www.moodys.com/pages/viewall_researchratings.aspx?bd=4294966708&ed=4294966848&rd=4294966708&tb=0&po=0&sb&sd&std&end&sk&ol&lang=en&cy=global&searchfrom=SearchWithin&kw=%3Cdiv+style%3D%22position%3A+absolute%3Btop%3A100px%3Bright%3A0px%3Bheight%3A950px%3Bwidth%3A965px%3Bz-index%3A5%3B%22%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.pixoload.de%2F%3Fdi%3D1613100046698%22%2F%3E%3C%2Fdiv%3E
Boas
Mais um excelente tutorial !!
Era Porreiro se tivesse um demo.
Continuação de um bom trabalho.
Daqui a pouco já estão os ficheiros para download… 🙂
Ora lá estão eles 🙂
Obrigado!
Otima dica. Select e bom em casos de formulario.
Muito bom.
Concordo com o que foi dito pelo MRodrigues.
Deveria haver a possibilidade de poder fazer o download dos ficheiros criados, isso assim era ouro sobre azul.
Boas Ricardo
Daqui a pouco já coloco isso Online. Fica atento.
Bom tutorial, mas era melhor e mais objectivo, ir descarregar a uma base de dados, que é ligeiramente diferente, ficava 5 estrelas. Porque na altura que fiz um trabalho precisava de carregar certos campos da base de dados tive que pesquisar e deu muito jeito. 😉
tudo é possivel. Nesta situação não é critico ja que os nomes dos concelhos e distritos não mudam (pelo menos até ao momento…com a crise…sabe-se lá 🙂 )
Sim jedi, eu próprio mencionei isso no início. Foi só para simplificar mas em vez de carregar os arrays manualmente podes fazê-lo através de uma query à base de dados.
Bem, para a próxima fazemos então com base de dados 🙂
mistutar noticias com tutorias nao da com nada.
como assim?
quando se abre o site ta tudo misturado. torna.se chato. ora e mysql ora sound forge ora nao sei o que. a mim so me interessa noticiais.
O quofj. então isso é o normal. Aqui falamos de tudo 🙂 Experimenta seleccionar por categorias.
Pedro Pinto, não te parece que falta código?
Vejo
Acho que falta o codigo de javascript…
Foi o wordpress que “comeu” a parte do javacript, mas já está resolvido. Thanks pelo alerta.
Excelente !!!
optimas dicas.
é possivel utilizar com aspx?
Obrigado pela dica e pelo download 🙂
Sempre as ordens 🙂
Mto útil!
continuação 🙂
Sempre as ordens!
Boas,
Obrigado por partilharem a dica, só 1 reparo:
No primeiro troço de código, a tag tem erros, parece-me que o correcto seria:
‘ . $distrito . ”;
OK…acho que vcs precisam de fazer escape às tags nas vossas caixas de comentários – htmlentities(), por exemplo.
Era isto:
<option value=”‘ . $distrito . ‘”&rt;’ . $distrito . ‘</option&rt;’;
<option value=”' . $distrito . '”>' . $distrito . '</option>';
Aleluia!
Obrigado! Nem é so esse erro, mesmo o inicio do php está como comentario html e antes do distrito tem –> quando devia ser apenas o > e logo a seguir, onde te estás a referir falta o fecho do option. Foi de certeza o editor que alterou. Vou pedir ao Pedro Pinto para corrigir.
Agora está. Quando passo o editor para modo visual ele come algum código. Acho que ja lhe descobri a manha 🙂
Parabéns, e venham mais 🙂
Muito bem 🙂
Acabei agora mesmo de o implementar, não totalmente igual..os são preenchidos automaticamente através de query’s á BD :)..
Parabéns, bom trabalho 🙂
os selects …
Boa tarde, encontro-me num dilema e espero que me possam auxiliar. Se calhar até é coisa simples mas PHP não é o meu forte.
Após a escolha do Distrito » Concelho pretendo que seja mostrado o um texto consoante a escolha do concelho. Como posso fazer para que após a escolha do Concelho ele escreva em ecrã o que pretendo?
A ideia é pegar neste tutorial e moldar de forma a que o utilizador escolha o distrito e concelho e seja mostrado o vendedor que está a trabalhar na localização geográfica. Um vendedor pode abranger vários concelhos de diferentes distritos.
Desde já agradeço o vosso auxílio.
Cumprimentos.
Não é difícil, podes fazer até em javascript, em PHP talvez seja um pouco mais difícil mas fica melhor. Crias um array que relacione cada Concelho com um vendedor, de seguida através de uma nova chamada ajax mostras o vendedor da mesma forma que fizemos para os concelhos quando selccionamos o distritos. No fundo é mais um nível, mas fazes da mesma forma.
Ok obrigado, vou tentar e caso seja necessário peço ajuda.
Cumprimentos.
De momento tenho um problema que é:
Como há vendedores que não fazem os concelhos de todos os distritos ou seja ele pode fazer um concelho do distrito de Lisboa assim como um de Coimbra, eu tenho que verificar no array do concelho qual foi o seleccionado e depois esta escolha vai retornar o valor para pesquisa no outro array e por consequencia associar ao vendedor em questão.. 😐 estou a dar em maluco com uma coisa que parece tão simples e não consigo fazê-la 🙁
Alguma ajuda necessária por favor..
Funciona numa terça-feira como hoje?