Programação WEB é à Quinta-feira!

43 Comentários

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.

web_01

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.


Adicionamos ainda um elemento <span> com o id ‘concelhos’ que irá apresentar no final a lista dos concelhos relativas ao distrito escolhido.



Para testar vamos guardar a página com o nome ‘index.php’. Eis o resultado:

clip_image002

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 '


';

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).

clip_image004

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:




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.



clip_image006

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.



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 :

clip_image008
Tudo está como o desejado e com uma velocidade fantástica. Gostaram? Aguardo o vosso feedback.
Download: scripts

Partilhar:
Tags:

Comentários

43

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de QueroTenho

    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

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Obrigado! Sim, a equipa do PplWare é verdadeiramente fantástica. Obrigado a eles!

      1. Avatar de Pedro Pinto

        Estes parabéns são para ti Pedro !!! O mérito é teu 🙂

  2. Avatar de Mandrake

    Mais um excelente script pra se guardar, quando precisamos é uma mão na roda.

    Vlw!!!

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      😉

  3. Avatar de MRodrigues
    MRodrigues

    Boas

    Mais um excelente tutorial !!

    Era Porreiro se tivesse um demo.

    Continuação de um bom trabalho.

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Daqui a pouco já estão os ficheiros para download… 🙂

      1. Avatar de Pedro Pinto

        Ora lá estão eles 🙂

        1. Avatar de MRodrigues
          MRodrigues

          Obrigado!

  4. Avatar de Diogo
    Diogo

    Otima dica. Select e bom em casos de formulario.

  5. Avatar de Ricardo Paz
    Ricardo Paz

    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.

    1. Avatar de Pedro Pinto

      Boas Ricardo

      Daqui a pouco já coloco isso Online. Fica atento.

  6. Avatar de jedi
    jedi

    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. 😉

    1. Avatar de Pedro Pinto

      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á 🙂 )

    2. Avatar de Pedro Peixoto
      Pedro Peixoto

      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.

      1. Avatar de Pedro Pinto

        Bem, para a próxima fazemos então com base de dados 🙂

  7. Avatar de quofj.
    quofj.

    mistutar noticias com tutorias nao da com nada.

      1. Avatar de quofj.
        quofj.

        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.

        1. Avatar de Pedro Pinto

          O quofj. então isso é o normal. Aqui falamos de tudo 🙂 Experimenta seleccionar por categorias.

  8. Avatar de Márcio
    Márcio

    Pedro Pinto, não te parece que falta código?
    Vejo

    Acho que falta o codigo de javascript…

    1. Avatar de Pedro Pinto

      Foi o wordpress que “comeu” a parte do javacript, mas já está resolvido. Thanks pelo alerta.

  9. Avatar de André Flores
    André Flores

    Excelente !!!
    optimas dicas.
    é possivel utilizar com aspx?

  10. Avatar de DaniR
    DaniR

    Obrigado pela dica e pelo download 🙂

    1. Avatar de Pedro Pinto
  11. Avatar de tb
    tb

    Mto útil!

    continuação 🙂

  12. Avatar de JP

    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 . ”;

    1. Avatar de JP

      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;’;

      1. Avatar de JP

        <option value=”' . $distrito . '”>' . $distrito . '</option>';

        Aleluia!

    2. Avatar de Pedro Peixoto
      Pedro Peixoto

      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.

      1. Avatar de Pedro Pinto

        Agora está. Quando passo o editor para modo visual ele come algum código. Acho que ja lhe descobri a manha 🙂

  13. Avatar de JP
    ' . $distrito . '';
    
  14. Avatar de Nuno Santos
    Nuno Santos

    Parabéns, e venham mais 🙂

  15. Avatar de Nuno Ribeiro
    Nuno Ribeiro

    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 🙂

    1. Avatar de Nuno Ribeiro
      Nuno Ribeiro

      os selects …

  16. Avatar de Gonçalo Pimenta
    Gonçalo Pimenta

    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.

    1. Avatar de Rui Pedro Peixoto
      Rui Pedro Peixoto

      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.

      1. Avatar de Gonçalo Pimenta
        Gonçalo Pimenta

        Ok obrigado, vou tentar e caso seja necessário peço ajuda.
        Cumprimentos.

      2. Avatar de Gonçalo Pimenta
        Gonçalo Pimenta

        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..

  17. Avatar de Abel
    Abel

    Funciona numa terça-feira como hoje?