[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / inc / bandeau.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Ce fichier gère le bandeau supérieur de l'espace privé
15 *
16 * @package SPIP\Core\Bandeau
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 include_spip('inc/boutons');
24
25 /**
26 * Calcule le contexte pour le menu du bandeau
27 *
28 * La fonction tente de retrouver la rubrique et le secteur d'appartenance
29 * à partir du nom du fichier exec, si celui ci correspond à un objet
30 * éditorial de SPIP (et qu'il possède ces champs), et dans ce cas,
31 * l'ajoute au contexte.
32 *
33 * @param null|array $contexte
34 * Contexte connu.
35 * S'il n'est pas transmis, on prend `$_GET`
36 * @return array
37 * Contexte
38 **/
39 function definir_barre_contexte($contexte = null) {
40 if (is_null($contexte)) {
41 $contexte = $_GET;
42 } elseif (is_string($contexte)) {
43 $contexte = unserialize($contexte);
44 }
45 if (!isset($contexte['id_rubrique']) and isset($contexte['exec'])) {
46 if (!function_exists('trouver_objet_exec')) {
47 include_spip('inc/pipelines_ecrire');
48 }
49 if ($e = trouver_objet_exec($contexte['exec'])) {
50 $_id = $e['id_table_objet'];
51 if (isset($contexte[$_id]) and $id = intval($contexte[$_id])) {
52 $table = $e['table_objet_sql'];
53 $row = sql_fetsel('*', $table, "$_id=" . intval($id));
54 if (isset($row['id_rubrique'])) {
55 $contexte['id_rubrique'] = $row['id_rubrique'];
56 if (isset($row['id_secteur'])) {
57 $contexte['id_secteur'] = $row['id_secteur'];
58 }
59 } elseif (isset($row['id_groupe'])) {
60 // TODO supprimer ce bloc quand https://core.spip.net/issues/3844 sera réalisé
61 $contexte['id_groupe'] = $row['id_groupe'];
62 }
63 }
64 }
65 }
66 return $contexte;
67 }
68
69 /**
70 * Définir la liste des boutons du haut et de ses sous-menus
71 *
72 * On defini les boutons à mettre selon les droits de l'utilisateur
73 * puis on balance le tout au pipeline "ajouter_menus" pour que des plugins
74 * puissent y mettre leur grain de sel
75 *
76 * @param array $contexte
77 * @param bool $icones Rechercher les icones
78 * @param bool $autorise Ne renvoyer que les boutons autorisés
79 * @return array
80 */
81 function definir_barre_boutons($contexte = array(), $icones = true, $autorise = true) {
82 include_spip('inc/autoriser');
83 $boutons_admin = array();
84
85 // les boutons du core, issus de prive/navigation.xml
86 $liste_boutons = array();
87
88 // ajouter les boutons issus des plugin via plugin.xml
89 if (function_exists('boutons_plugins')
90 and is_array($liste_boutons_plugins = boutons_plugins())
91 ) {
92 $liste_boutons = &$liste_boutons_plugins;
93 }
94
95 foreach ($liste_boutons as $id => $infos) {
96 $parent = '';
97 // les boutons principaux ne sont pas soumis a autorisation
98 if (!isset($infos['parent'])
99 or !($parent = $infos['parent'])
100 or !$autorise
101 or autoriser('menu', "_$id", 0, null, array('contexte' => $contexte))
102 ) {
103 if ($parent
104 and $parent = preg_replace(',^bando_,', 'menu_', $parent)
105 and isset($boutons_admin[$parent])
106 ) {
107 if (!is_array($boutons_admin[$parent]->sousmenu)) {
108 $boutons_admin[$parent]->sousmenu = array();
109 }
110 $position = (isset($infos['position']) and strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu);
111 if ($position < 0) {
112 $position = count($boutons_admin[$parent]->sousmenu) + 1 + $position;
113 }
114 $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position)
115 + array(
116 $id => new Bouton(
117 ($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '', // icone
118 $infos['titre'], // titre
119 (isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
120 (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
121 )
122 )
123 + array_slice($boutons_admin[$parent]->sousmenu, $position, 100);
124 }
125 if (!$parent
126 // provisoire, eviter les vieux boutons
127 and (!in_array($id, array('forum', 'statistiques_visites')))
128 and (!$autorise or autoriser('menugrandeentree', "_$id", 0, null, array('contexte' => $contexte)))
129 ) {
130 $position = (isset($infos['position']) and $infos['position']) ? $infos['position'] : count($boutons_admin);
131 $boutons_admin = array_slice($boutons_admin, 0, $position)
132 + array(
133 $id => new Bouton(
134 ($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '', // icone
135 $infos['titre'], // titre
136 (isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
137 (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
138 )
139 )
140 + array_slice($boutons_admin, $position, 100);
141 }
142 }
143 }
144 $boutons_admin = pipeline('ajouter_menus', $boutons_admin);
145
146 // définir les favoris et positions d’origine
147 if ($boutons_admin) {
148 $menus_favoris = obtenir_menus_favoris();
149 $i = 1;
150 foreach ($boutons_admin as $key => $menu) {
151 $menu->favori = table_valeur($menus_favoris, $key, false);
152 $menu->position = $i++;
153 if ($menu->sousmenu) {
154 $j = 1;
155 foreach ($menu->sousmenu as $key => $bouton) {
156 $bouton->favori = table_valeur($menus_favoris, $key, false);
157 $bouton->position = $j++;
158 }
159 }
160 }
161 }
162
163 return $boutons_admin;
164 }
165
166 /**
167 * Trie les entrées des sous menus par ordre alhabétique
168 *
169 * @param Bouton[] $menus
170 * @param bool $avec_favoris
171 * Si true, tri en premier les sous menus favoris, puis l'ordre alphabétique
172 * @return Bouton[]
173 */
174 function trier_boutons_enfants_par_alpha($menus, $avec_favoris = false) {
175 foreach ($menus as $menu) {
176 if ($menu->sousmenu) {
177 $libelles = $isfavoris = $favoris = array();
178 foreach ($menu->sousmenu as $key => $item) {
179 $libelles[$key] = strtolower(translitteration(_T($item->libelle)));
180 $isfavoris[$key] = (bool)$item->favori;
181 $favoris[$key] = $item->favori;
182 }
183 if ($avec_favoris) {
184 array_multisort($isfavoris, SORT_DESC, $favoris, SORT_ASC, $libelles, SORT_ASC, $menu->sousmenu);
185 } else {
186 array_multisort($libelles, SORT_ASC, $menu->sousmenu);
187 }
188 }
189 }
190 return $menus;
191 }
192
193 /**
194 * Trie les entrées des sous menus par favoris (selon leur ordre) puis les autres par ordre alhabétique
195 *
196 * @uses trier_boutons_enfants_par_alpha()
197 * @param Bouton[] $menus
198 * @return Bouton[]
199 */
200 function trier_boutons_enfants_par_favoris_alpha($menus) {
201 return trier_boutons_enfants_par_alpha($menus, true);
202 }
203
204
205 /**
206 * Créer l'URL à partir de exec et args, sauf si c'est déjà une url formatée
207 *
208 * @param string $url
209 * @param string $args
210 * @param array|null $contexte
211 * @return string
212 */
213 function bandeau_creer_url($url, $args = '', $contexte = null) {
214 if (!preg_match(',[\/\?],', $url)) {
215 $url = generer_url_ecrire($url, $args, true);
216 // recuperer les parametres du contexte demande par l'url sous la forme
217 // &truc=@machin@
218 // @machin@ etant remplace par _request('machin')
219 $url = str_replace('&amp;', '&', $url);
220 while (preg_match(',[&?]([a-z_]+)=@([a-z_]+)@,i', $url, $matches)) {
221 if ($matches[2] == 'id_secteur' and !isset($contexte['id_secteur']) and isset($contexte['id_rubrique'])) {
222 $contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($contexte['id_rubrique']));
223 }
224 $val = _request($matches[2], $contexte);
225 $url = parametre_url($url, $matches[1], $val ? $val : '', '&');
226 }
227 $url = str_replace('&', '&amp;', $url);
228 }
229
230 return $url;
231 }
232
233 /**
234 * Construire tout le bandeau supérieur de l'espace privé
235 *
236 * @return string
237 * Code HTML du bandeau
238 */
239 function inc_bandeau_dist() {
240 return recuperer_fond('prive/squelettes/inclure/barre-nav', $_GET);
241 }
242
243
244 /**
245 * Retourne la liste des noms d'entrées de menus favoris de l'auteur connecté
246 * @return array
247 */
248 function obtenir_menus_favoris() {
249 if (
250 isset($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
251 and is_array($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
252 and $GLOBALS['visiteur_session']['prefs']['menus_favoris']
253 ) {
254 return $GLOBALS['visiteur_session']['prefs']['menus_favoris'];
255 }
256 $definir_menus_favoris = charger_fonction('definir_menus_favoris', 'inc');
257 return $definir_menus_favoris();
258 }