[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / inc / bandeau.php
index e272254..f09a2ba 100644 (file)
@@ -3,34 +3,59 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2016                                                *
+ *  Copyright (c) 2001-2017                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined('_ECRIRE_INC_VERSION')) return;
+/**
+ * Ce fichier gère le bandeau supérieur de l'espace privé
+ *
+ * @package SPIP\Core\Bandeau
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 include_spip('inc/boutons');
 
-function definir_barre_contexte($contexte = null){
-       if (is_null($contexte))
+/**
+ * Calcule le contexte pour le menu du bandeau
+ *
+ * La fonction tente de retrouver la rubrique et le secteur d'appartenance
+ * à partir du nom du fichier exec, si celui ci correspond à un objet
+ * éditorial de SPIP (et qu'il possède ces champs), et dans ce cas,
+ * l'ajoute au contexte.
+ *
+ * @param null|array $contexte
+ *     Contexte connu.
+ *     S'il n'est pas transmis, on prend `$_GET`
+ * @return array
+ *     Contexte
+ **/
+function definir_barre_contexte($contexte = null) {
+       if (is_null($contexte)) {
                $contexte = $_GET;
-       elseif(is_string($contexte))
+       } elseif (is_string($contexte)) {
                $contexte = unserialize($contexte);
-       if (!isset($contexte['id_rubrique']) AND isset($contexte['exec'])){
-               if (!function_exists('trouver_objet_exec'))
+       }
+       if (!isset($contexte['id_rubrique']) and isset($contexte['exec'])) {
+               if (!function_exists('trouver_objet_exec')) {
                        include_spip('inc/pipelines_ecrire');
-               if ($e=trouver_objet_exec($contexte['exec'])){
+               }
+               if ($e = trouver_objet_exec($contexte['exec'])) {
                        $_id = $e['id_table_objet'];
-                       if (isset($contexte[$_id]) AND $id=intval($contexte[$_id])){
+                       if (isset($contexte[$_id]) and $id = intval($contexte[$_id])) {
                                $table = $e['table_objet_sql'];
-                               $row = sql_fetsel('*',$table,"$_id=".intval($id));
-                               if (isset($row['id_rubrique'])){
+                               $row = sql_fetsel('*', $table, "$_id=" . intval($id));
+                               if (isset($row['id_rubrique'])) {
                                        $contexte['id_rubrique'] = $row['id_rubrique'];
-                                       if (isset($row['id_secteur']))
+                                       if (isset($row['id_secteur'])) {
                                                $contexte['id_secteur'] = $row['id_secteur'];
+                                       }
                                }
                        }
                }
@@ -39,106 +64,192 @@ function definir_barre_contexte($contexte = null){
 }
 
 /**
- * definir la liste des boutons du haut et de ses sous-menus
- * On defini les boutons a metrtre selon les droits de l'utilisateur
+ * Définir la liste des boutons du haut et de ses sous-menus
+ *
+ * On defini les boutons à mettre selon les droits de l'utilisateur
  * puis on balance le tout au pipeline "ajouter_menus" pour que des plugins
  * puissent y mettre leur grain de sel
  *
  * @param array $contexte
- * @param bool $icones // rechercher les icones
- * @param bool $autorise // ne renvoyer que les boutons autorises
+ * @param bool $icones Rechercher les icones
+ * @param bool $autorise Ne renvoyer que les boutons autorisés
  * @return array
  */
-function definir_barre_boutons($contexte=array(),$icones = true, $autorise = true) {
-    include_spip('inc/autoriser');
-       $boutons_admin=array();
+function definir_barre_boutons($contexte = array(), $icones = true, $autorise = true) {
+       include_spip('inc/autoriser');
+       $boutons_admin = array();
 
        // les boutons du core, issus de prive/navigation.xml
        $liste_boutons = array();
 
        // ajouter les boutons issus des plugin via plugin.xml
        if (function_exists('boutons_plugins')
-         AND is_array($liste_boutons_plugins = boutons_plugins()))
+               and is_array($liste_boutons_plugins = boutons_plugins())
+       ) {
                $liste_boutons = &$liste_boutons_plugins;
+       }
 
-       foreach($liste_boutons as $id => $infos){
-               $parent = "";
+       foreach ($liste_boutons as $id => $infos) {
+               $parent = '';
                // les boutons principaux ne sont pas soumis a autorisation
-               if (!isset($infos['parent']) OR !($parent = $infos['parent']) OR !$autorise OR autoriser('menu',"_$id",0,NULL,array('contexte'=>$contexte))){
+               if (!isset($infos['parent'])
+                       or !($parent = $infos['parent'])
+                       or !$autorise
+                       or autoriser('menu', "_$id", 0, null, array('contexte' => $contexte))
+               ) {
                        if ($parent
-                         AND $parent = preg_replace(',^bando_,','menu_',$parent)
-                         AND isset($boutons_admin[$parent])){
-                               if (!is_array($boutons_admin[$parent]->sousmenu))
+                               and $parent = preg_replace(',^bando_,', 'menu_', $parent)
+                               and isset($boutons_admin[$parent])
+                       ) {
+                               if (!is_array($boutons_admin[$parent]->sousmenu)) {
                                        $boutons_admin[$parent]->sousmenu = array();
-                               $position = (isset($infos['position']) AND strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu);
-                               if ($position<0) $position = count($boutons_admin[$parent]->sousmenu)+1+$position;
-                               $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu,0,$position)
-                               + array($id=> new Bouton(
-                                       ($icones AND $infos['icone'])?find_in_theme($infos['icone']):'',  // icone
-                                       $infos['titre'],        // titre
-                                       (isset($infos['action']) AND $infos['action'])?$infos['action']:null,
-                                       (isset($infos['parametres']) AND $infos['parametres'])?$infos['parametres']:null
-                                       ))
-                               + array_slice($boutons_admin[$parent]->sousmenu,$position,100);
+                               }
+                               $position = (isset($infos['position']) and strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu);
+                               if ($position < 0) {
+                                       $position = count($boutons_admin[$parent]->sousmenu) + 1 + $position;
+                               }
+                               $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position)
+                                       + array(
+                                               $id => new Bouton(
+                                                       ($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '',  // icone
+                                                       $infos['titre'],  // titre
+                                                       (isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
+                                                       (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
+                                               )
+                                       )
+                                       + array_slice($boutons_admin[$parent]->sousmenu, $position, 100);
                        }
                        if (!$parent
-                       // provisoire, eviter les vieux boutons
-                       AND (!in_array($id,array('forum','statistiques_visites')))
-
+                               // provisoire, eviter les vieux boutons
+                               and (!in_array($id, array('forum', 'statistiques_visites')))
+                               and (!$autorise or autoriser('menugrandeentree', "_$id", 0, null, array('contexte' => $contexte)))
                        ) {
                                $position = (isset($infos['position']) and $infos['position']) ? $infos['position'] : count($boutons_admin);
-                               $boutons_admin = array_slice($boutons_admin,0,$position)
-                               +array($id=> new Bouton(
-                                       ($icones AND isset($infos['icone']) AND $infos['icone'])?find_in_theme($infos['icone']):'',  // icone
-                                       $infos['titre'],        // titre
-                                       (isset($infos['action']) AND $infos['action'])?$infos['action']:null,
-                                       (isset($infos['parametres']) AND $infos['parametres'])?$infos['parametres']:null
-                                       ))
-                               + array_slice($boutons_admin,$position,100);
+                               $boutons_admin = array_slice($boutons_admin, 0, $position)
+                                       + array(
+                                               $id => new Bouton(
+                                                       ($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '',  // icone
+                                                       $infos['titre'],  // titre
+                                                       (isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
+                                                       (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
+                                               )
+                                       )
+                                       + array_slice($boutons_admin, $position, 100);
                        }
                }
        }
+       $boutons_admin = pipeline('ajouter_menus', $boutons_admin);
 
-       return pipeline('ajouter_menus', $boutons_admin);
+       // définir les favoris et positions d’origine
+       if ($boutons_admin) {
+               $menus_favoris = obtenir_menus_favoris();
+               $i = 1;
+               foreach ($boutons_admin as $key => $menu) {
+                       $menu->favori = table_valeur($menus_favoris, $key, false);
+                       $menu->position = $i++;
+                       if ($menu->sousmenu) {
+                               $j = 1;
+                               foreach ($menu->sousmenu as $key => $bouton) {
+                                       $bouton->favori = table_valeur($menus_favoris, $key, false);
+                                       $bouton->position = $j++;
+                               }
+                       }
+               }
+       }
+
+       return $boutons_admin;
 }
 
 /**
- * Creer l'url a partir de exec et args, sauf si c'est deja une url formatee
+ * Trie les entrées des sous menus par ordre alhabétique
+ *
+ * @param Bouton[] $menus
+ * @param bool $avec_favoris
+ *     Si true, tri en premier les sous menus favoris, puis l'ordre alphabétique
+ * @return Bouton[]
+ */
+function trier_boutons_enfants_par_alpha($menus, $avec_favoris = false) {
+       foreach ($menus as $menu) {
+               if ($menu->sousmenu) {
+                       $libelles = $isfavoris = $favoris = array();
+                       foreach ($menu->sousmenu as $key => $item) {
+                               $libelles[$key] = strtolower(translitteration(_T($item->libelle)));
+                               $isfavoris[$key] = (bool)$item->favori;
+                               $favoris[$key] = $item->favori;
+                       }
+                       if ($avec_favoris) {
+                               array_multisort($isfavoris, SORT_DESC, $favoris, SORT_ASC, $libelles, SORT_ASC, $menu->sousmenu);
+                       } else {
+                               array_multisort($libelles, SORT_ASC, $menu->sousmenu);
+                       }
+               }
+       }
+       return $menus;
+}
+
+/**
+ * Trie les entrées des sous menus par favoris (selon leur ordre) puis les autres par ordre alhabétique
+ *
+ * @uses trier_boutons_enfants_par_alpha()
+ * @param Bouton[] $menus
+ * @return Bouton[]
+ */
+function trier_boutons_enfants_par_favoris_alpha($menus) {
+       return trier_boutons_enfants_par_alpha($menus, true);
+}
+
+
+/**
+ * Créer l'URL à partir de exec et args, sauf si c'est déjà une url formatée
  *
  * @param string $url
  * @param string $args
+ * @param array|null $contexte
  * @return string
  */
-// http://doc.spip.org/@bandeau_creer_url
-function bandeau_creer_url($url, $args="", $contexte=null){
-       if (!preg_match(',[\/\?],',$url)) {
-               $url = generer_url_ecrire($url,$args,true);
+function bandeau_creer_url($url, $args = '', $contexte = null) {
+       if (!preg_match(',[\/\?],', $url)) {
+               $url = generer_url_ecrire($url, $args, true);
                // recuperer les parametres du contexte demande par l'url sous la forme
                // &truc=@machin@
                // @machin@ etant remplace par _request('machin')
-               $url = str_replace('&amp;','&',$url);
-               while (preg_match(",[&?]([a-z_]+)=@([a-z_]+)@,i",$url,$matches)){
-                       if ($matches[2]=='id_secteur' AND !isset($contexte['id_secteur']) AND isset($contexte['id_rubrique']))
-                               $contexte['id_secteur'] = sql_getfetsel('id_secteur','spip_rubriques','id_rubrique='.intval($contexte['id_rubrique']));
-                       $val = _request($matches[2],$contexte);
-                       $url = parametre_url($url,$matches[1],$val?$val:'','&');
+               $url = str_replace('&amp;', '&', $url);
+               while (preg_match(',[&?]([a-z_]+)=@([a-z_]+)@,i', $url, $matches)) {
+                       if ($matches[2] == 'id_secteur' and !isset($contexte['id_secteur']) and isset($contexte['id_rubrique'])) {
+                               $contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($contexte['id_rubrique']));
+                       }
+                       $val = _request($matches[2], $contexte);
+                       $url = parametre_url($url, $matches[1], $val ? $val : '', '&');
                }
-               $url = str_replace('&','&amp;',$url);
+               $url = str_replace('&', '&amp;', $url);
        }
+
        return $url;
 }
 
-
 /**
- * Construire tout le bandeau superieur de l'espace prive
+ * Construire tout le bandeau supérieur de l'espace privé
  *
- * @param unknown_type $rubrique
- * @param unknown_type $sous_rubrique
- * @param unknown_type $largeur
- * @return unknown
+ * @return string
+ *     Code HTML du bandeau
  */
 function inc_bandeau_dist() {
-       return recuperer_fond('prive/squelettes/inclure/barre-nav',$_GET);
+       return recuperer_fond('prive/squelettes/inclure/barre-nav', $_GET);
 }
 
-?>
+
+/**
+ * Retourne la liste des noms d'entrées de menus favoris de l'auteur connecté
+ * @return array
+ */
+function obtenir_menus_favoris() {
+       if (
+               isset($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
+               and is_array($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
+               and $GLOBALS['visiteur_session']['prefs']['menus_favoris']
+       ) {
+               return $GLOBALS['visiteur_session']['prefs']['menus_favoris'];
+       }
+       $definir_menus_favoris = charger_fonction('definir_menus_favoris', 'inc');
+       return $definir_menus_favoris();
+}
\ No newline at end of file