Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: DeXon18 en 18 Mayo 2011, 12:25 pm



Título: Crear menu con Categorias y SubCategorias usando MySQL y PHP
Publicado por: DeXon18 en 18 Mayo 2011, 12:25 pm
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
  1. CREATE TABLE `categorias` (
  2. `categoria_id` INT(10) NOT NULL AUTO_INCREMENT,
  3. `categoria_nombre` VARCHAR(150) NOT NULL,
  4. PRIMARY KEY (`categoria_id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

Estructura de tabla para la tabla `subcategorias`

Código
  1. CREATE TABLE `subcategorias` (
  2. `subcategoria_id` INT(10) NOT NULL AUTO_INCREMENT,
  3. `categoria_id` INT(10) NOT NULL,
  4. `subcategoria_nombre` VARCHAR(150) NOT NULL,
  5. PRIMARY KEY (`subcategoria_id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
  7.  

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
  1. <?php
  2. // Ejemplo de Conexion a base de datos
  3. $servidor ='localhost';
  4. $basedatos ='tutorial';
  5. $usuario_basedatos ='tutorial';
  6. $clave_basedatos ='XXXX';
  7.  
  8.  
  9. //Conectamos con el servidor
  10. $db=@mysql_connect($servidor,$usuario_basedatos,$clave_basedatos);
  11.  
  12. mysql_select_db($basedatos);
  13.  
  14.  
  15. $sqlQuery = mysql_query("SELECT categorias.*, subcategorias.* FROM categorias, subcategorias
  16.                         WHERE categorias.categoria_id = subcategorias.categoria_id
  17.                         ORDER BY subcategorias.subcategoria_id ASC", $db) or die(mysql_error());
  18.  
  19. $categoria = "";
  20. $categorias = array();
  21. $pos = 0;
  22.  
  23. while ($row = mysql_fetch_object($sqlQuery)){
  24.    if($categoria != $row -> categoria_id){
  25.        echo "<h3>".$row -> categoria_nombre."...</h3>";
  26.        $categoria = $row -> categoria_id;
  27.        $pos = array_push( $categorias,  array( $categoria, array() ) );
  28.    }    
  29.    $categorias[$pos][1][] = array($row->subcategoria_id, $row -> subcategoria_nombre);
  30.  
  31. }
  32.  
  33. foreach ($categorias as $categoria)
  34. {
  35.    if( !empty( $categoria[0] ) ) {
  36.           echo "<h1>" . $categoria[0] . "</h1>";
  37.    }
  38.    if (count($categoria[1]) > 0)
  39.    {
  40.        echo "<ul>";
  41.        foreach ($categoria[1] as $subCat)
  42.        {
  43.            echo "<li><a href='index.php?mod=categorias&amp;categoria_id=" . $subCat[0] . "'>" .
  44.                $subCat[1] . "</a></li>";
  45.        }
  46.        echo "</ul>";
  47.    }
  48. }  
  49. ?>


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

Un saludo y gracias de nuevo


Título: Re: Crear menu con Categorias y SubCategorias usando MySQL y PHP
Publicado por: Diabliyo en 18 Mayo 2011, 14:52 pm
Yo utilizaria una sola tabla:

Código:
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
Código:
ID = abcde123
NOMBRE = Inicio
TIPO = post|hoja|script|galeria
MENU = 0

# esto es un sub-menu de un menu principal
Código:
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 !


Título: Re: Crear menu con Categorias y SubCategorias usando MySQL y PHP
Publicado por: DeXon18 en 18 Mayo 2011, 15:26 pm
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 ;)


Título: Re: Crear menu con Categorias y SubCategorias usando MySQL y PHP
Publicado por: merolhack en 18 Mayo 2011, 18:32 pm
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:

Código:
<?php
$items_1_nivel = array(
0 => array(
'id' => 1,
'name' => 'Item1'
),
1 => array(
'id' => 2,
'name' => 'Item2'
)
);
$items_2_nivel = array(
0 => array(
'id' => 1,
'name' => 'SubItem1',
'parent' => '1'
),
1 => array(
'id' => 2,
'name' => 'SubItem2',
'parent' => '1'
),
2 => array(
'id' => 3,
'name' => 'SubItem3',
'parent' => '2'
),
3 => 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>";
?>


Título: Re: Crear menu con Categorias y SubCategorias usando MySQL y PHP
Publicado por: Kasi en 21 Mayo 2011, 15:13 pm
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.

Código:
ID = Nivel_1
NOMBRE = Inicio
TIPO = post|hoja|script|galeria
MENU = 0
Código:
ID = Nivel_2
NOMBRE = Otro nombre
TIPO = post|hoja|script|galeria
MENU = Nivel_1
Código:
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