Foros del Web » Programando para Internet » PHP »

crear menu dinamico con php y mysql

Estas en el tema de crear menu dinamico con php y mysql en el foro de PHP en Foros del Web. Hola a todos: Estoy diseñando una pagina donde las paginas seran llamadas a partir del numero de id ejemplo www.mipagina.php?pid=10; La estructura de mi pagina ...
  #1 (permalink)  
Antiguo 13/06/2012, 14:52
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
crear menu dinamico con php y mysql

Hola a todos:

Estoy diseñando una pagina donde las paginas seran llamadas a partir del numero de id

ejemplo www.mipagina.php?pid=10;

La estructura de mi pagina se guarda en tablas del siguiente modo, a modo de ejemplo coloco una manera como podria ser el menu
Código HTML:
id      linklabel     parent     parentid
1       inicio            menu              0
2     nosotros        menu              0
3     productos      menu              0
4     servicio          menu              0
5     gafas             productos       3
6     balones         productos       3
7     gafas de sol  gafas              5
8     gafas de leer gafas             5

Por tanto si tuvieramos la distribucion del menu se haria de la forma
Código HTML:
nicio
nosotros
productos
      gafas
         gafas de sol
          gafas de leer
       balones
servicio
i

Ya he logrado usando css realizar menus desplegables basandose en listas de forma estática. Ahora lo que necesito es realizar este mismo listado pero de manera dinámica usando los datos de la tabla. Por mas que le he echado cabeza no se me ocurre como. Lo que he visto en tutoriales es que tratan de realizar arreglos y a partir de ahí se recorren pero no me quedaria muy claro como realizar estos arreglos de manera dinámica.

Agradezco a la persona que me pueda ayudar sobre como podria realizarlo, ya sea a traves de arreglos u de otra forma.

p.d pido perdon por el desorden de la primera tabla pero es la primera vez que trato de usar este editor para simular tablas. Igual creo que se entiende bien como va.
__________________
Blog de humor http://elcuasatar.net63.net/
  #2 (permalink)  
Antiguo 13/06/2012, 15:01
 
Fecha de Ingreso: noviembre-2009
Mensajes: 535
Antigüedad: 15 años, 1 mes
Puntos: 25
Respuesta: crear menu dinamico con php y mysql

hay alguna ejemplo para mostrarno?
__________________
cada vez que aprendes algo te crees que no sabes nada
  #3 (permalink)  
Antiguo 13/06/2012, 15:05
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 7 meses
Puntos: 528
Respuesta: crear menu dinamico con php y mysql

Suponiendo que tienes hasta tres niveles almacenados en una bd:

Código PHP:
Ver original
  1. $x=0;
  2.     while($p=mysql_fetch_assoc($paginas)){
  3.         $men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][$x]["id"]=$p["id"];//id de tu pagina
  4.         $men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][$x]["nom"]=$p["nombre"];//nombre
  5.         $x++;
  6.     }
  7.  
  8. $menu='<ul>';
  9.     if(isset($men))
  10.     foreach($men as $n1 =>$mx){
  11.         $menu.="<li><a>$n1</a><ul>";
  12.         foreach($mx as $n2 =>$my){
  13.             if(!empty($n2)){
  14.                 $menu.="<li><a>$n2</a><ul>";
  15.                 foreach($my as $n3 =>$mz){
  16.                     if(!empty($n3)){
  17.                         $menu.="<li><a>$n3</a><ul>";
  18.                         foreach($mz as $nms =>$md)
  19.                             $menu.="<li><a href=\"$md[id]\">$md[nom]</a></li>";
  20.                         $menu.="</ul></li>";
  21.                     }else
  22.                         foreach($my[$n3] as $nms=>$md)
  23.                             $menu.="<li><a href=\"$md[id]\">$md[nom]</a></li>";
  24.                 }
  25.                 $menu.="</ul></li>";
  26.             }else
  27.                 foreach($my[$n2] as $nms=>$md)
  28.                     $menu.="<li><a href=\"$md[id]\">$md[nom]</a></li>";
  29.         }
  30.         $menu.="</ul></li>";
  31.     }
  32. $menu.='</ul>';
  #4 (permalink)  
Antiguo 13/06/2012, 15:13
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

Pues hasta el momento he realizado esto para que me muestre el menu en su primer nivel (es decir los que no tienen padres)
Código PHP:
$sqlCommand="SELECT id, linklabel FROM pages WHERE parentid='0'";
$query=mysql_query($sqlCommand,$conexion);
$menuDisplay='';
$menuDisplay.="<div id='header'>";
$menuDisplay.="<ul class='nav'>";
while (
$row=mysql_fetch_array($query)){
  
$pid=$row["id"];
  
$linklabel=$row["linklabel"];
  
$menuDisplay.='<li><a href="index.php?pid='.$pid.'"'>'.$linklabel.'</a>>></li>;

}
$menuDisplay.="</ul></div>"
Esto me funciona sin problemas pero como ven en estos momentos lo tengo limitado por ahora a solo los que no tienen hijos. No tengo muy claro como haria para colocar los otros.
__________________
Blog de humor http://elcuasatar.net63.net/
  #5 (permalink)  
Antiguo 13/06/2012, 15:31
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

Cita:
Iniciado por ocp001a Ver Mensaje
Suponiendo que tienes hasta tres niveles almacenados en una bd:

Código PHP:
Ver original
  1. $x=0;
  2.     while($p=mysql_fetch_assoc($paginas)){
  3.         $men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][$x]["id"]=$p["id"];//id de tu pagina
  4.         $men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][$x]["nom"]=$p["nombre"];//nombre
  5.         $x++;
  6.     }
  7.  
  8. $menu='<ul>';
  9.     if(isset($men))
  10.     foreach($men as $n1 =>$mx){
  11.         $menu.="<li><a>$n1</a><ul>";
  12.         foreach($mx as $n2 =>$my){
  13.             if(!empty($n2)){
  14.                 $menu.="<li><a>$n2</a><ul>";
  15.                 foreach($my as $n3 =>$mz){
  16.                     if(!empty($n3)){
  17.                         $menu.="<li><a>$n3</a><ul>";
  18.                         foreach($mz as $nms =>$md)
  19.                             $menu.="<li><a href=\"$md[id]\">$md[nom]</a></li>";
  20.                         $menu.="</ul></li>";
  21.                     }else
  22.                         foreach($my[$n3] as $nms=>$md)
  23.                             $menu.="<li><a href=\"$md[id]\">$md[nom]</a></li>";
  24.                 }
  25.                 $menu.="</ul></li>";
  26.             }else
  27.                 foreach($my[$n2] as $nms=>$md)
  28.                     $menu.="<li><a href=\"$md[id]\">$md[nom]</a></li>";
  29.         }
  30.         $menu.="</ul></li>";
  31.     }
  32. $menu.='</ul>';
ocp001a De antemano muchas gracias por tu respuesta. La estructura como hace el recorrido con los foreach la tengo clara y digamos que eso de momento no tiene problema entenderlo.

Lo que no me quedo muy claro es la primera parte
Código PHP:
$x=0;
    while(
$p=mysql_fetch_assoc($paginas)){
        
$men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][$x]["id"]=$p["id"];//id de tu pagina
        
$men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][$x]["nom"]=$p["nombre"];//nombre
        
$x++;
    } 
Si entendi bien la $paginas seria algo así como
Código PHP:
$sql=SELECT from pages;
$paginas=mysql_query($sql,$conexion); 
Y por tanto x iria desde 0 hasta el numero total de articulos. Según tienes en tu arreglo se colocaria tres datos mas a la tabla que serian nivel 1, nivel 2 y nivel 3.
¿Que datos se deberian colocar en estos tres campos para obtener el nivel correspondiente? Estoy un poco perdido en esta parte. Gracias de antemano por tu colaboración.
__________________
Blog de humor http://elcuasatar.net63.net/
  #6 (permalink)  
Antiguo 13/06/2012, 15:40
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 7 meses
Puntos: 528
Respuesta: crear menu dinamico con php y mysql

La $x es sólo para relacionar una página con su id o url, nada especial, ya que si hicieras

$men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][]["id"]=$p["id"];
$men[$p["nivel1"]][$p["nivel2"]][$p["nivel3"]][]["nom"]=$p["nombre"];

Sin la $x, el id de la pagina quedaría una posición atrás del nombre.

Los niveles, en mi caso concreto, los tengo establecidos como parte de los datos del menú, por ejemplo, para cada página yo tengo el registro así más o menos:

nombre pagina | id | nivel1 | nivel2 | nivel3

Cortes | 1 | Contabilidad | Ingresos |

Pedidos | 2 | Inventarios | Operaciones | Compra


Así, la página de cortes pertenece a la sección contabilidad subsección ingresos, mientras que Pedidos tiene un nivel más de profundidad.
  #7 (permalink)  
Antiguo 13/06/2012, 15:51
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

Ok, muchas gracias por tu colaboración. Creo que ya entendi la dinámica para realizarlo. Hare las modificaciones necesarias a mi tabla para sacarlo de esa forma. Seguro ya saldran dudas sobre el camino pero espero poder resolverlas solo para no molestarte mas.

Cualquier cosa ya les comentare mis avances por este foro. De verdad agradezco mucho tu colaboración.
__________________
Blog de humor http://elcuasatar.net63.net/
  #8 (permalink)  
Antiguo 14/06/2012, 20:57
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Mensaje Respuesta: crear menu dinamico con php y mysql

Gracias ocp001a por tu colaboración pero la verdad no me fue posible utilizar tu opción. A pesar de que le realice algunos cambios para que se adaptara la solución no me funciona exactamente como yo necesito. Como estoy usando css para crear el menu se debe conservar la estructura de la forma.

Código HTML:
<div>
   <ul>
          <li><a href=#>enlace 1</a></li>
          <li><a href=#>enlace 2</a></li>
          <li><a href=#>enlace 3</a>
                 <ul>
                           <li><a href=#>enlace 4</a>
                           <li><a href=#>enlace 5</a>
                </ul>

          </li>

   </ul>
</div> 
Y tal como esta ahora el script no es posible dejarlo de esta forma, le di muchas vueltas pero no lo logre ajustar a lo que yo necesito. De todas maneras gracias por tu colaboración y si se te ocurre alguna sugerencia o a alguien mas se le ocurre otra idea se lo agradezco mucho.
__________________
Blog de humor http://elcuasatar.net63.net/
  #9 (permalink)  
Antiguo 15/06/2012, 02:51
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 8 meses
Puntos: 97
Respuesta: crear menu dinamico con php y mysql

Hola cuasatar.
Yo lo plantearia con una función recursiva.
Código PHP:
function Menu($pId=0){
    
$sql="select * from menu where parentid=$pid";
    
$array=GetQuery($sql);
    if(empty(
$array)){return "";}
    foreach(
$array as $i=>$md){
        
$menu.="<li><a href=\"{$md[id]}\">{$md[nom]}</a></li>";
        
$menu.=Menu($md[id]);
    }
    
$menu="<ul>$menu</ul>";
    if(
$pId==0){$menu="<div>$menu</div>";}
    return 
$menu;

No he testeado el código, pero la idea es esa, y te sirve para n niveles.
Cualquier duda, aquí estoy.

Saludos!

Última edición por oscartt67; 15/06/2012 a las 04:29
  #10 (permalink)  
Antiguo 15/06/2012, 09:34
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

Hola, gracias por tu respuesta. Tengo algunas preguntas porque no me quedo claro tu código, pero creo entender la idea.

Supongamos para empezar que tengo con parentid=0 cuatro enlaces, por ejemplo inicio(id=1), servicios(id=2), producto(id=3) y contacto(id=4), por tanto :


Código PHP:
$array=GetQuery($sql); 
Yo pensaria que esta funcion al final entregaria algo así como:

array([1]=>inicio [2]=>servicios [3]=>producto [4]=>contacto);

De allí empieza a crear la lista y en la siguiente iteración busca el pid=1 para encontrar si inicio tiene hijos o no, etc. ¿Es correcta mi afirmación? Yo pense que esto se podria hacer con mysql_fetch array pero el problema es que no podria iterar recursivamente la función porque tocaria tener persistente la conexión a la base de datos para hacer la consulta.

En segunda no se como se usa $array=GetQuery($sql); hace parte de alguna libreria o complemento que toca instalar? lo he buscado por el manual de php y no encuentro algo similar.

Gracias por tu colaboración. La he analizado y parece que si podria llegar a funcionar segun como se plantea. Quedo atento a tu respuesta, mientras tanto seguire averiguando lo del GetQuery.
__________________
Blog de humor http://elcuasatar.net63.net/
  #11 (permalink)  
Antiguo 15/06/2012, 10:12
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 8 meses
Puntos: 97
Respuesta: crear menu dinamico con php y mysql

Cita:
$array=GetQuery($sql);
Disculpa por mi abreviación: GetQuery era una manera de decir 'haz la consulta a la db, con mysql o PDO o lo que tu utilizes...Lo importante es que te devuelva el array, con el formato que tu mismo has indicado,con el nombre y el id.
Si quieres que te lo reescriba con mysql_, dimelo.

Saludos!
  #12 (permalink)  
Antiguo 15/06/2012, 10:20
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años, 8 meses
Puntos: 97
Respuesta: crear menu dinamico con php y mysql

Mira, como hace mucho calor para ir a atar las tomateras, te lo he reescrito con mysql.
Código PHP:

$elmenu
=Menu();


function 
Menu($pId=0){
    
$result mysql_query("select id,linklabel from menu where parentid=$pid");
    if(empty(
$result)){return "";}
    while (
$row mysql_fetch_array($result)) {
        
$menu.="<li><a href=\"{$row['id']}\">{$row['linklabel']}</a></li>";
        
$menu.=Menu($row['id']);
    }
    
$menu="<ul>$menu</ul>";
    if(
$pId==0){$menu="<div>$menu</div>";}
    return 
$menu;

Saludos.
  #13 (permalink)  
Antiguo 15/06/2012, 12:26
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: crear menu dinamico con php y mysql

Que tal cuasatar,

Te dejo una referencia http://jdbartlett.com/2008/01/15/tre...cy-list-model/. no siempre es necesario la recursividad para tratar el adjacency list y ten en cuenta que no es el único modelo para manejar estructuras de árbol, talves te interese buscar info sobre el nested set model.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #14 (permalink)  
Antiguo 15/06/2012, 13:37
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

Bueno, hola a todos. En verdad agradezco mucho su ayuda. masterpuppet desafortunadamente no alcance a ver tu post antes de crear mi solución pero viendola me parece que es la más apropiada. Alguna vez maneje en mis años mozos eso de los árboles en estructura de datos en c++ pero tantos años fuera de la academía me han hecho perder un poco el ritmo.

Con respecto a la solución que me dio oscartt67, la recursión me presento algunos inconvenientes pero me base en la idea para crear mi propia solución. Con esta logre mi solución para tres niveles de profundidad. Ya se algunos me daran un cocotazo en la cabeza al ver tres anidamientos pero estoy seguro que con un poco más de trabajo y basandome en el enlace de masterpuppet podre crear una solución para n niveles. Prometo que si la encuentro la publicare.

Igual agradezco a ocp001a por su aporte inicial, me ayudo mucho a destrabarme porque no tenía ni idea de como empezar a atacar el problema.

Bueno, sin mas preambulos doy la solución que diseñe para tres niveles de profundidad. Creo que esta muy bien explicada en los comentarios asi que omito dar detalles adicionales. Igual si alguien quiere información adicional con gusto se la doy.

p.s. Para mis amigos españoles cocotazo es una hostia dada en la cabeza con los nudillos de la mano cerrada. Vamos un coscorrón de toda la vida.

Código PHP:
require_once "scripts/connect_to_mysql.php";
function 
Menu ($pid=0,$myConnectionUser){
    
//$myConnectionUser=$myConnectionUser;
    
$sqlCommand="SELECT * FROM pages WHERE parentid=$pid";
    
$query mysql_query($sqlCommand,$myConnectionUser) or die (mysql_error()); //busca los enlaces de primer nivel
    
if (empty($query)){return "";}
    
//echo count($query)."<br/>";
    
while ($row mysql_fetch_array($query)) {
        
$sqlsub="SELECT * FROM pages WHERE parentid={$row['id']}";
        
$querysub mysql_query($sqlsub,$myConnectionUser) or die (mysql_error());
        if (
mysql_num_rows($querysub)==0){//si no tiene hijos imprime la lista
         
$menu.="<li><a href=\"{$row['id']}\">{$row['linklabel']}</a></li>";
        }
//if (mysql_num_rows($querysub)==0){
        
else{//si tiene hijos empieza a buscarlos 
            //$menu.="<li><a href=\"{$row['id']}\">{$row['linklabel']}</a><ul>";
            
$menu.="<li><a href=\"#\">{$row['linklabel']}</a><ul>";
                while (
$rowsub mysql_fetch_array($querysub)) {
                    
$sqlsub2="SELECT * FROM pages WHERE parentid={$rowsub['id']}";//busqueda de los hijos de los hijos
                    
$querysub2 mysql_query($sqlsub2,$myConnectionUser) or die (mysql_error());
                    if (
mysql_num_rows($querysub2)==0){//si no tiene hijos imprime la lista
                         
$menu.="<li><a href=\"{$rowsub['id']}\">{$rowsub['linklabel']}</a></li>";
                    }
//if (mysql_num_rows($querysub2)==0){
                        
else{//si tiene hijos empieza a buscarlos 
                            
$menu.="<li><a href=\"#\">{$rowsub['linklabel']}</a><ul>";
                            while (
$rowsub2 mysql_fetch_array($querysub2)) {
                                
$menu.="<li><a href=\"{$rowsub2['id']}\">{$rowsub2['linklabel']}</a></li>";
                                }
//while ($rowsub2 = mysql_fetch_array($querysub2)) {
                            
$menu.="</ul></li>";
                            }
//else tercer nivel
                    
                    
}//while ($rowsub = mysql_fetch_array($querysub)) {
                
$menu.="</ul></li>";
            }
//else{ para dibujar segundo nivel
}//    while ($row = mysql_fetch_array($query)) {
return $menu;
}
//function Menu ($pid=0,$myConnectionUser){
$menu=Menu(0,$myConnectionUser);
$menu="<div id='header'><ul class='nav'>$menu</ul></div>";//añade el div y el ul externo y con eso se completa la lista del menu 
__________________
Blog de humor http://elcuasatar.net63.net/

Última edición por cuasatar; 15/06/2012 a las 13:45
  #15 (permalink)  
Antiguo 03/10/2012, 16:13
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

Bueno, como alguna vez lo prometi si lograba hacer la función de tipo recursiva lo publicaria. Obviamente no me voy a echar los créditos porque la hizo truman_truman pero en su aporte le coloque una mejora para hacerlo con mysqli orientado a objetos, si alguien quiere verlo puede seguir el enlace. Es mucho mas facil y digerible aunque la idea original se conserva.

http://www.forosdelweb.com/f18/aport...3/#post4284072
__________________
Blog de humor http://elcuasatar.net63.net/
  #16 (permalink)  
Antiguo 30/05/2013, 11:40
 
Fecha de Ingreso: marzo-2011
Mensajes: 6
Antigüedad: 13 años, 9 meses
Puntos: 0
Información Respuesta: crear menu dinamico con php y mysql

Hola a Todos,
Alguien tiene un ejemplo de un menú vertical css + php + mysql:
Mi Mysql tiene dos tablas:

Categorias:
idcategoria
nombre_cat

Subcategorias:
idsubcategoria
nombre_subcat
idcategoria



Muchas gracias de antemano... =)
  #17 (permalink)  
Antiguo 30/05/2013, 17:29
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: crear menu dinamico con php y mysql

El html y el css lo encuentras aca

http://www.youtube.com/watch?v=oZa2Ut8u2S0

El menu ya deje el enlace en el mensaje del hilo asi que no lo voy a volver a repetir. Esta muy claro y bien explicado.
__________________
Blog de humor http://elcuasatar.net63.net/
  #18 (permalink)  
Antiguo 20/10/2014, 18:18
 
Fecha de Ingreso: octubre-2014
Mensajes: 2
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: crear menu dinamico con php y mysql

hola bro buen aporte !!! una pregunta , no se si puede ayudarme en una duda , como le hago para cargar todo el contenido de mis menus en un div="principal" utilizando menu de mysql , saludos :)

Etiquetas: dinamico, mysql, tabla
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 14:27.