Es habitual que, creando formularios, nos encontremos con la situación de tener dos combos (o campo select si lo preferís) y que uno tenga que cargar/modificar sus datos según el resultado seleccionado en el otro, de forma dinámica. Esto es posible con Javascript, y muy cómodo si utilizamos JSON y jQuery.
Os planteo un ejemplo simple: tenemos dos combos, uno con provincias y otro con ayuntamientos. El marcado HTML va a ser más o menos tal que así:
<select id="provincias" name="provincias"> <option value=""></option> <option value="1">A Coruña</option> <option value="2">Lugo</option> <option value="3">Ourense</option> <option value="4">Pontevedra</option> </select> <select id="poblaciones" name="poblaciones" disabled="disabled"> </select>
Como véis, al momento de cargar la página el campo provincias tendrá las cuatro provincias gallegas, y el campo poblaciones estará desactivado. ¿Ahora qué necesitamos? Pues primero necesitamos un script que nos saque las poblaciones de la base de datos y nos las envíe como un JSON. Cualquier lenguaje de lado del servidor nos vale, para el ejemplo va a ser PHP (pero vamos, que podría aplicarse con Java, Ruby, node.js, Python…). Crearemos un script llamado getPoblacionesJson.php
<?php include 'conexionbd.php'; if ($mysqli -> multi_query("CALL sp_GetPoblaciones(" . $_GET['pr'] . ")")) { $poblaciones = array(); do { if ($result = $mysqli -> store_result()) { while ($fila = $result -> fetch_assoc()) { $poblaciones[$fila['Id']] = $fila['Nombre']; } } } while($mysqli->next_result()); print_r(json_encode($poblaciones)); } ?>
En este caso veis que lo que hacemos es llamar a un procedimiento almacenado que nos devuelve las provincias, recorremos el resultado y vamos guardándolo en un array. Finalmente lo convertimos a JSON y lo imprimios para que lo recoja la función de Javascript. Si os estáis preguntando cómo va el procedimiento almacenado, es una simple select en MySQL, tal que así:
DELIMITER $$ CREATE PROCEDURE sp_GetPoblaciones(IN provincia int) begin SELECT Id, Nombre FROM poblaciones WHERE (provincia is null or IdProvincia = provincia) ORDER BY Nombre; end $$ DELIMITER ;
Ok, tenemos entonces el script del servidor, el marcado y el procedimiento en la base de datos. ¿Qué nos queda? Pues el Javascript, vitaminado con jQuery para ganar productividad:
$("#provincias").change(function() { $("#poblaciones").empty(); $.getJSON('http://localhost/getPoblacionesJson.php?pr='+$("#provincias").val(),function(data){ console.log(JSON.stringify(data)); $.each(data, function(k,v){ $("#poblaciones").append("<option value=\""+k+"\">"+v+"</option>"); }).removeAttr("disabled"); }); });
La idea es simple: Si se registra algún cambio en el combo de provincias vaciamos el combo de poblaciones y lo rellenamos con los nuevos datos, obtenidos mediante la función getJSON() y que recorreremos con each() como un conjunto de claves/valores. Finalmente, por si está desactivado, lo reactivamos. He hecho un console.log por si queréis ver cómo funciona la cosa en la consola de javascript de Chrome o del Firebug.
Espero que os sirva de ayuda esta entrada para trabajar con combos dinámicos.
muy bueno tu ejemplo, muchas gracias
Hola Cristian, le agradezco si me puede compartir el ejemplo completo. ya que a mi no me está funcionando. Las fuentes yo los copié y segui las instrucciones, pero no me devuelve datos.
Con todo aprecio
Eladio
emora.vistaverde@gmail.com