Extraction d'arborescence depuis une base de données
|
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 ou '' (chaine vide) pour utliser l'ordre retourné par la requête SQL,
- 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.
Exemple pour une table :
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.
La fonction ~fld utilisée avec list_tree est décrite dans la page de documentation de list.
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)
Les champs tdepth, tnumrows et tcounter ne sont disponible que pour LM, LP, LTT, LTB.
Le champs tcount en 3.5 a été renommé en tcounter en 4.0 pour homogénéiser.