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

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

le caractère séparateur est désormais configurable, et il est placé dans un span;

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