Ver Mensaje Individual
  #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, 7 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