Google

tunait.com » Tutorial » Listas dependientes


Listas dependientes desde base de datos con PHP y mySQL (II)

Listas dependientes con PHP y mySQL (I)

Generando el código

A continuación deberemos colocar las líneas de código que definan los contenidos de cada una de las listas dependientes. Esto es lo que vamos a escribir en el servidor usando PHP sacando los datos desde la base de datos.

Asumo que ya sabes realizar la conexión con la base de datos o no estarías leyendo este tutorial, de manera que nos saltaremos esa parte.

Vamos a definir un array que guarde las categorías principales para, más tarde, escribir la lista inicial en nuestro formulario.

$categorias_padre = array();

A continuación realizamos una consulta a la base de datos pidiendo todas las categorías existentes en la tabla categorias_productos y las ordenamos por el id de su categoría padre.

$query = mysql_query("select * from categorias_productos order by id_categoria_padre");

Creamos un bucle para pasar por cada uno de los registros devueltos por la consulta a la base de datos

while($res = mysql_fetch_assoc($query)){

}

Lo primero que pedimos es que, en caso de ser una categoría principal, nos guarde los datos en el array que declaramos antes de entrar al bucle

if($res["id_categoria_padre"] == 0) $categorias_padre["cat_".$res["id_categoria"]] = $res["nombre_categoria"];

A continuación escribimos los arrays javascript;

En el script Javascript de las listas dependientes se crean arrays para guardar las opciones que se cargarán en los selectores. En la configuración del script se indica que:

" Crear un Array que lleve por nombre el valor enviado por el selector que llamó a la función:

por ejemplo, si se escoge en el primer selector la opción "herramientas" que lleva también "herramientas" por value llamará al Array (lista) del mismo nombre."

Como los nombres de las categorías pueden llevar acentos u otros caracteres extraños y nos daría entonces problemas con Javascript vamos a usar, como nombre de estos arrays, el identificador en la base de datos de la categoría. Como los nombres de las variables no pueden comenzar por un número vamos a anteponer cat_ al nombre de estas variables, de forma que cada array lleve por nombre cat_1, cat_2, cat_3, etc.

var cat_<?=$res["id_categoria"] ?>=new Array()

ok, ahora deberemos escribir cada uno de los elementos del array asignando un índice de posición correlativo. Para ellos creamos una variable $contador que inicializamos a cero

$contador = 0;

y escribimos la primera opción de la lista que siempre será el nombre de la categoría

cat_el id de la categoría[el valor de la variable $contador inicializada a cero] = new slctr('-- el nombre de la categoría --')

cat_<?=$res["id_categoria"]."[".$contador++ ?>] = new slctr('- -<?=$res["nombre_categoria"] ?>- -')

Si el primer registro devuelto por la base de datos fuera

id_categoria: 1
nombre_categoria: Herramientas
id_categoria_padre: 0

Lo que se escribiría en el documento sería

var cat_1=new Array()
   cat_1[0] = new slctr('- -Herramientas- -')

A continuación escribiremos los elementos asociados a ese registro. En caso de ser una categoría principal lo que se escribirá serán las subcategorías asociadas; en el caso de ser una subcategoría lo que se escribirá serán los productos asociados a esa subcategoría.

Para ello necesitamos realizar otra consulta a la base de datos pero esta consulta deberemos hacerla a una u otra tabla dependiendo de si lo que debemos buscar son subcategorías (en el caso de estar escribiendo una lista de una categoría principal) o de si lo que debemos buscar son ya los productos asociados a una subcategoría (en el caso de que estemos escribiendo una lista de una subcategoría)

Lo primero que haremos al respecto será verificar si estamos con una lista de categoría principal o de subcategoría. El patrón común que las distingue es el campo id_categoria_padre que si es una categoría principal tendrá siempre un valor de 0 (cero) y si es una subcategoría tendrá siempre un valor superior a cero.

if($res["id_categoria_padre"] == 0)

Si la condición es cierta realizaremos la consulta a la tabla categorias_productos pidiendo las subcategorías cuyo id_categoria_padre sea igual al identificador del registro con el cual estamos actuando.
En el ejemplo anterior del registro 1 Herramientas pediríamos lo siguiente:

Select id_categoria, nombre_categoria from categorias_productos where id_categoria_padre = 1 order by nombre_categoria

Usaremos un alias para el campo nombre_categoria

Select id_categoria, nombre_categoria as 'nombre' from categorias_productos where id_categoria_padre = 1 order by nombre_categoria


Finalmente debemos usar el valor del id de la categoría padre del registro con el que estamos trabajando. La petición a la base de datos nos queda como sigue:

$query2 = mysql_query("select id_categoria, nombre_categoria as 'nombre' from categorias_productos where id_categoria_padre = ". $res["id_categoria"]. " order by nombre_categoria");

Ahora bien, en el caso de que la categoría padre sea distinta a cero, es decir, que estemos escribiendo los datos de una subcategoría, la tabla a la que deberemos consultar será la de productos.

$query2 = mysql_query("select id_categoria, nombre_item as 'nombre' from productos where id_categoria = ". $res["id_categoria"]. " order by nombre_item");

Bien, una vez tengamos una u otra petición a la base de datos (a la tabla de categorías o a la tabla de productos) ya podemos crear un bucle que pase por cada uno de los registros devueltos


while($res2 = mysql_fetch_assoc($query2)){ ?>
   cat_<?=$res["id_categoria"]."[".$contador++ ?>] = new slctr("<?=$res2["nombre"]?>",'cat_<?=$res2["id_categoria"]?>')
<? }

El bloque entero quedaría de la siguiente forma:


<?
$query = mysql_query("select * from categorias_productos order by id_categoria_padre");
$categorias_padre = array();
while($res = mysql_fetch_assoc($query)){ 
   $contador = 0;
   if($res["id_categoria_padre"] == 0) $categorias_padre["cat_".$res["id_categoria"]] = $res["nombre_categoria"];
?>
var cat_<?=$res["id_categoria"] ?>=new Array()
   cat_<?=$res["id_categoria"]."[".$contador++ ?>] = new slctr('- -<?=$res["nombre_categoria"] ?>- -')
<? 
   if($res["id_categoria_padre"] == 0){ 
      $query2 = mysql_query("select id_categoria, nombre_categoria as 'nombre' from categorias_productos where id_categoria_padre = ". $res["id_categoria"]. " order by nombre_categoria");
   }
   else{
      $query2 = mysql_query("select id_categoria, nombre_producto as 'nombre' from productos where id_categoria = ". $res["id_categoria"]. " order by nombre_producto");
   }
   while($res2 = mysql_fetch_assoc($query2)){ ?>
      cat_<?=$res["id_categoria"]."[".$contador++ ?>] = new slctr("<?=$res2["nombre"]?>",'cat_<?=$res2["id_categoria"]?>')
<? } 
} 
?>
//-->
</script>

Listas dependientes con PHP y mySQL (III) - Escribiendo el HTML


Copyright © 2006 www.tunait.com todos los derechos reservados