menu à hiérarchie illimitée

Mammouth du PHP | 514 Messages

27 avr. 2007, 10:13

Bonjour,

J'ai besoin de créer un menu dynamique, sans limite de hiérarchie.

Dans ma base de données, il est représenté à peu près ainsi :

menus (ID, libelle, parentId)

ou parentId fait référence à l'Id de la même table.

Mon problème, c'est de traiter tout ça en php, et pouvoir le représenter graphiquement ...

Je sèche un peu sur la manière de m'y prendre, en fait.

Vous auriez quelques pistes pour moi ?.

Merci de votre aide.

Mammouth du PHP | 514 Messages

27 avr. 2007, 11:33

Je suis passé sur cet article :

http://sqlpro.developpez.com/cours/arborescence/

Je n'ai absolument rien compris.

A priori, ça résoudrait mon problème, mais j'ai envie de dire que franchement, c'est incompréhensible ...

quelqu'un pourrait m'expliquer ça ?

Mammouth du PHP | 1885 Messages

27 avr. 2007, 23:24

Le but est de classer tous tes items de 1 à n
Ensuite, la requête crée les "ranges", c'est à dire à partir de quand un sous-noeud commence et se termine.

Personnellement, si ton site n'est pas trop fréquenté, je te recommende (à contre coeur) d'utiliser la notion de "noeud parent". En gros, tu crées un champ "parent" qui contiendra l'ID de ton noeud parent. (0 étant la racine)

Tu parcours donc ta table en partant de 0. Ensuite tu crées une fonction récursive qui fera un SELECT sur tous les noeuds qui contiendra l'ID de ton noeud comme parent.

Exemple informel:

Code : Tout sélectionner

fonction affichage_noeud(noeud_parent) debut resultats = selectionne noeud qui ont comme parent "noeud_parent" si nombre resultats n'est pas 0 alors debut boucle sur resultats debut affichage du noeud_courant affichage_noeud(noeud_courant) fin fin fin affichage_noeud(0)
Donc en gros, tu appelles la fonction affichage_noeud tant qu'il y a des noeuds qui sont enfants de ton noeud. Tu commences le tout en appelant la fonction en sélectionnant tous les noeuds qui ont le noeud_parent 0
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Mammouth du PHP | 514 Messages

16 mai 2007, 11:45

Bonjour,

merci de ta réponse.

Je vais étudier ta solution, c'est celle que j'envisageais, je ne savais juste pas comment m'y prendre.

Néanmoins, j'aurais apprécié de comprendre cet article de chez developpez.com, histoire de ...

Le site n'est pas très fréquenté, mais comme c'est une application intranet, beaucoup de requêtes sont exécutées. Sur certaines pages, j'ai des requêtes qui font jusqu'à 60 lignes, pour renvoyer des statistiques assez lourdes.

Donc si je peux éviter de multiplier les requêtes, et les boucles, je ne suis pas contre ...

Merci de ton aide.

Mammouth du PHP | 1885 Messages

16 mai 2007, 14:41

Tu peux cacher les résultats, donc créer un fichier .html de cache avec ton menu généré. (si c'est un menu)
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Mammouth du PHP | 804 Messages

17 mai 2007, 21:27

salut

c'est pour faire quoi exactement ?

Eléphant du PHP | 199 Messages

17 mai 2007, 22:11

La récursivité, comme ça a été dit (c'est à dire faire appel à la fonction à l'intérieur même de cette fonction).

A noter que la librairie SPL de PHP5 permet de faire ce genre de choses de manière très pratique avec l'interface RecursiveIterator. A noter même que pour le cas de la représentation graphique de l'arborescence des fichiers de ton ftp c'est géré nativement par des classes de PHP5 (quasiment), c'est franchement tout simple. Pour ton cas c'est un peu plus compliqué, faut implémenter ta propre classe mais ça se fait.

Si t'es intéressé tu peux m'ajouter sur MSN j'ai un ebook sympa qui parle de ça ;)
Klomac - Blog Lambda