Question

Le menu final ressemblera à ceci:

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

Basé sur les enregistrements de base de données suivants:

id        menu_title          parent_menu_id    menu_level    weight
1         Item A                0                           1                     1
2         Item B                0                           1                     0
3         Item C                0                           1                     2
4         SubItem A-2       1                           2                     1
5         Item B-1             2                           2                     0
6         Item B-1-1          5                           3                     1
7         SubItem A-1       1                           2                     0
8         Item B-1-2          5                           3                     0

Comment puis-je afficher ces éléments? Je suppose que cela implique de stocker tous les éléments dans un tableau multidimensionnel, puis de le parcourir d'une manière ou d'une autre ...

Était-ce utile?

La solution

Traiter la structure de données telle que vous la utiliserez impliquera souvent une récursion ou plusieurs requêtes pour construire l’arborescence.

Avez-vous envisagé d'autres moyens de stocker une hiérarchie? Découvrez la traversée de pré-commande modifiée - voici un bel article PHP sur ce sujet . .

Autres conseils

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

Vous avez choisi des ensembles de contiguïté, ce que je fais généralement aussi. Il est beaucoup plus facile de changer que le modèle de jeu imbriqué, bien que le modèle de jeu imbriqué puisse être extrait dans le bon ordre dans une seule requête. Les listes de proximité ne peuvent pas être. Vous devrez créer une structure de données intermédiaire (arbre), puis la convertir en liste.

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

  • sélectionnez l'intégralité du contenu du menu dans une requête classée par ID parent;
  • Construisez une arborescence de la structure de menus à l'aide de tableaux associatifs ou de classes / objets;
  • Parcourez cet arbre pour créer des listes non ordonnées imbriquées; et
  • Utilisez un plug-in jQuery tel que Superfish pour transformer cette liste en un 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 code PHP utilisé pour générer le tableau de menus est relativement simple mais un peu complexe à résoudre. Vous utilisez une fonction d'arborescence récursive qui construit le balisage de la liste imbriquée HTML, mais conserve son implémentation comme exercice pour le lecteur. :)

La manière dont vous stockez les données hiérarchiques n’est pas aussi efficace que vous le souhaiteriez. J'ai lu l'article Gestion des données hiérarchiques dans MySQL il y a quelques années. et l’ont depuis trouvé comme la la meilleure solution pour gérer des données SQL basées sur une hiérarchie. Le meilleur avantage suivant est que je pense que vous pouvez saisir l’arbre entier en une seule requête.

Je viens de publier dans une question similaire ma propre approche pour transformer les données hiérarchiques MySQL (liste de contiguïté) en un menu (HTML)

Elle n'utilise pas la récursivité. Et cela nécessite une requête unique dans la base de données.

En savoir plus sur

https://stackoverflow.com/questions/2871861#3368622

Merci.

Une autre façon simple de générer une hiérarchie si vous ne souhaitez pas utiliser d'ensembles imbriqués consiste à utiliser une chaîne de texte simple devant.

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

Deviendrait

1 Item B
  1.1 Item B1
    1.1.1 Item B11
    1.1.2 Item B12
2 Item A
  2.1 Item A1
  2.2 Item B2
3 Item C

Le chiffre devant chaque élément peut être stocké dans un champ et analysé en fonction de sa longueur (représentant la profondeur de l'endroit où il se trouve) pour vous indiquer tout ce que vous devez savoir sur l'endroit où il se trouve.

J'utilise des hiérarchies d'ensembles imbriqués pour des tâches plus complexes qui nécessitent des calculs, etc., mais je trouve que cette approche a bien servi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top