Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: aldg en 28 Abril 2013, 16:28 pm



Título: AYUDA!! Combobox anidados
Publicado por: aldg en 28 Abril 2013, 16:28 pm
Estoy intentado crear dos combobox anidados. Típico provincia, ciudad, pero no hay manera con php.

La estructura de la BD
provincia (id, nombre)
ciudad (id, id_provincia, nombre)

La cosa es que quiero que al marcar una provincia me cargue las ciudades de esa provincia sin cargar la pagina de nuevo, he visto por ahi algo de javascript y ajax, pero para hacer la consulta de mysql dentro me pierdo.

Me pueden ayudar???


Título: Re: AYUDA!! Combobox anidados
Publicado por: EFEX en 28 Abril 2013, 17:11 pm
Lo podes buscar como chained combobox, la consulta a la db se utiliza php, js obtiene los datos pasados a json con la funcion json_decode y mostras los parametros con js.
No es necesario hacer una consulta a la db si no es necesario, mira este plugin para jquery, podes generar la estructura html con php, bueno seria solo 1 consulta a la db para obtener las ciudades y provincias a mostrar.

http://www.appelsiini.net/2010/jquery-chained-selects
http://www.appelsiini.net/projects/chained/demo.html



Título: Re: AYUDA!! Combobox anidados
Publicado por: aldg en 28 Abril 2013, 19:30 pm
No entiendo como funciona el plugin!

Yo de javascript se muy poco y de jquery nada. Siempre he trabajado con php...


Título: Re: AYUDA!! Combobox anidados
Publicado por: #!drvy en 29 Abril 2013, 00:41 am
Citar
Yo de javascript se muy poco y de jquery nada. Siempre he trabajado con php...

Pos tendrás que aprender xD Al menos lo básico.. porque lo que pides (sin recargar la pagina) es imposible solo con PHP. No hace falta que hagas una consulta mysql desde javascript (aparte que es imposible xD). Lo que tienes que hacer es una comunicación entre javascript/ajax y php.


Supongamos que tenemos este php.
Código
  1. <?php
  2. // Conexion a bd.
  3. $mysql = mysqli_connect('localhost','root','toor','test');
  4. // Si nos envían provincia...
  5. if(!empty($_GET['provincia'])){
  6.   // Convertimos a integro.. (por si acaso)
  7.   $provincia = (int)$_GET['provincia'];
  8.   // Armamos consulta
  9.   $query = 'SELECT id,id_provincia,nombre FROM cuidades WHERE id_provincia="'.$provincia.'"';
  10.   // Si no nos envia nada, devolvemos provincias.
  11. } else { $query = 'SELECT id,nombre FROM provincias'; }
  12.  
  13. $result = mysqli_query($mysql,$query);
  14. if(!$result){die(mysqli_error());}
  15.  
  16. $res = array(); // strict
  17. while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
  18.   // Guaramos el resultado en un array.
  19.   $res[] = array($row['id'],$row['nombre']);
  20. }
  21. mysqli_close($mysql);
  22. // Lo convertimos a JSON y morrimos xD
  23. ?>

Es relativamente sencillo.
Código
  1. // Si le hago una consulta directa devuelve provincias en JSON
  2. // http://localhost/consulta.php
  3. // [["1","Palencia"],["2","Burgos"],["3","Madrid"]]
  4.  
  5. // Si le hago una consulta, indicando una id de provincia.. devuelve cuidades de dicha.
  6. // http://localhost/consulta.php?provincia=3
  7. // [["5","Madrid"],["6","Mostoles"]]
  8.  
  9. // Si, soy malo en geografía xD

Ahora toca javascript. Supongamos que tenemos un simple html como este:
Código
  1.   <form action="#" method="GET">
  2.      <select id="provincias" size="10" style="width:200px;"></select>
  3.      <select id="cuidades" size="10" style="width:200px;"></select>
  4.      <br />
  5.      <input type="button" id="recargar" value="(Re)Cargar" />
  6.   </form>
  7. </body>

Vamos a añadirle la librería de jquery (para minimizar el codigo)..
Código
  1. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  2. <script type="text/javascript">
  3.   // Cuando el documento este listo...
  4.   $(function() {
  5.      // Aqui meteremos el resto del code...
  6.   });
  7. </script>

Ahora vamos a hacer que cuando el usuario pulse el boton (Re)Cargar, se carguen las provincias.
Código
  1. $('body').on('click','#recargar',function(){
  2.   // Hacemos una consulta GET (ajax) hacia el fichero php...
  3.   $.get('http://localhost/consulta.php',function(data){
  4.      // Si la consulta devuelve algun resultado.. eliminamos los options previos.
  5.      $('#provincias option, #cuidades option').remove();
  6.      // Y llenamos el select de provincias con el resultado devuelto.
  7.      var result = $.parseJSON(data); // Convertimos el json a array.
  8.      // Por cada item en el array..
  9.      for(i=0;i<result.length;i++){
  10.         // Lo "añadimos" al select de provincias en forma de option, guardando el id como value.
  11.         $('#provincias').append('<option value="'+result[i][0]+'">'+result[i][1]+'</option>');
  12.      }
  13.   });
  14. });

Y ahora toca para cuando el usuario hace click sobre una provincia..
Código
  1. $('#provincias').on('click','option',function(){
  2.   // Obtenemos el value del option:
  3.   var valor = $(this).attr('value');
  4.   // Hacemos la consulta GET con el id.
  5.   $.get('http://localhost/server/ehn/cuidades/consulta.php?provincia='+valor,function(data){
  6.      // Si la consulta devuelve algun resultado.. eliminamos los options de cuidades previas.
  7.      $('#cuidades option').remove();
  8.      // Convertimos el json a array.
  9.      var result = $.parseJSON(data);
  10.      for(i=0;i<result.length;i++){
  11.         // Lo "añadimos" al select de cuidades en forma de option, guardando el id como value.
  12.         $('#cuidades').append('<option value="'+result[i][0]+'">'+result[i][1]+'</option>');
  13.      }
  14.   });
  15. });

Listo xD

Unos links (ingles):
jQuery -> http://jquery.com/
jQuery selectors ->  http://api.jquery.com/category/selectors/
jQuery GET -> http://api.jquery.com/jQuery.get/
jQuery ParseJson -> http://api.jquery.com/jQuery.parseJSON/
jQuery append -> http://api.jquery.com/append/

Videotutorial de jQuery -> https://tutsplus.com/course/30-days-to-learn-jquery/
Tutorial de javascript -> http://www.w3schools.com/js/

Saludos


Título: Re: AYUDA!! Combobox anidados
Publicado por: EFEX en 29 Abril 2013, 00:57 am
Mejor explicado que monkey imposible, a estudiarlo  ;)


Título: Re: AYUDA!! Combobox anidados
Publicado por: aldg en 5 Mayo 2013, 23:04 pm
Gracias a todos, estoy aprendiendo un poco e jquery. Ya más o menos he podido hacer lo que quería.

Seguire aprendiendo este lenguaje ya que veo que proporcionara mucha agilidad en una web.