Foros del Web » Programando para Internet » PHP »

Como se hace Menu con tres subniveles, cargando datos desde BD??

Estas en el tema de Como se hace Menu con tres subniveles, cargando datos desde BD?? en el foro de PHP en Foros del Web. Estoy creando un menu que lee los datos directamente desde una BD, me esta funcionando bien en el primer subnivel, pero el segundo subnivel no ...
  #1 (permalink)  
Antiguo 18/12/2011, 12:07
Avatar de edilbertojara  
Fecha de Ingreso: marzo-2009
Mensajes: 22
Antigüedad: 15 años, 8 meses
Puntos: 0
Pregunta Como se hace Menu con tres subniveles, cargando datos desde BD??

Estoy creando un menu que lee los datos directamente desde una BD, me esta funcionando bien en el primer subnivel, pero el segundo subnivel no me lo esta cargando desde la BD.

Ya revisé otros foros y he logrado llegar hasta este punto, pero aca estoy un poco enredado.

La estructura que tengo es asi (las relaciones están bien):
Tres tablas:
1. menu
2. sub_menu1
3. sub_menu2

Me esta leyendo los datos de las dos primeras (menu y sub_menu1) y carga perfectamente, es decir de cada item de la tabla menu que tiene submenus nivel 1, me los carga muy bien, ... pero por ejemplo si algun item de la tabla sub_menu1 tiene a su vez otros items dependientes(sub_menu2), estos (los de la tabla sub_menu2) no cargan.

El código que tengo es este:

Código PHP:

<?php include ("../administrativo/conexion.php"); ?>
<?php
        $rst_nombre_menu
=mysql_query("SELECT * FROM menu"$conexion);
        
$num_registos=mysql_num_rows($rst_nombre_menu);
        if (
mysql_num_rows ($rst_nombre_menu)==0)
        echo 
"No hay items en el menu Principal";
?>
<?php
        $rst_nombre_sub_menu1
=mysql_query("SELECT * FROM sub_menu1"$conexion);
        
$num_registos=mysql_num_rows($rst_nombre_sub_menu1);
        if (
mysql_num_rows ($rst_nombre_sub_menu1)==0)
        echo 
"No hay items en el SubMenu1";
?>
<?php
        $rst_nombre_sub_menu2
=mysql_query("SELECT * FROM sub_menu2"$conexion);
        
$num_registos=mysql_num_rows($rst_nombre_sub_menu2);
        if (
mysql_num_rows ($rst_nombre_sub_menu2)==0)
        echo 
"No hay items en el SubMenu2";
?>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Primer UL [inicio]--><ul>
<?php while ($fila_nombre_menu=mysql_fetch_array($rst_nombre_menu))    { $id_menu $fila_nombre_menu["id_menu"];?> 
<!-- Primer LI [inicio]--><li>
        <a href=""><?php echo $fila_nombre_menu["id_menu"].$fila_nombre_menu["nombre_menu"]; ?></a>
        <?php $rst_nombre_sub_menu1=mysql_query("SELECT * FROM sub_menu1 WHERE id_menu='$id_menu'");
        if (
mysql_num_rows ($rst_nombre_sub_menu1)==0){ 
        }else{ 
?>
<!-- Segundo UL [inicio]--><ul>
<?php while ($fila_nombre_sub_menu1=mysql_fetch_array($rst_nombre_sub_menu1)){ $id_nombre_sub_menu1 $fila_nombre_sub_menu1["id_sub_menu1"];?> 
<!-- Segundo LI [inicio]--><li>
        <a href=""><?php echo $fila_nombre_sub_menu1 ["id_sub_menu1"].$fila_nombre_sub_menu1 ["nombre_sub_menu1"]?></a>
        <?php $rst_nombre_sub_menu2=mysql_query("SELECT * FROM sub_menu2 WHERE id_menu='$id_sub_menu1'");
        if (
mysql_num_rows ($rst_nombre_sub_menu2)==0){
        }else{ 
?>        
<!-- Tercer UL [inicio]--><ul>
<?php while ($fila_nombre_sub_menu2=mysql_fetch_array($rst_nombre_sub_menu2)) { $id_nombre_sub_menu2 $fila_nombre_sub_menu2["id_sub_menu2"];?> 
<!-- Tercer LI [inicio]--><li>
        <a href=""><?php echo $fila_nombre_sub_menu2["id_sub_menu2"].$fila_nombre_sub_menu2["nombre_sub_menu2"]; ?></a>
        <?php $rst_nombre_sub_menu3=mysql_query("SELECT * FROM sub_menu2 WHERE id_sub_menu2='$id_sub_menu2'");
        if (
mysql_num_rows ($rst_nombre_sub_menu2)==0){
        }else{ 
?>
        <?php ?>
<!-- Tercer LI [termina]--></li>    
        <?php ?>
<!-- Tercer UL [termina]--></ul>
        <?php ?>
<!-- Segundo LI [termina]--></li>
        <?php ?>
<!-- Segundo UL [termina]--></ul>
        <?php ?>
<!-- Primer LI [termina]--></li>
        <?php ?>
<!-- Primer UL [termina]--></ul>
Por favor, me pueden indicar por que no me fuciona?...
... o si hay otra forma de realizarlo, por favor indiquenme
... Gracias!!
  #2 (permalink)  
Antiguo 18/12/2011, 13:41
Avatar de jorgelpadronb  
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 13 años, 3 meses
Puntos: 37
Respuesta: Como se hace Menu con tres subniveles, cargando datos desde BD??

Saludos. Creo que eso lo puedes hacer con menos complicaciones. Puedes tener todos los elementos en una misma tabla en la BD. Solamente tendrías que incluirle un campo donde pones el Id un elemento contenedor. Por ejemplo:

Tabla Menu:

Id Nombre Contenedor
1 Elem_1 0
2 Elem_2 0
3 Elem_3 1
4 Elem_4 1
5 Elem_5 2
6 Elem_6 2
7 Elem_7 3

El campo contenedor almacena el Id del elemento de la misma tabla dentro del cual se encuentra el elemento. Por ejemplo, Elem_3 está dentro de Elem_1 (Id = 1) y Elem_7 está dentro de Elem_3 (Id = 3).

Luego con una función recursiva se puede recorrer la tabla y construir el arbol. Este método puede ser lento con listas muy largas de elementos, pero en el caso de un menú no creo que tengas demasiados elementos como para que genere una lentitud notable. Para la tabla hipotética que te pongo de ejemplo puedes probar este código:

Código PHP:
Ver original
  1. function Menu($Raiz=0,$Level=0){
  2.   $SQL = "SELECT * FROM Menu WHERE Contenedor=$Raiz";
  3.   $menu = mysql_query($SQL);
  4.   if($menu){
  5.     echo '<ul>';
  6.     while($row = mysql_fetch_array($menu)){
  7.       echo '<li>'.$row['Nombre'].'</li>';
  8.       Menu($row['Id'],$Level+1);
  9.     }
  10.     echo '</ul>';
  11.   }
  12.  }
  13.  mysql_connect('localhost','user','password');
  14.  mysql_select_db('arbol');
  15.  Menu();

De esta forma puedes editar el menú con más facilidad e incluso ponerle todos los niveles que quieras.

Yo lo probé y funciona OK. Si te sirve, tendrías que adaptarlo a tus necesidades.

Saludos.
__________________
Los hombres pequeños, nunca se sienten pequeños; los hombres grandes, nunca se sienten grandes.

No sé quien fué el que dijo eso, pero está bueno.

Última edición por jorgelpadronb; 18/12/2011 a las 13:54
  #3 (permalink)  
Antiguo 18/12/2011, 15:34
Avatar de edilbertojara  
Fecha de Ingreso: marzo-2009
Mensajes: 22
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Como se hace Menu con tres subniveles, cargando datos desde BD??

Muchas gracias Jorge... estoy haciendo pruebas.. luego te confirmo que paso... gracias...

Cita:
Iniciado por jorgelpadronb Ver Mensaje
Saludos. Creo que eso lo puedes hacer con menos complicaciones. Puedes tener todos los elementos en una misma tabla en la BD. Solamente tendrías que incluirle un campo donde pones el Id un elemento contenedor. Por ejemplo:

Tabla Menu:

Id Nombre Contenedor
1 Elem_1 0
2 Elem_2 0
3 Elem_3 1
4 Elem_4 1
5 Elem_5 2
6 Elem_6 2
7 Elem_7 3

El campo contenedor almacena el Id del elemento de la misma tabla dentro del cual se encuentra el elemento. Por ejemplo, Elem_3 está dentro de Elem_1 (Id = 1) y Elem_7 está dentro de Elem_3 (Id = 3).

Luego con una función recursiva se puede recorrer la tabla y construir el arbol. Este método puede ser lento con listas muy largas de elementos, pero en el caso de un menú no creo que tengas demasiados elementos como para que genere una lentitud notable. Para la tabla hipotética que te pongo de ejemplo puedes probar este código:

Código PHP:
Ver original
  1. function Menu($Raiz=0,$Level=0){
  2.   $SQL = "SELECT * FROM Menu WHERE Contenedor=$Raiz";
  3.   $menu = mysql_query($SQL);
  4.   if($menu){
  5.     echo '<ul>';
  6.     while($row = mysql_fetch_array($menu)){
  7.       echo '<li>'.$row['Nombre'].'</li>';
  8.       Menu($row['Id'],$Level+1);
  9.     }
  10.     echo '</ul>';
  11.   }
  12.  }
  13.  mysql_connect('localhost','user','password');
  14.  mysql_select_db('arbol');
  15.  Menu();

De esta forma puedes editar el menú con más facilidad e incluso ponerle todos los niveles que quieras.

Yo lo probé y funciona OK. Si te sirve, tendrías que adaptarlo a tus necesidades.

Saludos.
  #4 (permalink)  
Antiguo 18/12/2011, 16:51
Avatar de edilbertojara  
Fecha de Ingreso: marzo-2009
Mensajes: 22
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Como se hace Menu con tres subniveles, cargando datos desde BD??

NO me sirvió... nada... ...no entendi.. no lo pude adaptar a lo que tengo...

Cita:
Iniciado por edilbertojara Ver Mensaje
Muchas gracias Jorge... estoy haciendo pruebas.. luego te confirmo que paso... gracias...
  #5 (permalink)  
Antiguo 18/12/2011, 20:12
Avatar de jorgelpadronb  
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 13 años, 3 meses
Puntos: 37
Respuesta: Como se hace Menu con tres subniveles, cargando datos desde BD??

Hola. Cuando te digo adaptarlo a tus necesidades no significa que lo acoples a lo que tienes hecho. De hecho no tiene nada que ver con la forma en que lo estabas haciendo. Por eso te digo si te sirve, porque implementar eso significa cambiar de raiz la forma en que estás construyendo el menú, empezando por quitar las tablas de la BD y sustituirlas por una única tabla que se ajuste al nuevo método.

Si te conviene repensar el asunto de los menus desde 0, te sirve lo que te dí, si no, entonces note sirve, pues es una lógica totalmente distinta y no se puede acoplar a lo ya tienes hecho.

Si quieres seguir adelante con mi ejemplo, yo te puedo ir orientando, si no, entonces trataré de identificar lo que tienes hecho para ver como te puedo ayudar.

Si quieres mi consejo, te recomiendo mi ejemplo. Tal vez te cueste un poco echarlo a andar ahora pero te va a ahorrar dolores de cabeza en el futuro cuando quieras editar los menus o agregarle mas de tres niveles.

Saludos, espero tu respuesta a ver que hacemos.
__________________
Los hombres pequeños, nunca se sienten pequeños; los hombres grandes, nunca se sienten grandes.

No sé quien fué el que dijo eso, pero está bueno.
  #6 (permalink)  
Antiguo 19/12/2011, 18:10
Avatar de edilbertojara  
Fecha de Ingreso: marzo-2009
Mensajes: 22
Antigüedad: 15 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Como se hace Menu con tres subniveles, cargando datos desde BD??

Jorge muchas gracias... voy entonces a hacer lo me sugieres... yo te voy comentando si tengo problemas... gracias


Cita:
Iniciado por jorgelpadronb Ver Mensaje
Hola. Cuando te digo adaptarlo a tus necesidades no significa que lo acoples a lo que tienes hecho. De hecho no tiene nada que ver con la forma en que lo estabas haciendo. Por eso te digo si te sirve, porque implementar eso significa cambiar de raiz la forma en que estás construyendo el menú, empezando por quitar las tablas de la BD y sustituirlas por una única tabla que se ajuste al nuevo método.

Si te conviene repensar el asunto de los menus desde 0, te sirve lo que te dí, si no, entonces note sirve, pues es una lógica totalmente distinta y no se puede acoplar a lo ya tienes hecho.

Si quieres seguir adelante con mi ejemplo, yo te puedo ir orientando, si no, entonces trataré de identificar lo que tienes hecho para ver como te puedo ayudar.

Si quieres mi consejo, te recomiendo mi ejemplo. Tal vez te cueste un poco echarlo a andar ahora pero te va a ahorrar dolores de cabeza en el futuro cuando quieras editar los menus o agregarle mas de tres niveles.

Saludos, espero tu respuesta a ver que hacemos.
  #7 (permalink)  
Antiguo 19/12/2011, 19:43
Avatar de jorgelpadronb  
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 13 años, 3 meses
Puntos: 37
Respuesta: Como se hace Menu con tres subniveles, cargando datos desde BD??

Ok, vale la pena que lo implementes. El ejemplo funciona perfecto, yo mismo lo probé. Pruébalo primero tal cual te lo puse, para que estudies el funcionamiento y luego puedas irlo adaptando a tu caso. Cualquier duda postea de nuevo.

Saludos.
__________________
Los hombres pequeños, nunca se sienten pequeños; los hombres grandes, nunca se sienten grandes.

No sé quien fué el que dijo eso, pero está bueno.

Etiquetas: cargando, mysql, sql, tabla, tres
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:45.