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

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

le contrôle sur l'id_rubrique > 0 placé avant de calculer la hierarchie; ceci afin d'éviter un double "sep" sur les hiérarchies d'articles de type "pages uniques";

File size: 7.3 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        } 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 .= "<span class=\"sep divider\">" . _FIL_ARIANE_SEP . "</span>";
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 seulement si id_rubrique non nul (cas des pages uniques);
149        if($item['id_rubrique'] > 0) {
150                $fil_ariane_rubrique = charger_fonction('rubrique', 'fil_ariane');
151                $fil = $fil_ariane_rubrique($item['id_rubrique']);
152        }
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.