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.