romaditro Posted March 16, 2009 Report Share Posted March 16, 2009 Hola alguien sabe como hacer un menu que se pueda configurar y almacenar en una base de datos y despues se despliege en pantalla. La estuctura de la tabla de la base de datos ya se como hacerla el problema es como saco los datos de la BD y los despliego en pantalla La tabla seria algo asi: TABLA MENU | id_menu | padre | texto | url | donde : id_menu: seria el identificador unico para cada item del menu padre : para el item principal de cada menu seria un valor -1 (po ejemplo) y para los hijos seria el id al item al cual pertenece texo : es el nombre del item url : bueno obvio. Lo que estoy tratando de hacer es un menu multiniveles y hacerlo una sola vez y que me sirva para siempre y no estar cambiando cada vez que le quito o agrego un nivel. La idea es que quede algo pareido a esto: MENU PRINCIPAL *ITEM 1 +item 1.1 +item 1.2 *ITEM 2 +item 2.1 +item 2.2 -item 2.2.1 -item 2.2.2. ...etc gracias :rolleyes: Link to comment Share on other sites More sharing options...
eterno_inocente Posted March 17, 2009 Report Share Posted March 17, 2009 (edited) yo hice uno con este codigo....solo acepta un hijo...pero si le pegas una modificada con algun tipo de funcion recursiva..te puede aceptar nietos (hijos de hijos).... $sql="SELECT * FROM menu"; $consulta=mysql_query($sql,$link); while($datos=mysql_fetch_array($consulta)) { $menu[$datos['id_padre']][$datos['id']]=$datos['nombre']; } foreach ($menu[0] as $key => $value) { echo "<br>".$value."<br>"; foreach ($menu[$key] as $value) echo " ".$value."<br>"; } Edited March 17, 2009 by eterno_inocente Link to comment Share on other sites More sharing options...
romaditro Posted March 18, 2009 Author Report Share Posted March 18, 2009 Hola viejo gracias por la repuesta, mira justo hice algo como tu decis llamando a una funcion recursiva y me funciono puedo nrecorrer el menu completo y en orden, el problema es que a medida que lo recorro lo voy concatenando con las etiquetas <lu> y <li> correspondientemente para crear una lista y despues le pego el CSS y creo mi menu. El problem que tengo que hasta el segundo nivel me funciona...pero cuando llego al ultimo hijo del tercer nivel (que a la vez es el ultimo nieto) hay que cerrar con dos <ul><ul> y hay es donde se me cae. Si alguien me pued dar una mano seria de gran ayuda. Aqui va el codigo: $menu = "<ul id=\"menu_horizontal\">"; function getHijos($id){ //me indica la cantidad de hijos que tiene un ITEM $sql = "SELECT * FROM menu WHERE padre = $id ORDER BY orden ASC"; $res = mysql_query($sql); $hijos = mysql_affected_rows(); return($hijos); } function menu($id, &$m, $profundidad = 0) { $sql = "SELECT * FROM menu WHERE padre = $id ORDER BY orden ASC"; $res = mysql_query($sql); $j = 1; while ($row = mysql_fetch_array($res)){ //pregunto la cantidad de hijos que tiene el item que entra al primero le agrego <ul> y al ultimo hijo le agrego </ul> $hijos = getHijos($row['id']); echo "<a href=\"{$row['url']}\">{$row['texto']}</a>";echo "$profundidad, $j"; $m .= "<li><a href=\"{$row['url']}\">".$row['texto']."</a></li>"; if($hijos > 0){//si tiene hijos le agrego el <ul> $m .= "<ul>"; } if( ($row['padre'] != 0) && (getHijos($row['padre']) == $j) && (getHijos($row['id']) == 0)){ //si es el ultimo hijo cierro $m .= "</ul>"; } $j++; menu($row['id'], $m, $profundidad + 1); } } menu(-1, $menu); echo"<br><br>"; $menu .= "</ul>"; print_r($menu); En resumen , ahora mi problema es como cresta le voy pegando las etiquetas <ul> y <li>, mi problema puntual es al terminar los "nietos". :angry: <_< Link to comment Share on other sites More sharing options...
eterno_inocente Posted March 19, 2009 Report Share Posted March 19, 2009 aer...dame el sql de la tabla (con algunos valores) pa ver en que mas te pueo ayudar Link to comment Share on other sites More sharing options...
romaditro Posted March 20, 2009 Author Report Share Posted March 20, 2009 Aqui van los distintos codigos: TABLA MENU -- phpMyAdmin SQL Dump -- version 2.10.1 -- http://www.phpmyadmin.net -- -- Servidor: localhost -- Tiempo de generación: 20-03-2009 a las 20:28:44 -- Versión del servidor: 5.0.45 -- Versión de PHP: 5.2.5 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de datos: `menu` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `menu` -- CREATE TABLE `menu` ( `id` int(11) NOT NULL auto_increment, `padre` int(11) NOT NULL, `texto` varchar(30) NOT NULL, `url` varchar(200) default NULL, `orden` int(11) NOT NULL, `estado_menu` varchar(20) NOT NULL default 'ACTIVO', PRIMARY KEY (`id`), UNIQUE KEY `texto` (`texto`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21; -- -- Volcar la base de datos para la tabla `menu` -- INSERT INTO `menu` (`id`, `padre`, `texto`, `url`, `orden`, `estado_menu`) VALUES (1, -1, 'INICIO', '#', 1, 'ACTIVO'), (2, -1, 'OT', '#', 2, 'ACTIVO'), (3, -1, 'MANTENEDOR', '#', 3, 'ACTIVO'), (4, -1, 'SALIR', '#', 5, 'ACTIVO'), (5, 2, 'INGRESAR OT', '#', 2, 'ACTIVO'), (6, 2, 'ACTUALIZAR OT', '#', 3, 'ACTIVO'), (7, 2, 'VER OT', '#', 4, 'ACTIVO'), (8, -1, 'OC', '#', 4, 'ACTIVO'), (9, 8, 'INGRESAR OC', '#', 1, 'ACTIVO'), (10, 8, 'ACTUALIZAR OC', '#', 2, 'ACTIVO'), (11, 3, 'PERSONAL', '#', 1, 'ACTIVO'), (12, 3, 'MAQUINAS', '#', 2, 'ACTIVO'), (13, 11, 'INGRESAR PERSONAL', '#', 1, 'ACTIVO'), (14, 11, 'ACTUALIZAR PERSONAL', '#', 2, 'ACTIVO'), (15, 12, 'INGRESAR MAQUINAS', '#', 1, 'ACTIVO'), (18, 3, 'BODEGA', '#', 3, 'ACTIVO'), (19, 18, 'INGRESAR BODEGA', '#', 1, 'ACTIVO'), (20, 18, 'ACTUALIZAR BODEGA', '#', 2, 'ACTIVO'); CONFIGURACION.php <?php session_start(); $host = "localhost"; $usuario = "root"; $password = ""; $bd = "menu"; ?> FUNCIONES.php function conectarse($host, $usuario, $password, $bd){ //conectarse a la BD con MySQL if (!($link = mysql_connect($host, $usuario, $password, $bd))){ echo "Error conectando a la base de datos."; exit(); } if (!mysql_select_db($bd,$link)){ echo "Error seleccionando la base de datos."; exit(); } return $link; } index.php <?php /** /*Despliega la vitrina con todos los proyectos. /*@author: Rodrigo Marcelo Díaz Troncoso <[email protected]> /*@version: 1.0 /*@copyright Digtrain */ header('content-type: text/html; charset=utf-8'); session_start(); require_once("configuracion.php"); require_once("funcionesPHP.php"); $link = conectarse($host, $usuario, $password, $bd); $menu = "<ul id=\"menu_horizontal\">"; function getHijos($id){ $sql = "SELECT * FROM menu WHERE padre = $id ORDER BY orden ASC"; $res = mysql_query($sql); $hijos = mysql_affected_rows(); return($hijos); } function menu($id, &$m, $profundidad = 0) { //echo "[ $id, $profundidad ]"; $sql = "SELECT * FROM menu WHERE padre = $id ORDER BY orden ASC"; $res = mysql_query($sql); $j = 1; while ($row = mysql_fetch_array($res)){ //pregunto la cantidad de hijos que tiene el item que entra al primero le agrego <ul> y al ultimo hijo le agrego </ul> $hijos = getHijos($row['id']); echo "<br>HIJOS: $hijos - ";echo $row['texto']." -- "; echo "<a href=\"{$row['url']}\">{$row['texto']}</a>";echo "$profundidad, $j"; $m .= "<li><a href=\"{$row['url']}\">".$row['texto']."</a></li>"; if($hijos > 0){ $m .= "<ul>"; } if( ($row['padre'] != 0) && (getHijos($row['padre']) == $j) && (getHijos($row['id']) == 0)){ $m .= "</ul>"; } //caso especial /*if( ($row['padre'] != 0) && (getHijos($row['padre']) == $j) && (getHijos($row['id']) == 0)){ $m .= "<-/ul><-/ul>"; }*/ $j++; menu($row['id'], $m, $profundidad + 1); } } menu(-1, $menu); echo"<br><br>"; $menu .= "</ul>"; print_r($menu); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Tipos de menu</title> <link rel="stylesheet" type="text/css" href="menu.css" </head> <body> <br/><br/><br/> <!-- MENU VERTICAL --> <ul id="menu_horizontal"> <li> INICIO </li> <li> OT </li> <ul> <li><a href="#"> INGRESAR OT</a></li> <li><a href="#"> ACTUALIZAR OT</a></li> <li><a href="#"> VER OT</a></li> </ul> <li> MANTENEDORES </li> <ul> <li><a href="#"> PERSONAL</a></li> <ul> <li><a href="#"> INGRESAR PERSONAL</a></li> <li><a href="#"> ACTUALIZAR PERSONAL</a></li> </ul> <li><a href="#"> MAQUINAS</a></li> <ul> <li><a href="#"> INGRESAR MAQUINAS</a></li> <li><a href="#"> ACTUALIZAR MAQUINAS</a></li> </ul> <li><a href="#"> BODEGA</a></li> <ul> <li><a href="#"> INGRESAR BODEGA</a></li> <li><a href="#"> ACTUALIZAR BODEGA</a></li> </ul> </ul> <li> OC </li> <ul> <li><a href="#"> INGRESAR OC</a></li> <li><a href="#"> ACTUALIZAR OC</a></li> </ul> <li> SALIR </li> </ul> </body> </html> CSS /* MENU HORIZONTAL */ #menu_horizontal{ list-style:none;/*le sacamos los circulos*/ margin: 0; padding: 0; } #menu_horizontal li{ margin: 2px; padding: 2px; border: 1px solid #CCCCCC; list-style:none; /*float:left;*/ /*para eliminar el comportamiento de elemento de bloque(salto de linea), y quede como menu horizontal */ } Al final del index. esta el menu a "fierro" de como deberia quedar arriba muestra como me queda a mi :(... hay me avisas si te funka. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now