sql >> Base de Datos >  >> RDS >> Mysql

PHP/MySQL:construyendo una jerarquía de menú de navegación

Los datos jerárquicos son algo molestos en una base de datos relacional (excepto Oracle, que tiene operadores en START WITH/CONNECT BY para hacer frente a esto). Básicamente hay dos modelos :lista de adyacencia y conjuntos anidados.

Ha elegido conjuntos de adyacencia, que es lo que suelo hacer también. Es mucho más fácil de cambiar que el modelo de conjunto anidado, aunque el modelo de conjunto anidado se puede recuperar en el orden correcto en una sola consulta. Las listas de adyacencia no pueden ser. Deberá crear una estructura de datos intermedia (árbol) y luego convertirla en una lista.

Lo que haría (y de hecho lo he hecho recientemente) es:

  • seleccionar todo el contenido del menú en una consulta ordenada por ID principal;
  • Construya un árbol de la estructura del menú usando arreglos asociativos o clases/objetos;
  • Recorra ese árbol para crear listas desordenadas anidadas; y
  • Use un complemento jQuery como Superfish para convertir esa lista en un menú.

Construyes algo como esto:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

y convertirlo en esto:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...

El PHP para generar la matriz de menús es razonablemente sencillo pero un poco complicado de resolver. Utiliza una función recursiva de recorrido de árboles que crea el marcado de lista anidada HTML, pero dejará su implementación como un ejercicio para el lector. :)