Combos dependientes II

Comentarios: 1
Tags: , ,
Fecha: 01/08/2006

Continuando con el tema de combos dependientes veamos ahora un ejemplo con Ajax y PHP. El anterior ejemplo nos puede ser útil siempre y cuando no tengamos mucha información, pero supongamos ahora que tenemos dos tablas relacionadas; una de actividades con 17 registros; y otra de subactividades -relacionada con la anterior por un mismo id de actividad- de más de 100 subactividades. En este caso deberemos recurrir a leer desde una base de datos. Si queremos, además, que no se recargue la página para agilizar el uso de nuestro formulario, deberemos usar AJAX.

Tenemos dos tablas:

  • "t_actividades" con los campos "Id" y "Actividad"
  • "t_subactividades" con los campos "IdActividad", "IdSubactividad", "SubActividad". (Los campos en negrita relacionan ambas tablas)

Ahora necesitamos crear un php que sería en el que tendríamos todo nuestro formulario, incluyendo los desplegables de Actividad y Subactividad. Lo vamos a denominar "combos2.php" y en un primer momento tendríamos:

<p><label for="actividad">Actividad:</label>
<select name="Actividades" id="Actividades">
<?
$servidor = 'servidor.dominio.com';
$usuario = 'usuario';
$contrasena = 'password';
$datos = 'basededatos';
mysql_connect($servidor,$usuario,$contrasena);
@mysql_select_db($datos) or die( "Unable to select database");
$query = "SELECT * FROM t_actividades";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
$i=0;
while ($i < $num) {
$Id = mysql_result($result,$i,"Id");
$Actividad = mysql_result($result,$i,"Actividad");
?>
<option value=<? echo $Id; ?>>
<? echo $Actividad ?>
</option>
<?
$i++;
}
?>
</select>
</p>
<p>
<div id="Div_Subactividades">
<label for="SubActividad">SubActividad:</label>
<select name="SubActividades" id="SubActividades" class="select">
</select>
</div>
</p>

Lo que se ha hecho es crear el primer combo a partir de los datos extraidos en la tabla de actividades "t_actividades" y dejar el combo correspondiente a las subactividades vacío, pero dentro de un div llamado Div_Subactividades que será donde se cargue el contenido obtenido tras hacer una petición mediante AJAX.

<div id="Div_Subactividades">
<label for="SubActividad">SubActividad:</label>
<select name="SubActividades" id="SubActividades" class="select">
</select>
</div>

Lo siguiente sería crear una instancia del objeto XMLHttpRequest() y una función que nos permita cargar el contenido del segundo combo en función del primero.

<script type="text/javascript">
var peticion = false;
var testPasado = false;
try {
peticion = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
peticion = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
peticion = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
peticion = false;
}
}
}
if (!peticion)
alert("ERROR AL INICIALIZAR!");
function cargarCombo (url, comboAnterior, element_id) {
//Obtenemos el contenido del div
//donde se cargaran los resultados
var element = document.getElementById(element_id);
//Obtenemos el valor seleccionado del combo anterior
var valordepende = document.getElementById(comboAnterior)
var x = valordepende.value
//construimos la url definitiva
//pasando como parametro el valor seleccionado
var fragment_url = url+'?Id='+x;
element.innerHTML = '<img src="Imagenes/loading.gif" />';
//abrimos la url
peticion.open("GET", fragment_url);
peticion.onreadystatechange = function() {
if (peticion.readyState == 4) {
//escribimos la respuesta
element.innerHTML = peticion.responseText;
}
}
peticion.send(null);
}
</script>

La función "cargarCombo" quizá sea la más interesante. Se le pasan tres parámetros: la url a la que llamamos, el combo del que depende el que vamos a cargar, y el id del div donde se cargará el resultado. El código javascript lo podemos insertar en el mismo "combos2.php" o hacer un include. El valor del segundo combo variará siempre que cambie el contenido del primer combo con lo que deberemos llamar a la función "cargarCombo" al evento onchange del select 'Actividades'. Por lo que finalmente quedaría:

<select name="Actividades"  onchange="javascript:cargarCombo('Subactividades.php', 'Actividades', 'Div_Subactividades')" id="Actividades">

Por último nos queda crear un fichero "Subactividades.php", que en función de la actividad seleccionada, cargará en el desplegable las subactividades correspondientes.

<?
$IdActividad = $_REQUEST['Id'];
?>
<label for="SubActividad">SubActividad:</label>
<select name="SubActividades" id="SubActividades" class="select">
<?
$servidor = 'servidor.dominio.com';
$usuario = 'usuario';
$contrasena = 'password';
$datos = 'basededatos';
mysql_connect($servidor,$usuario,$contrasena);
@mysql_select_db($datos) or die( "Unable to select database");
$query = "SELECT * FROM t_subactividades WHERE IdActividad=$IdActividad";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
$i=0;
while ($i < $num) {
$IdSubactividad = mysql_result($result,$i,"IdSubactividad");
$SubActividad = mysql_result($result,$i,"SubActividad");
?>
<option value=<? echo $IdSubactividad; ?>>
<? echo htmlentities($SubActividad) ?>
</option>
<?
$i++;
}
?>
</select>
1 ismael

lo tienes este para asp? saludos

¡Gracias por dejar tu opinión! Por favor procura que tu comentarios sean apropiados al tema tratado en la entrada; que no sean spam, u ofensivos, de otro modo, serán eliminados.

Si deseas realizar algún comentario, crítica o sugerencia sobre la propia web o deseas contactar conmigo lo puedes hacer a través de la siguiente dirección de correo: webintenta@webintenta.com

El hombre nunca sabe de lo que es capaz hasta que lo intenta.Dickens, Charles
Pixer.us

Pixer.us es un servicio web que nos ofrece opciones sencillas de edición de imágenes, como modificar el tamaño o recortarlas. También podremos añadirle unos cuantos efectos básicos. Para utilizar este servicio tan sólo tenemos que subir nuestra imágen haciendo click en el botón de “Examinar” y luego en el de “Upload & Edit”. Una vez hemos realizado las modificaciones tendremos la opción de guardar la imagen en alguno de los siguientes formatos: JPEG, GIF, BMP o PNG.

7 Poderosos carruseles de imágenes para diseñadores

Este post es una colección de algunos de los mejores carruseles de imágenes y contenido que podemos utilizar para nuestros proyectos web. El listado incluye Agile Carousel, YUI Carousel, JCarousel, iCarousel (jQuery + MooTools) y un tutorial acerca de cómo implementar un carrusel como los de Flickr utilizando Prototype-UI.

Listado de editores de PHP

Listado que aglutina la mayoría de editores de PHP que existen en la actualidad. El listado está dividido en editores gratuitos -con una subdivisión por sistema operativo- y editores comerciales. Interesante enlace.

50 lecciones acerca de teoría del diseño

Desde Psdtuts+ nos ofrecen 50 lecciones acerca de teoría del diseño gráfico. Si bien muchas veces nos enfocamos en el cómo de las cosas, cómo conseguir un efecto, cómo realizar una retícula en css,... también resulta muy importante entender el "por qué". Lecciones acerca de tipografía, psicología del color, composición, etc. Las lecciones están en inglés.

BonkEnc extrae, codifica y convierte archivos de audio

BonkEnc es una utilidad para extraer las pistas de audio de los CDs, codificar y convertir los archivos de audio a múltiples formatos. Es capaz de generar archivos en formato MP3, MP4 /M4A, Ogg Vorbis, AAC, y FLAC. Y dispone de su propio códec de sonido, Bonk. Además es compatible con CDDB (Compact Disc Database) y CDText

Times Reader: el New York Times en Adobe AIR

El prestigioso New York Times ha lanzado una aplicación, llamada Times Reader, basada en Adobe AIR, que permite leer las noticias de un modo más parecido a lo que sería un periódico en papel. Parece que la crisis de los medios escritos hace que se abran a nuevos modelos de negocio.

Appetizer

Appetizer es una aplicación gratuita para Windows que funciona como lanzador de aplicaciones. Permite organizar los accesos directos y carpetas que más a menudo utilizemos en una cómoda barra o "dock" . Entre sus características cabe destacar que tiene soporte para plugins; para pieles; teclas de acceso rápido; apoyo a iconos personalizados; etc. También es muy interesante mencionar que el programa posee una versión portable del mismo.

How To Create A Great Web Design CV and Resume?

Aprovechando que están cayendo chuzos de punta en el mundo laboral, en Smashing Magazine se han marcado un muy interesante artículo sobre como crear un buen currículum vitae.

13 trucos para Google Reader

Una interesante recopilación de recursos y recetas para sacar un mayor partido a Google Reader: atajos de teclado, uso de filtros, utilizar las notas,...