Note :
Le module LIST_TREE vous permet d'exécuter des requêtes SQL possédant une structure arborescente.
Note: pour utiliser cette fonction, veuillez configurer vos accès SQL
dans le fichier templeet/config.php
.
Il offre les fonctions suivantes:
- list_tree : extraction d'une base de données d'une structure arborescente
- fld renvoie un champ lors d'une extraction sur une base de données
- gfld renvoie la valeur d'une variable interne de la fonction ~list
- listtotaltime renvoie le temps que templeet a passé dans la base de données
list_tree
La fonction ~list_tree permet d'effectuer une extraction sur une base de données, selon une structure arborescente.
Avec les séquences LF, LM, LP, LL, LTB, LTT, etc, on peut effectuer un traitement (le
plus souvent un affichage) différent selon qu'on affiche la première ligne,
les suivantes ou la dernière. Ceci peut s'avérer utile pour générer un
tableau.
La fonction ~list_tree prend comme arguments :
- le nom indiqué dans
templeet/config.php
pour la base de données, - la requête SQL à exécuter,
- le sens de classement des résultats : 'T' pour l'order croissant, 'TR' pour l'ordre décroissant,
- puis un nombre d'arguments couplés par deux dont le premier argument du couple peut être soit: LM, LF, LL, L1, LP, LTT, LTB, LD ou LE.
Appelons A le premier argument du couple, B le deuxième argument du couple.
- Si A est égal à LF, B est évalué lors du premier traitement, avant celui de LM et LTT
- Si A est égal à LL, B est évalué pour le dernier traitement, après celui de LP et LTB.
- Si A est égal à LM, B est évalué pour chaque traitement y compris le premier mais il sera alors évalué après celui de LF, et avant celui de LL. LM est évalué avant une descente dans une ramification.
- Si A est égal à LP, B est évalué pour chaque traitement y compris le premier mais il sera alors évalué après celui de LF, et avant celui de LL. LP est évalué après une descente dans une ramification, et donc après le traitement équivalent à LM. Les données disponibles par ~fld sont identiques à celles de LM pour un bloc donné.
- Si A est égal à LTT, B est évalué lors du premier traitement d'un sous-niveau, avant LM.
- Si A est égal à LTB, B est évalué lors du dernier traitement d'un sous-niveau, après LP.
- Si A est égal à LD, B est évalué en cas de non traitement d'information.
- Si A est égal à L1, B est évalué lors du traitement d'une seule information.
- Si A est égal à LE, B est évalué en cas d'erreur lors du traitement. Ceci comprend aussi les erreurs de connexion à la bases de données.
CREATE TABLE my_tree ( id integer NOT NULL auto_increment, parent_id integer NOT NULL DEFAULT '0', title varchar(255), PRIMARY KEY(id), KEY parent_id(parent_id) ); INSERT INTO my_tree(parent_id, title) VALUES (0, 'Liens'); INSERT INTO my_tree(parent_id, title) VALUES (1, 'Musique'); INSERT INTO my_tree(parent_id, title) VALUES (2, 'Instruments'); INSERT INTO my_tree(parent_id, title) VALUES (1, 'Informatique'); INSERT INTO my_tree(parent_id, title) VALUES (4, 'Linux'); INSERT INTO my_tree(parent_id, title) VALUES (2, 'Partitions'); INSERT INTO my_tree(parent_id, title) VALUES (2, 'Compositeurs'); INSERT INTO my_tree(parent_id, title) VALUES (7, 'J.S. Bach'); INSERT INTO my_tree(parent_id, title) VALUES (7, 'An Piele'); INSERT INTO my_tree(parent_id, title) VALUES (4, 'Templeet');
Ici, le champ
parent_id
référence le champ id
, afin de créer une structure arborescente, comme une structure de rubriques, ou une hiérarchie de répertoires.Exemple, avec
(2, 1)
représentant (id, parent_id)
:Liens (1, 0) |__ Musique (2,1) | | | |__ Instruments (3, 2) | | | |__ Partitions (6, 2) | | | |__ Compositeurs (7, 2) | | | |__ J.S. Bach (8, 7) | | | |__ An Pierle (9, 7) | |__ Informatique (4, 1) | |__ Linux (5, 4) | |__ Templeet (10, 4)
Ensuite, chaque champ objet d'une recherche est nommé par la fonction fld('nom_du_champ') pour le reste de la fonction.
fld
La fonction ~fld utilisée avec list_tree est décrite dans la page de documentation de list.
gfld
La fonction ~gfld utilisée avec list_tree est décrite dans la page de documentation de list.
Son utilisation avec list_tree est faite avec un argument propre à list_tree:
- ~gfld("numrows") : permet d'avoir le nombre de ligne renvoyé par la requête
- ~gfld("tnumrows") : permet d'avoir le nombre de ligne renvoyé par la requête pour ce niveau
- ~gfld("counter") : permet d'avoir le numéro de ligne courante
- ~gfld("tcounter") : permet d'avoir le numéro de ligne courante dans ce niveau
- ~gfld("tdepth") : permet d'obtenir la profondeur de l'arborescence. La profondeur commence à 1.
- ~gfld("error") : permet d'avoir le message d'erreur
- ~gfld("executedtime") : permet d'avoir le temps d'éxécution (pour LF, LD, L1, LL seulement)
Attention : Les champs tdepth, tnumrows, tcounter ne sont disponible que pour LM, LP, LTT, LTB.
La requête SQL doit être construite de manière particulière afin de permettre à ~list_tree de construire la structure arborescente. La première colonne sélectionnée doit être le champ servant d'identifiant (une colonne
id
par exemple), la deuxième colonne doit être la valeur de l'identifiant de l'élément parent. L'élément parent doit également être retourné par la requête afin d'obtenir la structure nécessaire.Par exemple, pour la table donnée en exemple précédemment, on pourrait faire la requête suivante :
~list_tree(~get('database'), "SELECT id, parent_id, title FROM my_tree", 'T', 'LF','Mon arbre : <br/>', 'LL','<br/>', 'LTT','<ul>', 'LTB','</ul>', 'LM','<li>~fld('title') (~fld('id'), ~fld('parent_id'), ~gfld('tdepth'))', 'LP','</li>', 'LD','J\'ai perdu mon chêne, mon alter égo...' )
Ce qui donne :
- Liens (1, 0, 1)
- Musique (2, 1, 2)
- Instruments (3, 2, 3)
- Partitions (6, 2, 3)
- Compositeurs (7, 2, 3)
- J.S. Bach (8, 7, 4)
- An Piele (9, 7, 4)
- Informatique (4, 1, 2)
- Linux (5, 4, 3)
- Templeet (10, 4, 3)
- Musique (2, 1, 2)
La même chose, mais à l'envers :
~list_tree(~get('database'), "SELECT id, parent_id, title FROM my_tree", 'T', 'LF','Mon arbre : <br/>', 'LL','<br/>', 'LTT','<ul>', 'LTB','</ul>', 'LP','<li>~fld('title') (~fld('id'), ~fld('parent_id'), ~gfld('tdepth'))', 'LM','</li>', 'LD','J\'ai perdu mon chêne, mon alter égo...' )
Ce qui donne :
- Instruments (3, 2, 3)
- Partitions (6, 2, 3)
- J.S. Bach (8, 7, 4)
- An Piele (9, 7, 4)
- Compositeurs (7, 2, 3)
- Musique (2, 1, 2)
- Linux (5, 4, 3)
- Templeet (10, 4, 3)
- Informatique (4, 1, 2)
- Liens (1, 0, 1)
Soit de manière schématique, en représentant l'ordre d'exéxution de haut en bas et de gauche à droite, en respectant les profondeurs de l'arborescence donnée en exemple en premier :
LF, LTT, LM............................... . | . . |__ LTT, LM.......................... . . | . | . . . | . |__ LTT, LM, LP . . . | . | . . . | . |__ LM, LP . . . | . | . . . | . |__ LM .................... . . . | . . | . . . . | . . |__ LTT, LM, LP . . . . | . . | . . . . | . . |__ LM, LP, LTB . . . . | . . . . . . | . ..LP, LTB.................. . . . | . . . . | ..LP, LTB........................ . . | . . |__ LM............................... . . . | . . . . |__ LTT, LM, LP . . . . | . . . . |__ LM, LP, LTB . . . . . . . ..LP, LTB........................ . . . ..LP, LTB, LF.............................
listtotaltime
La fonction ~listtotaltime utilisée avec list_tree est décrite dans la page de documentation de list.