Foros del Web » Programando para Internet » PHP »

[APORTE] Menu categorias y subcategorias y mas...

Estas en el tema de [APORTE] Menu categorias y subcategorias y mas... en el foro de PHP en Foros del Web. Código PHP: /* -- -- Estructura de tabla para la tabla `menu` -- CREATE TABLE IF NOT EXISTS `menu` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `menu_nombre` varchar(25) NOT NULL,   `id_padre` int(11) NOT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ; -- -- Volcado de datos para la tabla `menu` -- INSERT INTO `menu` (`id`, `menu_nombre`, `id_padre`) VALUES (1, 'Home', 0), (2, 'home1', 1), (3, 'home2', 1), (4, 'home3', 1), (5, 'Productos', 0), (6, 'productos1', 5), (7, 'productos2', 5), (8, 'productos3', 5), (9, 'productosub1-1', 6), ...
  #1 (permalink)  
Antiguo 04/09/2012, 05:59
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
[APORTE] Menu categorias y subcategorias y mas...

Código PHP:
/*
--
-- Estructura de tabla para la tabla `menu`
--

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `menu_nombre` varchar(25) NOT NULL,
  `id_padre` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Volcado de datos para la tabla `menu`
--

INSERT INTO `menu` (`id`, `menu_nombre`, `id_padre`) VALUES
(1, 'Home', 0),
(2, 'home1', 1),
(3, 'home2', 1),
(4, 'home3', 1),
(5, 'Productos', 0),
(6, 'productos1', 5),
(7, 'productos2', 5),
(8, 'productos3', 5),
(9, 'productosub1-1', 6),
(10, 'productosub1-2', 6);


*/ 
function con(){
    
$conexion=mysql_connect("localhost","root","")or die ('Ha fallado la conexión: '.mysql_error());
    
//selección de la base de datos con la que vamos a trabajar
    
mysql_select_db("pruebas",$conexion);
    return 
$conexion;
}
 
 function 
menu($id_padre=0){
     
    
         
$sql "SELECT * FROM menu WHERE id_padre = $id_padre";     
         
$query mysql_query($sql,con());     
         while(
$resultado mysql_fetch_assoc($query)){    
             
             @
$menu .=  '<li>'.$resultado['menu_nombre'].'</li>'//
            
@$menu .=menu($resultado['id']); 
             
         }
     
             
$menu '<ul>'.$menu.'</ul>';
            return 
$menu;
  }
 
$menu menu();
echo 
$menu
__________________
la la la
  #2 (permalink)  
Antiguo 04/09/2012, 06:26
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Hola, vi tu aporte y se parece bastante a la idea que yo en algun momento cree. Claro que esta esta diseñada mucho mas sencilla y es facil de seguir.

http://www.forosdelweb.com/f18/crear...-mysql-998550/

La duda que me asalta es la formación de las listas. En la solución que yo propongo coloco listas dentro de listas de una manera un poco complicada pero al fin y al cabo funciona bien. Voy a tratar de probar tu solución aunque por lo que analizo asi a botepronto es que no saldra como yo lo digo, es decir

Código HTML:
<ul>
         <li>home</li>
               <ul>
                       <li>home1</li>
                        <li>home2</li>
                        <li>home3</li>
               </ul>
</ul> 
Bueno, falta mas pero creo que la idea se entiende bastante bien. Cualquier cosa ya nos comentaras.
__________________
Blog de humor http://elcuasatar.net63.net/
  #3 (permalink)  
Antiguo 04/09/2012, 08:00
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

uhhh si si , está mal, tenés razón, tengo que arreglerlo
__________________
la la la
  #4 (permalink)  
Antiguo 04/09/2012, 09:18
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Uy yo tambien he cometido un error y acabo de verlo. Pongo la corrección para que entiendan los que vean el aporte.

Código HTML:
<ul>
         <li>home
               <ul>
                       <li>home1</li>
                        <li>home2</li>
                        <li>home3</li>
               </ul>
        </li>//aquí se debe cerrar home para que contenga a los hijos.  

</ul> 
__________________
Blog de humor http://elcuasatar.net63.net/
  #5 (permalink)  
Antiguo 04/09/2012, 13:01
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Aparte de ese pequeño error de HTML, mejor quita las @, porque en caso de error es mejor saber de qué se trata para corregir el código.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 04/09/2012, 19:56
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Bueno, pido perdón por haberlo posteado apurado y Mal !!!!
dejo acá la versión corregida que funciona perfectamente, si hay algo para mejorarla bienvenido sea, Saludos gracias Triby y cuasatar


Código PHP:
<?php
/*
 * ================================================================================
 * Función Menú con Recurcividad 
 * http://www.forosdelweb.com/f18/aporte-menu-categorias-subcategorias-mas-1011423/
 * truman_truman
 * ===============================================================================
 *
 */



/*
************************************************************
---------------------------------------------------
---------------MYSQL ------------------------------
---------------------------------------------------
--
-- Estructura de tabla para la tabla `menu`
--

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `menu_nombre` varchar(25) NOT NULL,
  `id_padre` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Volcado de datos para la tabla `menu`
--

INSERT INTO `menu` (`id`, `menu_nombre`, `id_padre`) VALUES
(1, 'Home', 0),
(2, 'home1', 1),
(3, 'home2', 1),
(4, 'home3', 1),
(5, 'Productos', 0),
(6, 'productos1', 5),
(7, 'productos2', 5),
(8, 'productos3', 5),
(9, 'productosub1-1', 6),
(10, 'productosub1-2', 6);

***********************************************************
 */ 
/*
 * ================================================================================
 * RESULTADO
 * ===============================================================================
 *
 <ul>
   <li> Home
     <ul>
       <li>home1</li>
       <li>home2</li>
       <li>home3</li>
     </ul>
   </li>
   <li> Productos
     <ul>
       <li> productos1
         <ul>
           <li>productosub1-1</li>
           <li>productosub1-2</li>
         </ul>
       </li>
       <li>productos2</li>
       <li>productos3</li>
     </ul>
   </li>
 </ul>

*/
function con(){
    
$conexion mysql_connect"localhost" "root" "")or die ( mysql_error() );
    
mysql_select_db"pruebas" $conexion );
    return 
$conexion;
}
 
function 
menu$id_padre ){     
         
$menu '';
         
$sql "SELECT * FROM menu WHERE id_padre = $id_padre";     
         
$query mysql_query$sql,con() );  
         
$cant mysql_num_rows$query );          
         if( 
$cant ){ $menu .= '<ul>'; }            
         while( 
$resultado mysql_fetch_assoc$query ) ){              
            
$menu .=  '<li>' $resultado['menu_nombre'];
            
$menu .= menu$resultado['id'] ) . '</li>';              
         }         
         if( 
$cant ){ $menu .= '</ul>'; }       
         return 
$menu;
}
 
$menu menu();
echo 
$menu;
__________________
la la la
  #7 (permalink)  
Antiguo 03/10/2012, 16:04
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 4 meses
Puntos: 181
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Por fin tuve tiempo para probar tu aporte. Al ser tan parecido a mi idea no me costo mucho implementarlo y probarlo. Si hace 3 meses hubiera tenido este nivel de abstracción para la función recursiva otro gallo cantaria .

Para no ser menos aca coloco mi grano de arena en donde lo hago con mysqli orientado a objetos para los que se quieran actualizar y de paso lo coloco dentro de un div (por aquello de posteriormente manejar los estilos css). Igual aprovechando el esfuerzo se le puede colocar el id de la lista y por supuesto el enlace a donde se debe dirigir, ambos datos deberian estar dentro de la base de datos. Para no dañar tu idea original lo dejo comentado pero creo que se entiende claramente de que va la idea.

Código PHP:
require_once ("scripts/connect_to_mysqli.php");
function 
Menu ($id_padre=0,$mysqli){
     
$menu ''
     
$sql "SELECT * FROM menu WHERE id_padre = $id_padre"
     
$query $mysqli->query($sql);
     
$cant $query->num_rows;
     
//echo $cant;
     
if( $cant ){ $menu .= '<ul>'; } 
     while( 
$resultado $query->fetch_assoc()){
         
$menu .=  '<li>' $resultado['menu_nombre']; 
                 
$menu .= menu$resultado['id'] ,$mysqli) . '</li>';
     }
     if( 
$cant ){ $menu .= '</ul>'; }        
     return 
$menu
    }
$menudisplay menu(0,$mysqli); 
$menudisplay="<div id='menu'>$menudisplay</div>"
__________________
Blog de humor http://elcuasatar.net63.net/
  #8 (permalink)  
Antiguo 03/10/2012, 17:25
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Cita:
Iniciado por cuasatar Ver Mensaje
Por fin tuve tiempo para probar tu aporte. Al ser tan parecido a mi idea no me costo mucho implementarlo y probarlo. Si hace 3 meses hubiera tenido este nivel de abstracción para la función recursiva otro gallo cantaria .


Excelente!, bienvenido sean todos los aportes.
Gracias Amigo cuasatar
Saludos



.
__________________
la la la
  #9 (permalink)  
Antiguo 03/10/2012, 19:10
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Una posible mejora sería cargar todas las opciones en un array, esto permitiría:

1- Minimizar las consultas a la base de datos
2- Mostrar el menú cuantas veces sea necesario en la página
3- Mostrar sólo las opciones de un submenú

Ejemplo para armar el arreglo:
Código PHP:
Ver original
  1. // Cargamos opciones del menú
  2. function cargaMenu($mysqli) {
  3.     $menu = array('todos' => array());
  4.     // Falta una columna que permita seleccionar orden
  5.     // Ahora se muestran como fueron dados de alta
  6.     $sql = "SELECT * FROM menu";
  7.     $res = $mysqli->query($sql);
  8.     while($row = $res->fetch_assoc()) {
  9.         $id_padre = $row['id_padre'];
  10.         // Verificamos si existe el menú padre o lo creamos
  11.         (!isset($menu[$id_padre]) && $menu[$id_padre] = array());
  12.         // Agregamos ID del elemento actual al padre
  13.         $menu[$id_padre][] = $row['id'];
  14.         // Agregamos el elemento actual al arreglo 'todos'
  15.         $menu['todos'][$row['id']] = $row;
  16.     }
  17.     return $menu;
  18. }
  19.  
  20. // Mostramos menú
  21. function menu($id_padre, $menu) {
  22.     $html = "<ul>\n";
  23.     foreach($menu[$id_padre] as $id_menu) {
  24.          $html .= "<li><a href=\"pagina.php?opcion=$id_menu\">{$menu[$id_menu]['menu_nombre']}</a>";
  25.          // Este menú tiene hijos?
  26.          if(isset($menu[$id_menu])) {
  27.               $html .= menu($id_menu, $menu);
  28.          }
  29.          $html .= "</li>\n";
  30.     }
  31.     $html .= "</ul>\n";
  32. }
  33.  
  34. // Lo hacemos funcionar
  35. $mysqli = con();
  36. $menu = cargaMenu($mysqli);
  37.  
  38. // Mostramos menú, padre=0 para menú principal
  39. echo menu(0, $menu);
  40.  
  41. // Podemos repetirlo en el pie de página, sin otras consultas a BDD
  42. echo menu(0, $menu);
  43.  
  44. // O, si necesitamos sólo un submenú específico (productos)
  45. echo menu(5, $menu);
__________________
- León, Guanajuato
- GV-Foto

Última edición por Triby; 23/02/2013 a las 13:44 Razón: Yo edité?... en serio?.. je-je... bueno, faltaba un return!
  #10 (permalink)  
Antiguo 03/10/2012, 20:22
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Excelente, hay para todos los gustos
__________________
la la la
  #11 (permalink)  
Antiguo 02/01/2013, 15:33
 
Fecha de Ingreso: marzo-2010
Mensajes: 5
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Hola estaba intentando seguir el ejemplo pero algo no funciona y realmente no entiendo que puede ser, adapte los campos para que coincidan con mi BD, el error que muestra es "Fatal error: Function name must be a string in C:\xampp\htdocs\intranetphp\menu2.php on line 85".
Si me pueden ayudar se agradece de antemano.
Código PHP:
function con(){ 
    
$conexion mysql_connect("localhost","root","")or die ('Ha fallado la conexión: '.mysql_error()); 
    
//selección de la base de datos con la que vamos a trabajar 
    
mysql_select_db("bd_acgp"$conexion); 
    return 
$conexion
}   
function 
menu$id_padre ){      
         
$menu ''
         
$sql "SELECT * FROM menu WHERE IDPADRE = $IDPADRE";      
         
$query mysql_query($sql,$con());   
         
$cant mysql_num_rows($query);           
         if( 
$cant ){ $menu .= '<ul>'; }             
         while( 
$resultado mysql_fetch_assoc$query ) ){               
            
$menu .=  '<li>' $resultado['NOMBRE_MENU']; 
            
$menu .= menu$resultado['IDMENU'] ) . '</li>';               
         }          
         if( 
$cant ){ $menu .= '</ul>'; }        
         return 
$menu

  
$menu menu(); 
echo 
$menu
  #12 (permalink)  
Antiguo 02/01/2013, 19:22
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Deberías al menos indicar cuál es tu linea 85

Creo que es es $query = mysql_query($sql,$con());

donde $con(), imagino que debe ser con()
  #13 (permalink)  
Antiguo 03/01/2013, 07:54
 
Fecha de Ingreso: marzo-2010
Mensajes: 5
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Cita:
Iniciado por ocp001a Ver Mensaje
Deberías al menos indicar cuál es tu linea 85

Creo que es es $query = mysql_query($sql,$con());

donde $con(), imagino que debe ser con()
Era eso y otros detalles, al fin funcionó, Gracias por responder.
Saludos
  #14 (permalink)  
Antiguo 22/02/2013, 14:16
 
Fecha de Ingreso: diciembre-2003
Mensajes: 73
Antigüedad: 20 años, 11 meses
Puntos: 2
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Gracias truman_truman, muy útil tu código, sin embargo me planteo una cuestión al generar las url de los enlaces, ¿cómo podría crear los enlaces con este formato?

Código:
<a href="http://www.midominio.com/nombremenu/categoria/subcategoria">Subcategoria</a>
Ahora solo consigo crear el nombre de la url:
Código:
<a href="http://www.midominio.com/subcategoria">Subcategoria</a>
El problema viene cuando tengo subcategorias con el mismo nombre en diferentes categorías...

__________________
Tonos gratis
  #15 (permalink)  
Antiguo 22/02/2013, 16:59
 
Fecha de Ingreso: diciembre-2003
Mensajes: 73
Antigüedad: 20 años, 11 meses
Puntos: 2
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Bueno, he encontrado la solución, quizá no es la mejor, pero funciona:

Código:
//Código de truman_truman adaptado a mis necesidades:
function menu( $id_padre = 0 ){      
         $menu = ''; 
         $sql = "SELECT * FROM menu WHERE id_padre = $id_padre ORDER BY orden";      
         $query = mysql_query( $sql,con() );   
         $cant = mysql_num_rows( $query );           
         if( $cant > 0 ){ $menu .= '<ul>'; }             
         while( $row = mysql_fetch_assoc( $query ) ){
            $menu .=  '<li id="articulo-'.$row['id'].'"><a href="'.crear_url($row['id'], "menu").'">'.$row['menu_nombre'].'</a>'; 
            $menu .= menu( $row['id'] ) . '</li>';               
         }          
         if( $cant > 0 ){ $menu .= '</ul>'; }        
         return $menu; 
} 

//Código que he reutilizado que me generaba 'breadcrumbs', ahora lo uso para generar los links
function crear_url($id, $category_tbl) {

    $sql = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
	$query = mysql_query( $sql,con() );  
    $row = mysql_fetch_array($query);

    if($row['id_padre'] == 0) {
        return $row['seoname']."/";
    } else {
        return crear_url($row['id_padre'],$category_tbl).$row['seoname']."/";
    }
}

$menu = utf8_encode(menu());
echo '<div id="menu">'.$menu.'</div>';
Lo único que me preocupa es que se hacen demasiadas consultas a la base de datos, pero es la única solución que he encontrado.
__________________
Tonos gratis
  #16 (permalink)  
Antiguo 25/02/2013, 14:12
 
Fecha de Ingreso: marzo-2010
Mensajes: 5
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Hola estoy tratando de hacer funcionar el código compartido por Triby y no logro hacerlo funcionar, me da un problema con la funcion query().
Si alguien me puede ayudar se agradece de antemano.
Saludos
  #17 (permalink)  
Antiguo 25/02/2013, 14:36
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Dos cosas:
1- Cúal es el error?
2- Muéstranos como adaptaste el código para tratar de ayudarte.
__________________
- León, Guanajuato
- GV-Foto
  #18 (permalink)  
Antiguo 04/07/2013, 18:38
 
Fecha de Ingreso: agosto-2011
Mensajes: 5
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta Respuesta: [APORTE] Menu categorias y subcategorias y mas...

El menu funciona perfecto, pero como se le podria agregar css para un desplegable vertical? Desde ya muchas gracias
  #19 (permalink)  
Antiguo 05/07/2013, 00:14
 
Fecha de Ingreso: diciembre-2003
Mensajes: 73
Antigüedad: 20 años, 11 meses
Puntos: 2
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Cita:
Iniciado por konchikuzo Ver Mensaje
El menu funciona perfecto, pero como se le podria agregar css para un desplegable vertical? Desde ya muchas gracias
Mira este script:
http://users.tpg.com.au/j_birch/plugins/superfish/
__________________
Tonos gratis
  #20 (permalink)  
Antiguo 08/07/2013, 02:53
 
Fecha de Ingreso: agosto-2011
Mensajes: 5
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

El css lo tengo lo que me faltaría sería um evento onclick en los menu y submenu, que cuando uno esté abierto al hacer clic en otro el anterior ce cierre, pero no tengo idea, si alguien me puede ayudar agradecido, u orientarme, abajo esta el archivo css, desde ya muchas gracias

#cssmenu ul,
#cssmenu li,
#cssmenu span,
#cssmenu a {
margin: 0;
padding: 0;
position: relative;
width: auto;

}
#cssmenu {
height: 49px;
background-color: black;
color: white;
text-align: left;

display: block;
}
#cssmenu:after,
#cssmenu ul:after {
content: '';
display: block;
padding-left: 10px;
clear: both;
}
#cssmenu a {
background-color: #141414;
color: #ffffff;
display: block;
font-family: Helvetica, Arial, Verdana, sans-serif;
font-size: 12px;
line-height: 49px;
padding-left: 10px;
text-decoration: none;

}
#cssmenu ul {
list-style: none;

}

#cssmenu > ul > li {
border-bottom: 2px solid #ff8c00;

}


#cssmenu > ul > li:last-child > a {
background: #000 url(../imagenes/menu-arrow-open.png) right no-repeat;


}
#cssmenu > ul > li.active > a {
box-shadow: inset 0 0 3px #000000;
background-color: #070707;
color: white;
background: #000 url(../imagenes/menu-arrow-open.png) right no-repeat;
}
#cssmenu > ul > li:hover > a {
background-color: #070707
color: white;
background: #070707 url(../imagenes/menu-arrow.png)right no-repeat;
box-shadow: inset 0 0 3px #000000;
overflow: hidden;
}
#cssmenu .has-sub {

}
#cssmenu .has-sub:hover > ul {
display: block;

}
#cssmenu .has-sub ul {
display: none;
position: relative;
top: 100%;
left: 0;

}

#cssmenu .has-sub ul li a {
background-color: #e00f16;
border-bottom: 1px solid #ec6f73;
color: white;
font-size: 11px;
display: block;
line-height: 120%;
padding: 10px;
width: auto;


}
#cssmenu .has-sub ul li:hover a {
background-color: #b00c11;
color: white;
width: auto;

}
#cssmenu .has-sub .has-sub:hover > ul {
display: block;

}
#cssmenu .has-sub .has-sub ul {
display: none;
position: relative;
top: 0;
background: url(../imagenes/menu-arrow-open.png)right no-repeat;
}
#cssmenu .has-sub .has-sub ul li a {
background-color: #b00c11;
border-bottom: 1px dotted #d06d70;
color: white;
width: auto;
}
#cssmenu .has-sub .has-sub ul li a:hover {

color: white;
width: auto;
background: #80090d url(../imagenes/menu-arrow-open.png)right no-repeat;
text-align: left;
padding-left: 10px;
}
  #21 (permalink)  
Antiguo 08/09/2014, 20:22
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Hola a todos. Intento poner en funcionamiento la idea de Triby, pero a igual que vwolf, imprime un error.

Error:
Cita:
Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\mysqli1.php on line 14
Código completo:

Código PHP:
Ver original
  1. <?php
  2. function con(){
  3.     $conexion = mysql_connect( "localhost" , "root" , "")or die ( mysql_error() );
  4.     mysql_select_db( "menu" , $conexion );
  5.     return $conexion;
  6. }
  7.  
  8. // Cargamos opciones del menú
  9. function cargaMenu($mysqli) {
  10.     $menu = array('todos' => array());
  11.     // Falta una columna que permita seleccionar orden
  12.     // Ahora se muestran como fueron dados de alta
  13.     $sql = "SELECT * FROM menu";
  14.     $res = $mysqli->query($sql);
  15.     while($row = $res->fetch_assoc()) {
  16.         $id_padre = $row['id_padre'];
  17.         // Verificamos si existe el menú padre o lo creamos
  18.         (!isset($menu[$id_padre]) && $menu[$id_padre] = array());
  19.         // Agregamos ID del elemento actual al padre
  20.         $menu[$id_padre][] = $row['id'];
  21.         // Agregamos el elemento actual al arreglo 'todos'
  22.         $menu['todos'][$row['id']] = $row;
  23.     }
  24.     return $menu;
  25. }
  26.  
  27. // Mostramos menú
  28. function menu($id_padre, $menu) {
  29.     $html = "<ul>\n";
  30.     foreach($menu[$id_padre] as $id_menu) {
  31.          $html .= "<li><a href=\"pagina.php?opcion=$id_menu\">{$menu[$id_menu]['menu_nombre']}</a>";
  32.          // Este menú tiene hijos?
  33.          if(isset($menu[$id_menu])) {
  34.               $html .= menu($id_menu, $menu);
  35.          }
  36.          $html .= "</li>\n";
  37.     }
  38.     $html .= "</ul>\n";
  39. }
  40.  
  41. // Lo hacemos funcionar
  42. $mysqli = con();
  43. $menu = cargaMenu($mysqli);
  44.  
  45. // Mostramos menú, padre=0 para menú principal
  46. echo menu(0, $menu);
  47.  
  48. // Podemos repetirlo en el pie de página, sin otras consultas a BDD
  49. echo menu(0, $menu);
  50.  
  51. // O, si necesitamos sólo un submenú específico (productos)
  52. echo menu(5, $menu);?>
  #22 (permalink)  
Antiguo 09/09/2014, 15:06
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Si estás usando la librería mysql es normal que al intentar hacer consultas con mysqli obtengas ese error; no se trata de copiar y pegar, hay que analizar qué hace cada cosa antes de usarla y, en su caso, hacer las adaptaciones correspondientes.
__________________
- León, Guanajuato
- GV-Foto
  #23 (permalink)  
Antiguo 09/09/2014, 17:23
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Me confié que había configurado la conexión para myqli. Gracias Triby por la llamada de atención.

Aquí tengo la conexión perfecta:
Código PHP:
Ver original
  1. function crearConexion(){
  2.         //Datos para la conexión con el servidor
  3.         $servidor   = "localhost";
  4.         $nombreBD   = "mi_base_de_datos";
  5.         $usuario    = "root";
  6.         $contrasena = "";
  7.         //Creando la conexión, nuevo objeto mysqli
  8.         $conexion = new mysqli($servidor,$usuario,$contrasena,$nombreBD);
  9.         //Si sucede algún error la función muere e imprimir el error
  10.         if($conexion->connect_error){
  11.             die("Error en la conexion : ".$conexion->connect_errno.
  12.                                       "-".$conexion->connect_error);
  13.         }
  14.         //Si nada sucede retornamos la conexión
  15.         return $conexion;
  16.     }

¿Me puedes explicar por favor esta línea de tu código?:

Código PHP:
Ver original
  1. $html .= "<li><a href=\"pagina.php?opcion=$id_menu\">{$menu[$id_menu]['menu_nombre']}</a>";
¿A qué te refieres con opcion?

Última edición por mikehove; 09/09/2014 a las 17:49
  #24 (permalink)  
Antiguo 09/09/2014, 22:38
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Hago un pequeño aporte que quizas encuentren interesante.

El pequeño aporte que propongo, agrega la posibilidad de situar a cada elemento del menu en el orden que se quiera, pero lo mas interesante, es que sin hacer "nada raro" es la base de datos la que se encarga de hacer todo el trabajo.

La estructura de la tabla que usa, la encontre originalmente aca y plantea una forma de ver a un menu de arbol de una manera diferente, ya no interesa de quien es hijo cada elemento, lo que importa es a quienes tiene de hermanos inmediatos, es decir, el nodo que tiene a su izquierda y el que tiene a su derecha.

Esta imagen extraida de la web antes mencionada, ilustra justamente eso:


La base de datos, tendria esta forma:

Código MySQL:
Ver original
  1. --
  2. -- Base de datos: `test`
  3. --
  4.  
  5. -- --------------------------------------------------------
  6.  
  7. --
  8. -- Estructura de tabla para la tabla `nested_category`
  9. --
  10.  
  11. CREATE TABLE IF NOT EXISTS `nested_category` (
  12.   `category_id` int(11) NOT NULL AUTO_INCREMENT,
  13.   `name` varchar(20) NOT NULL,
  14.   `lft` int(11) NOT NULL,
  15.   `rgt` int(11) NOT NULL,
  16.   PRIMARY KEY (`category_id`)
  17.  
  18. --
  19. -- Volcado de datos para la tabla `nested_category`
  20. --
  21.  
  22. INSERT INTO `nested_category` (`category_id`, `name`, `lft`, `rgt`) VALUES
  23. (1, 'ELECTRONICS', 1, 20),
  24. (2, 'TELEVISIONS', 2, 9),
  25. (3, 'TUBE', 3, 4),
  26. (4, 'LCD', 5, 6),
  27. (5, 'PLASMA', 7, 8),
  28. (6, 'PORTABLE ELECTRONICS', 10, 19),
  29. (7, 'MP3 PLAYERS', 11, 14),
  30. (8, 'FLASH', 12, 13),
  31. (9, 'CD PLAYERS', 15, 16),
  32. (10, '2 WAY RADIOS', 17, 18);

Y el simple script php que arma el menu seria este:
Código PHP:
Ver original
  1. <?php
  2.     $mysqli = new mysqli("localhost", "root", "", "test");
  3.     $query = $mysqli->query("SELECT (COUNT(parent.name) - 1) level, node.name AS name
  4.                        FROM nested_category AS node,
  5.                                nested_category AS parent
  6.                        WHERE node.lft BETWEEN parent.lft AND parent.rgt
  7.                        GROUP BY node.name
  8.                        ORDER BY node.lft;");
  9.  
  10.     $level = 0;
  11.     echo("<ul>");
  12.     while($option = $query->fetch_assoc())
  13.     {
  14.         echo("<li>$option[name]");
  15.         if($option["level"] != $level)
  16.         {
  17.             echo($option["level"] > $level ? "<ul>" : "</ul></li>");
  18.             $level = $option["level"];
  19.         }
  20.         else
  21.             echo("</li>");
  22.     }
  23.     echo("</ul>");

Lo interesante en este caso, es como mirando las cosas desde otro punto de vista se puede simplificar mucho las cosas, ¡¡incluso se puede crear un menu de ilimitados subniveles sin usar recursividad!! ¡¡y se pueden mostrar los elementos del menu directamente el buffer de salida apenas vuelven de la base de datos!! Eso significa que aunque nuestro menu tenga "infinitos" elementos, solo necesitamos memoria para almacenar uno de ellos, con lo cual se vuelve super liviano.

Por supuesto esto puede meterse dentro de una funcion sin problemas, es solo una idea de otra forma de implementarlo.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 09/09/2014 a las 22:44
  #25 (permalink)  
Antiguo 10/09/2014, 07:47
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años, 6 meses
Puntos: 2
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Hola NSD. Hace un tiempo investigué un poco sobre el Modelo de Conjunto Anidado, el que presentas, interesante... Solo que si se le quiere agregar o quitar un nuevo elemento hay que actualizar todos los nodos de toda la tabla, me parece algo lioso.
Hay otro modelo, que dicen que es más fácil que el se propone al principio del post, o sea más sencillo que el Modelo de Adyacencia, se llama Tabla Closure, pero hay poca información sobre este y está en inglés.

Info: http://technobytz.com/closure_table_store_hierarchical_data.html
  #26 (permalink)  
Antiguo 10/09/2014, 11:34
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Cita:
Solo que si se le quiere agregar o quitar un nuevo elemento hay que actualizar todos los nodos de toda la tabla, me parece algo lioso.
En efecto, las operaciones de ABM son muy costosas, depende el caso, pero por lo general la cantidad de veces que un menu es modificado es insignificante en relacion a la cantidad de veces que se muestra.

Depende del contexto, pero personalmente prefiero esperar unos segundos una unica vez cuando modifico a tener que esperarlos cada vez que quiero ver el menu.

El modelo que menciones esta bueno como alternativa pero es mas complejo, tiene la complejidad del modelo de adyacencia + la complejidad del modelo de conjunto anidado + un extra propio. Las operaciones basicas indispensables se vuelven mas tediosas pero las complejas mas simples. Depende el contexto puede ser util.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #27 (permalink)  
Antiguo 20/10/2014, 13:26
 
Fecha de Ingreso: octubre-2014
Mensajes: 2
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: [APORTE] Menu categorias y subcategorias y mas...

Muy buenas tardes amigos !!! solo una duda, utilizando este menu en mysql , como puedo cargar el contenido de cada menu en un div ? por ejemplo : <div id=" content"> </div> llevo tiempo buscando esa respuesta : saludos :)

Etiquetas: categorias, mysql, sql, subcategorias, 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

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 15:16.