source: spip-zone/_plugins_/fil_ariane/trunk/fil_ariane_fonctions.php @ 68167

Last change on this file since 68167 was 68167, checked in by cyril@…, 8 years ago

le style CSS par défaut du conteneur est maintenant "hierarchie"; surchargeable dans mes_options;

File size: 7.4 KB
Line 
1<?php
2
3/***
4 * Plugin Fil d'Ariane pour SPIP
5 * Auteur : Cyril Marion, Ateliers CYM
6 *
7 * Tres forte inspiration du site http://programmer.spip.org/
8 * Notamment la rubrique Recuperer-objet-et-id_objet
9 */
10
11// Si cette constante est vraie le fil d'Ariane commence par "accueil"
12if (!defined('_FIL_ARIANE_ACCUEIL')) define('_FIL_ARIANE_ACCUEIL',true);
13#defined('_FIL_ARIANE_ACCUEIL') || define('_FIL_ARIANE_ACCUEIL',true);
14
15// Si cette constante est vraie le fil d'Ariane se termine par un lien
16if (!defined('_FIL_ARIANE_LIEN')) define('_FIL_ARIANE_LIEN',false);
17
18// Cette constante définit le nom de la classe CSS attribué au conteneur du fil
19if (!defined('_FIL_ARIANE_STYLE')) define('_FIL_ARIANE_STYLE','hierarchie');
20
21
22/***
23 * Balise #FIL_ARIANE
24 * Récupère l'objet depuis le contexte
25 * et construit un fil d'Ariane.
26 */
27function balise_FIL_ARIANE_dist($p){
28
29    // il est possible qu'il y ait un tableau des valeurs souhaitées pour  le fil d'Ariane
30    // il s'agit dans ce cas du 1er paramètre passé avec la balise "fil_ariane"
31    $fil = interprete_argument_balise(1,$p);
32
33    if (!$fil) {
34        // On appele la fonction qui construit le fil d'Ariane
35        // en prenant en compte seulement l'id de l'objet
36        $_id_objet = $p->boucles[$p->id_boucle]->primary;
37
38        // Code php mis en cache, et qui sera exécuté et qui est sensé ramener la valeur du champ
39        $id_objet = champ_sql($_id_objet, $p);
40
41        // L'objet issu du nom de la table
42        $objet = $p->boucles[$p->id_boucle]->id_table;
43
44        $p->code = "calcule_hierarchie_objet('$objet', $id_objet)";
45    }
46
47    else {
48        // On décortique le tableau $fil et on appelle la fonction qui construit le fil
49        // avec les valeurs du tableau
50        $p->code = "construire_FIL_ARIANE($fil)";
51
52    }
53
54    return $p;
55}
56
57/**
58 * @param $objet
59 * @param $id_objet
60 * Calcule la hierarchie d'un objet et la retourne sous forme d'un tableau
61 */
62function calcule_hierarchie_objet($objet, $id_objet) {
63
64    $objet = objet_type($objet); // pour obtenir le type d'objet au singulier
65
66    if($f = charger_fonction ($objet , 'fil_ariane', true)){
67        $fil = $f($id_objet);
68        return construire_FIL_ARIANE($fil);
69    }
70
71    $fil_ariane_objet = charger_fonction ('objet' , 'fil_ariane');
72    $fil = $fil_ariane_objet($objet, $id_objet);
73    return construire_FIL_ARIANE($fil);
74
75}
76/**
77 * Construit le fil d'Ariane
78 */
79function construire_FIL_ARIANE($fil){
80
81    $fil_ariane = '<div class="'. _FIL_ARIANE_STYLE .'">';
82
83    if (!is_array($fil)) {
84        return '';
85    }
86
87    // si on doit tracer le 1er élément, on l'ajoute au début du tableau
88    if (_FIL_ARIANE_ACCUEIL)
89        $fil = array(_T('public:accueil_site') => $GLOBALS['meta']['adresse_site']) + $fil;
90
91
92    $nb= count($fil);
93    $passe=0;
94
95    foreach($fil as $titre => $lien) {
96
97        // si on a déja tracé un élément, mais qu'on est pas encore arrivé au dernier
98        if($passe>0)
99            $fil_ariane.=" &gt; ";
100
101        // tant qu'on est pas encore arrivé au dernier élément
102        if($passe<$nb-1)
103            $fil_ariane.= "<a href='$lien'>$titre</a>";
104
105        // si on arrive au dernier
106        elseif ($passe >= $nb-1) {
107            if (_FIL_ARIANE_LIEN)
108                $fil_ariane.= "<a class='on' href='$lien'>$titre</a>";
109            else
110                $fil_ariane.= "<span class='on'>$titre</span>";
111        }
112
113        $passe++;
114    }
115
116    $fil_ariane.= '</div>';
117    return $fil_ariane;
118}
119
120/**
121 * Calcule un tableau de valeurs représentant une hiérarchie de fil d'Ariane.
122 * @param int $id_objet
123 * @return array
124 *    couples titre => url
125 */
126function fil_ariane_objet_dist($objet,$id_objet) {
127
128    $url    = generer_url_entite($id_objet, $objet);
129    $titre  = generer_info_entite($id_objet, $objet, 'titre');
130
131    $fil = array();
132    $fil[$titre] =  $url;
133    return $fil;
134}
135
136function fil_ariane_organisation_dist($id_organisation) {
137    return fil_ariane_hierarchie_objet('organisation', $id_organisation, 'nom', 'id_parent');
138}
139
140function fil_ariane_rubrique_dist($id_rubrique) {
141    return fil_ariane_hierarchie_objet('rubrique', $id_rubrique, 'titre', 'id_parent');
142}
143
144function fil_ariane_article_dist($id_article) {
145    // récupere l'id de la rubrique parent, le titre de l'article
146    $item = sql_fetsel('id_rubrique, titre','spip_articles',"id_article = ".sql_quote($id_article));
147
148    // récupère la hierarchie de la rubrique parent
149    $fil_ariane_rubrique = charger_fonction ('rubrique' , 'fil_ariane');
150    $fil = $fil_ariane_rubrique($item['id_rubrique']);
151
152    // ajoute le titre et l'url de l'article
153    $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_article,'article');
154
155    return $fil;
156}
157
158function fil_ariane_produit_dist($id_produit) {
159    // récupère l'id de la rubrique parent ainsi que le titre du produit
160    $item = sql_fetsel('id_rubrique, titre','spip_produits',"id_produit = ".sql_quote($id_produit));
161
162    // récupère la hierarchie de la rubrique du produit
163    $fil_ariane_rubrique = charger_fonction ('rubrique' , 'fil_ariane');
164    $fil = $fil_ariane_rubrique($item['id_rubrique']);
165
166    // ajoute le titre et l'url du produit
167    $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_produit,'produit');
168
169    return $fil;
170}
171
172function fil_ariane_mot_dist($id_mot) {
173    // récupère l'id du groupe, le titre du mot
174    $item = sql_fetsel('id_groupe, titre','spip_mots', "id_mot = ".sql_quote($id_mot));
175
176    // récupère la hierarchie du parent (si le plugin groupes de mots arborescents)
177    # $fil = fil_ariane_hierarchie_objet('groupe' , $item['id_groupe'], 'titre', 'id_parent');
178
179    // récupère le nom du groupe
180    $groupe = sql_getfetsel('titre', 'spip_groupes_mots', "id_groupe = ".sql_quote($item['id_groupe']));
181
182    // ajoute le titre et l'url du groupe
183    $fil[typo(supprimer_numero($groupe))] = generer_url_entite($item['id_groupe'],'groupe');
184
185   // ajoute le titre et l'url du mot
186    $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_mot,'mot');
187
188    return $fil;
189}
190
191
192function fil_ariane_hierarchie_objet($objet, $id_objet, $col_titre, $col_parent){
193    $fil = array();
194
195    // trouver le nom du champ contenant la clé primaire de l'objet
196    $col_id = id_table_objet($objet);
197
198    // trouver le nom de la table contenant l'objet
199    $table = table_objet_sql($objet);
200
201    // trouver le titre et l'id du parent de l'objet en cours; on calcule son url;
202    $item = sql_fetsel("$col_titre AS titre , $col_parent AS id_parent", $table, "$col_id = ".sql_quote($id_objet));
203
204    $titre = typo(supprimer_numero($item['titre']));
205    $id_parent = $item['id_parent'];
206    $url = generer_url_entite($id_objet,$objet);
207
208    // tant qu'il y a des parents, je place nom => url dans le tableau
209    while ($id_parent) {
210        // on trouve le parent, son titre; on calcule son url
211        $parent = sql_fetsel("$col_titre AS titre , $col_parent AS id_parent", $table, "$col_id = ".sql_quote($id_parent));
212
213        $nom_parent = typo(supprimer_numero($parent['titre']));
214        $url_parent = generer_url_entite($id_parent,$objet);
215
216        $fil[$nom_parent] = $url_parent;
217        $id_parent = $parent['id_parent'];
218    }
219
220    // on inverse le tableau
221    $fil = array_reverse($fil,true);
222
223    $fil[$titre] = $url;
224
225    return $fil;
226
227}
Note: See TracBrowser for help on using the repository browser.