PHP Navigation Tree
L'affichage d'un ensemble de listes chainées en arborescence, avec le langage PHP et en appliquant un style recursif de programmation.
La recursivité sur des listes chainées
Soit la table SQL suivante. Elle se nomme "test".
+----+------------+--------+Avec cette structure, nous pouvons faire un "navigation tree", tout comme le portlet "navigation" en haut à gauche de cette page.
| id | nom | parent |
+----+------------+--------+
| 1 | Renault | NULL |
| 2 | Mercedes | NULL |
| 3 | Fiat | NULL |
| 4 | Clio | 1 |
| 5 | Laguna | 1 |
| 6 | ClasseA | 2 |
| 7 | ClasseM | 2 |
| 8 | ClasseS | 2 |
| 9 | ClasseG | 2 |
| 10 | Cinquecent | 3 |
| 11 | Brava | 3 |
| 12 | Bravo | 3 |
+----+------------+--------+
Mais avant d'en arriver là, il faut développer certaines fonctions.
Nous allons nous contenter dans ce document, d'afficher l'arbre avec un décalage supplémentaire pour les "enfants", sans rien faire de plus.
La récursivité sera utilisée ici pour afficher l'enfant d'un enfant d'un enfant... sans limite (théorique) de profondeur.
Prérequis
Nous considérons que vous avez accès à une table SQL et que vous savez vous en servir. Toutefois, nous avons écris un document vous permettant de remplir la table d'une manière plus complexe que l'exemple donné ci-dessus. A partir de ce moment, nous considérons qu'une table assez grande et structurée comme dans l'exemple du premier chapitre est à notre disposition. Nous la nommerons "navtree".Nous considérons aussi que vous savez utiliser PHP pour acceder aux tables SQL.
Algorithme
Je ne suis pas un spécialiste de l'algorithmie et ne saurait expliquer avec rigueur comment nous allons aborder les choses.Toutefois, je sais le dire avec "mes mots".
A chaque fois que nous rencontrons un élément, nous allons tout d'abord l'afficher, et ensuite voir si il a des enfants.
Si on lui trouve un ou des enfants, alors nous aurons rencontré un autre élément, que nous allons donc afficher puis en chercher des enfants.
Une fois que nous avons ainsi scanné une lignée et que nous sommes en bout de descendance alors nous passons à son frère (le frere du bout extreme ou nous sommes).
La priorité est de chercher des enfants avant de chercher les frères.
Une fois tous les frères scannés, alors on remonte d'une génération.
Ce n'est pas du tout clair, j'en conviens, mais en essayant de relire, on devrait y arriver.
Mise en oeuvre
Langage: PHP
Nous choisissons le langage PHP parceque ce document est rédigé pour satisfaire une demande en PHP.De plus, PHP est réputé pour être adapté à un style itératif, mais il peut être assez satisfaisant en style recursif, surtout parcequ'il sait sortir "proprement" des boucles.
En effet, le principal souci dans l'implémentation recursive c'est de trouver la bonne condition de sortie de la boucle recursive.
Point de départ: level 0
Nous allons partir d'une liste des parents qui sont de level 0. On les reconnait au fait que leur champ "parent" est "NULL".C'est cette liste que nous allons parcourir.
La fonction recursive
Comme dit plus haut, à chaque élément que nous croisons, nous recherchone prioritairement un "enfant".Mais pour clarifier le code, nous allons d'abord mettre en place une fonction qui recherche les enfants d'un élément donné.
C'est ensuite que nous mettons en place la recursion proprement dite, plus quelques fonctions uniquement destinées à l'affichage.
Affichage
L'affichage est géré (et généré) par un fichier séparé, et une feuille de style.Cependant, nous pouvons faire taire les warnings.