Crear menu con Categorias y SubCategorias usando MySQL y PHP

Iniciado por DeXon18, 18 Mayo 2011, 12:25 PM

0 Miembros y 1 Visitante están viendo este tema.

DeXon18

Hola a todos, esta es la primera vez que posteo, les cuento que soy nuevo en php y mysql y me encuentro muy entretenido aprendiendo todos los dias algo nuevo, pero el tema en cuestion es que tengo un problema que no me ha dejado avanzar.

He tratado de desarrollar un sistema de categorias y subcategorias usando tablas relacionadas pero no lo he logrado, mi idea por el momento es generar un menu como este:

Categoria 1

    SubCategoria1

    SubCategoria2

    SubCategoria3

Categoria 2

    SubCategoria1

    SubCategoria2

    SubCategoria3

Categoria 3

    SubCategoria1

    SubCategoria2

    SubCategoria3


La estructura de las tablas que estoy usando es la siguiente:


Estructura de tabla para la tabla `categorias`

Código (sql) [Seleccionar]
CREATE TABLE `categorias` (
`categoria_id` int(10) NOT NULL auto_increment,
`categoria_nombre` varchar(150) NOT NULL,
PRIMARY KEY (`categoria_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;


Estructura de tabla para la tabla `subcategorias`

Código (sql) [Seleccionar]
CREATE TABLE `subcategorias` (
`subcategoria_id` int(10) NOT NULL auto_increment,
`categoria_id` int(10) NOT NULL,
`subcategoria_nombre` varchar(150) NOT NULL,
PRIMARY KEY (`subcategoria_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;


Hasta el momento lo mejor que he logrado es generando la consulta de este modo, pero el resultado que me muestra no es el que yo quiero.

Categoria 1
Categoria 2
Categoria 5
Categoria 4

1
    SubCategoria1

    SubCategoria2

    SubCategoria3

2
    SubCategoria1

    SubCategoria2

    SubCategoria3

3
    SubCategoria1

    SubCategoria2

    SubCategoria3



Código (php) [Seleccionar]
<?php
// Ejemplo de Conexion a base de datos
$servidor ='localhost'
$basedatos ='tutorial'
$usuario_basedatos ='tutorial';
$clave_basedatos ='XXXX';

 
//Conectamos con el servidor
$db=@mysql_connect($servidor,$usuario_basedatos,$clave_basedatos);
 
mysql_select_db($basedatos);


$sqlQuery mysql_query("SELECT categorias.*, subcategorias.* FROM categorias, subcategorias
                         WHERE categorias.categoria_id = subcategorias.categoria_id
                         ORDER BY subcategorias.subcategoria_id ASC"
$db) or die(mysql_error());

$categoria "";
$categorias = array();
$pos 0;

while (
$row mysql_fetch_object($sqlQuery)){
    if(
$categoria != $row -> categoria_id){
        echo 
"<h3>".$row -> categoria_nombre."...</h3>";
        
$categoria $row -> categoria_id;
        
$pos array_push$categorias,  array( $categoria, array() ) );
    }    
    
$categorias[$pos][1][] = array($row->subcategoria_id$row -> subcategoria_nombre);
    
}

foreach (
$categorias as $categoria)
{
    if( !empty( 
$categoria[0] ) ) {
           echo 
"<h1>" $categoria[0] . "</h1>";
    }
    if (
count($categoria[1]) > 0)
    {
        echo 
"<ul>";
        foreach (
$categoria[1] as $subCat)
        {
            echo 
"<li><a href='index.php?mod=categorias&amp;categoria_id=" $subCat[0] . "'>" .
                
$subCat[1] . "</a></li>";
        }
        echo 
"</ul>";
    }
}  
?>



Pero no logro sacar como lo quiero, espero que me podáis ayudar.

Un saludo y gracias de nuevo

Diabliyo

Yo utilizaria una sola tabla:

create table MENUS(
ID VARCHAR(10) UNIQUE not NULL PRIMARY KEY,
NOMBRE VARCHAR(50) not NULL,
TIPO VARCHAR(1) not NULL,
MENU VARCHAR(10) not NULL );


La cosa es muy simple.... Cuando creas un menu, los datos se insertan asi:

# esto es un menu
ID = abcde123
NOMBRE = Inicio
TIPO = post|hoja|script|galeria
MENU = 0


# esto es un sub-menu de un menu principal
ID= otrocodigo
NOMBRE = Blog
TIPO = post|hoja|script|galeria
MENU = abcde123


Cuando existe un valor en la entrada MENU, quiere decir que es una sub-categoria o sub-menu, de lo contrario es solo un menu principal.

Saludos !

DeXon18

Interesante no lo había visto de esa forma, la cosa es que si quisiera hacerlo con un 3º nivel?

como seria? (inicialmente era de 3 niveles pero me resultaba y lo deje en 2

Un saludo y gracias ;)

merolhack

Pues lo ideal es que hagas 2 querys, uno para obtener todos los items de menú de primer nivel y otro query para obtener los de segundo nivel. Los resultados los almacenas en 1 array y recorres todo con un for tipo:

<?php
$items_1_nivel 
= array(
=> array( 
'id' => 1,
'name' => 'Item1'
),
=> array( 
'id' => 2,
'name' => 'Item2'
)
);
$items_2_nivel = array(
=> array( 
'id' => 1,
'name' => 'SubItem1',
'parent' => '1'
),
=> array( 
'id' => 2,
'name' => 'SubItem2',
'parent' => '1'
),
=> array( 
'id' => 3,
'name' => 'SubItem3',
'parent' => '2'
),
=> array( 
'id' => 4,
'name' => 'SubItem4',
'parent' => '2'
)
);
foreach( 
$items_1_nivel as $item1 ) {
$hijos NULL;
$list .= "<li>" $item1['name'];
foreach( $items_2_nivel as $item2 ) {
if ( $item2['parent'] == $item1['id'] ) {
$hijos .= "<li>".$item2['name']."</li>";
}
}
if ( isset( $hijos ) && $hijos != NULL ) {
$list .= "<ul>".$hijos."</ul>";
}
$list .= "</li>";
}
echo 
"<ul>".$list."</ul>";
?>
PHP Web Developer
Joomla, jQuery, MySQL, CSS, etc...

Android APP Developer http://android-dev.tumblr.com/

Kasi

Para hacerlo con 3 niveles o los niveles que te hagan falta es igual que para hacerlo con 2 en el ejemplo que te puso Diabliyo.


ID = Nivel_1
NOMBRE = Inicio
TIPO = post|hoja|script|galeria
MENU = 0


ID = Nivel_2
NOMBRE = Otro nombre
TIPO = post|hoja|script|galeria
MENU = Nivel_1


ID = Nivel_3
NOMBRE = Otro nombre mas
TIPO = post|hoja|script|galeria
MENU = Nivel_2

Y asi sucesivamente, solo tienes que referenciar de que menú cuelga el siguiente elemento y ya está.

Un saludo