Jump to content

Menu configurable PHP con B.D.


Recommended Posts

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

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 by eterno_inocente
Link to comment
Share on other sites

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...