Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP/MySQL - construction d'une hiérarchie de menus de navigation

Les données hiérarchiques sont quelque peu gênantes dans une base de données relationnelle (à l'exception d'Oracle, qui a des opérateurs dans START WITH/CONNECT BY pour faire face à cela). Il existe essentiellement deux modèles :liste de contiguïté et ensembles imbriqués.

Vous avez choisi des ensembles de contiguïté, ce que je fais aussi habituellement. Il est beaucoup plus facile à modifier que le modèle d'ensemble imbriqué, bien que le modèle d'ensemble imbriqué puisse être récupéré dans le bon ordre en une seule requête. Les listes de contiguïté ne peuvent pas l'être. Vous devrez créer une structure de données intermédiaire (arborescence) puis la convertir en liste.

Ce que je ferais (et ai fait récemment en fait) est :

  • sélectionner l'intégralité du contenu du menu dans une requête triée par ID parent ;
  • Construire une arborescence de la structure du menu à l'aide de tableaux associatifs ou de classes/objets ;
  • Parcourez cet arbre pour créer des listes imbriquées non ordonnées ; et
  • Utilisez un plug-in jQuery comme Superfish pour transformer cette liste en menu.

Vous construisez quelque chose comme ceci :

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

et convertissez-le en ceci :

<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>
...

Le PHP pour générer le tableau de menu à partir de est raisonnablement simple mais un peu délicat à résoudre. Vous utilisez une fonction arborescente récursive qui construit le balisage de la liste imbriquée HTML mais laissera son implémentation comme un exercice pour le lecteur. :)