Combos enlazados

30.mar 2005 Envía un trackback

Con "combo" No me refiero a ningún ayuken!!!! (guiño guiño), al grano. Haciendo un formulario web para introducción de datos encuentro un pequeño problema, los combos enlazados. ¿Qué es eso?: Supongamos dos combos, uno con Comunidades Autónomas y otro con Provincias, ya os haceis la idea, ¿verdad?. Al seleccionar una comunidad autónoma concreta deben aparecer solamente las provincias pertenecientes.

Teniendo en cuenta que es muy probable que todos estos datos salgan de una base de datos, hemos de rellenar los combos con JavaScript pero conectando (a MySQL) en este caso vía PHP. El ejemplo estático (sin base de datos alguna) sería el siguiente:

<script language="JavaScript1.2">
function addOption(prov)
{
var comboBox = document.getElementById('opcion2');
switch (prov)
{
case 1:
comboBox.options.length = 0;
var newOption = new Option('1- Provincia1', '1');comboBox.options[comboBox.options.length] = newOption;
break;
case 2:
comboBox.options.length = 0;
var newOption = new Option('2- Provincia1', '1');comboBox.options[comboBox.options.length] = newOption;
var newOption = new Option('2- Provincia2', '2');comboBox.options[comboBox.options.length] = newOption;
var newOption = new Option('2- Provincia3', '3');comboBox.options[comboBox.options.length] = newOption;
break;
}
}
</script>
<select name="opcion1" onchange="addOption(this.value);">
<option value="">--selecciona--</option>
<option value="1">Autonomía1</option>
<option value="2">Autonomía2</option>
</select>
<select name="opcion2" id="opcion2"></select>


Una vez visto el ejemplo estático, pasemos a rellenar los combos dinamicamente con PHP. Para ello rellenamos todas las posibilidades al cargar la página y JavaScript se encargará de seleccionar qué combos se activan en cada evento, con el ejemplo guarro se verá mejor:

<?php mysql_connect($host, $user, $pass); mysql_select_db($base_datos); ?>
<script language="JavaScript1.2">
function addOption(prov)
{
var comboBox = document.getElementById('opcion2');
switch (prov)
{
case 1:
comboBox.options.length = 0;
<?php
$result=mysql_query("SELECT * FROM concellos WHERE idprovincia='1'");$data=mysql_fetch_array($result);
do
{
echo <<<HEAD
var newOption = new Option('$data[concello]', '$data[idconcellos]');comboBox.options[comboBox.options.length] = newOption;

HEAD;
}while($data=mysql_fetch_array($result))
?>
break;
case 2:
comboBox.options.length = 0;
<?php
$result=mysql_query("SELECT * FROM concellos WHERE idprovincia='2'");$data=mysql_fetch_array($result);
do
{
echo <<<HEAD
var newOption = new Option('$data[concello]', '$data[idconcellos]');comboBox.options[comboBox.options.length] = newOption;

HEAD;
}while($data=mysql_fetch_array($result))
?>
break;
}
}
</script>

<select name="opcion1" onchange="addOption(this.value);">
<option value="">--selecciona--</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 name="opcion2" id="opcion2"></select>

Sé que no es el mejor código, ni está optimizado, pero me ha sacado de un apuro. Ya tendré tiempo de mejorarlo poco a poco.

Comentarios
Gravatar coder@31.03.2005, 'hombre ... xD'

... un poco cerdo sí que es, pero tira xD

Gravatar r0sk@31.03.2005, 'Osi'

Ye, se admiten sugerencias socio, anímate ;)

Gravatar Wu@31.03.2005, 'uy dios'

Que indentacion horrible!!! XD
Es coña... Hace tanto que no toco codigo php que me pierdo, pero mu bueno lo de los scrollbars al [code][/code], ya diras como es el truquillo css...

Gravatar neuronal@01.04.2005, 'saltando a la comba in da street'

Algo parecido tuve que hacer con una aplicación para mi madre. En mi caso se trataban de procedencias ("departamentos") y prescripciones (médicos) de tal modo que cada procedencia tenía una serie de prescripciones asociadas (vamos, la clásica relación "una a muchos" con restricción de existencia.)

En tu caso comunidades = procedencias / provincias = prescripciones. Lo que haría es cargar el combo de las provincias en función del combo de las comunidades. Obtienes la clave principal de la comunidad deseada de su combo y con una consulta (SELECT PROVINCIAS.nombre FROM PROVINCIAS WHERE PROVINCIAS.cAjenaComunidades = $comunidad;) creas un array. Luego con un bucle recorres el array añadiendo nuevos items al combo de provincias (sería otra función para añadir, ya que hay que comprobar que el comboProvincias esté vacío o no, resetearlo si fuera necesario y añadir items)

Lo de usar un switch a mí me parece un pelo animal; no sé si coder gruñía cual yayo cascarrabias por eso XD

Gravatar neuronal@01.04.2005, '¿scroll? ¡¡barra de desplazamiento / deslizamiento!!'

Se me olvidaba, la jugada del scroll horizontal también me parece una buena idea para escupir código :-) ¡Ya si lo vomitas en lista numérica, <ol></ol>, ni te cuento socio! ¡Ah! y lo quiero también con sintaxis coloreada (...ya me puse exigente, si es que no puede ser XD)

Aunque bueno, lo de numerar las líneas de código queda muy útil visualmente pero es poco usable, por ser pijolini y no decir que claramente es una puta jodienda, ya que al copiar/pegar el código (para probarlo o lo que sea) obtienes también unas simpáticas almohadillas (que no almorranas) # representando cada número de la lista numerada.

En resumen, que te has marcado lo del scroll horizontal vamos... XD

Un saludo


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]