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

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

déclarer $fil correctement;

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