Aujourd’hui les enfants je vais vous montrer comment généré une liste avec des enfants à l’infinie.
Dans la base de donnée, nous avons ce style de donnée:
ID PARENT_ID TEXT 1 0 test 2 1 sous-test 3 0 nouveau test 4 2 sous-sous-test 5 1 sous-test 2
Comme vous pouvez voir, la structure est très simple. Nous avons nos entrées avec leurs titres, et dans la colonne PARENT_ID nous avons les références qui pointent sur leurs parents.
Un fois généré la structure HTML ressemblera à ceci:
- test
-
- sous-test
-
- sous-sous-test
- sous-test 2
- nouveau test
Alors, allons-y! Vous remarquerez évidement que comme à l’habitude j’utilise symfony comme framework.
NB: Il est bien facile à voir que j’utilise Propel pour rejoindre et manipuler ma base de donnée. Si vous utilisez tout simplement des requêtes MySQL hardcodé vous pouvez traduire mon code à votre aise!
$c = new Criteria(); //Je vais chercher tout les donnée que ma db contient: $todo = TodoPeer::doSelect($c); //Ensuite je créer des arrays qui contiendront l'arborescence de mes données $refs = array(); $list = array(); //Je fais passé les résultats de ma requête dans un foreach qui compilera mon array foreach ($todo as $data) { //J'entre les premières données dans l'array $thisref = "$refs[ $data->getId() ]; $thisref['parent_id'] = $data->getParentId(); $thisref['name'] = $data->getTitle(); //Je vérifie si l'entrée a des enfants. if ($data->getParentId() == 0) { //Si non j'entre l'entrée au premier niveau. $list[ $data->getId() ] = "$thisref; } else { //Si oui je crée l'enfant dans un nouveau niveau. $refs[ $data->getParentId() ]['children'][ $data->getId() ] = "$thisref; } }
Vous remarquerez que le code utilisé est très court et rapide. Cela empêche l’utilisation de milliers de requêtes!
Et maintenant pour afficher correctement l’arborescence vous aurez besoin de cette fonction.
function generate_tree($arr) { //Ouverture du premier ul. $html = "<ul>"; //Boucle récursive qui créera les prochains ul. foreach ($arr as $v) { //Ajout d'un entré au même niveau. $html .= "<li>".$v['name']."</li>"; //Si un enfant existe, on rappel la même fonction récursivement if (array_key_exists('children', $v)) { $html .= "".toUL($v['children']).""; } } //On ferme le ul initial! $html .= "</ul>"; //Et on renvoie le contenu return $html; }
C’est ce qui conclut ce léger tutorial qui avait pour but de vous rendre la tâche facile avec ces structures de données qui sont habituellement bien difficile a manipuler.








