--- /dev/null
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Lister les types d'entrée de menus disponibles dans les dossiers menus/
+ *
+ * @staticvar array $resultats
+ * @param bool $informer
+ * @return array
+ */
+function menus_lister_disponibles($informer=true){
+ static $resultats = null;
+
+ $plugins_actifs = unserialize($GLOBALS['meta']['plugin']);
+
+ if (is_null($resultats[$informer])){
+ $resultats[$informer] = array();
+ // rechercher les skel du type truc.html
+ $match = ".+[.]html$";
+
+ // lister les entrées disponibles
+ $liste = find_all_in_path('menus/', $match);
+ if (count($liste)){
+ foreach($liste as $squelette=>$chemin) {
+ $type = preg_replace(',[.]html$,i', '', $squelette);
+ $dossier = str_replace($squelette, '', $chemin);
+ // On ne garde que les squelettes ayant un XML de config
+ if (file_exists("$dossier$type.xml")
+ AND (
+ $entree = !$informer OR ($entree = menus_charger_infos($dossier.$type))
+ )){
+ //on ne garde que les menus repondants aux necessites
+ $necessite = true;
+ if (! empty($entree['necessites']['plugin'])) {
+ /* la globale $plugins liste tout en majuscule */
+ $entree['necessites']['plugin'] = array_map("strtoupper", $entree['necessites']['plugin']);
+ foreach($entree['necessites']['plugin'] as $plugin) {
+ if ( ! array_key_exists($plugin,$plugins_actifs) )
+ $necessite = false;
+ }
+ }
+ if ($necessite)
+ $resultats[$informer][$type] = $entree;
+ }
+ }
+ }
+ $resultats[$informer] = pipeline('menus_lister_disponibles',array(
+ 'args' => array(),
+ 'data' => $resultats[$informer]
+ )
+ );
+ }
+ return $resultats[$informer];
+}
+
+/**
+ * Decrire un type de menu
+ *
+ * @staticvar array $infos
+ * @param string $type
+ * @return array
+ */
+function menus_informer($type){
+ static $infos = array();
+ if (!isset($infos[$type])){
+ $fichier = find_in_path("menus/$type.html");
+ $infos[$type] = menus_charger_infos($fichier);
+ }
+ return $infos[$type];
+}
+
+/**
+ * Charger les informations contenues dans le xml d'une entrée de menu
+ *
+ * @param string $type
+ * @param string $info
+ * @return array
+ */
+function menus_charger_infos($type, $info=""){
+ // on peut appeler avec le nom du squelette
+ $fichier = preg_replace(',[.]html$,i','',$type).".xml";
+ include_spip('inc/xml');
+ include_spip('inc/texte');
+ $entree = array();
+ if ($xml = spip_xml_load($fichier, false)){
+ if (count($xml['entree'])){
+ $xml = reset($xml['entree']);
+ $entree['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));
+ $entree['rang'] = intval(trim(spip_xml_aplatit($xml['rang'])));
+ $entree['rang'] = ($entree['rang'] ? $entree['rang'] : 1000);
+ $entree['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';
+ $entree['icone'] = isset($xml['icone']) ? find_in_path(reset($xml['icone'])) : '';
+ $entree['refuser_sous_menu'] = isset($xml['refuser_sous_menu']);
+ // Décomposition des paramètres
+ $entree['parametres'] = array();
+ if (spip_xml_match_nodes(',^parametre,', $xml, $parametres)){
+ foreach (array_keys($parametres) as $parametre){
+ list($balise, $attributs) = spip_xml_decompose_tag($parametre);
+ $entree['parametres'][$attributs['nom']] = array(
+ 'label' => $attributs['label'] ? _T($attributs['label']) : $attributs['nom'],
+ 'obligatoire' => $attributs['obligatoire'] == 'oui' ? true : false,
+ 'class' => $attributs['class'] ? $attributs['class'] : ''
+ );
+ }
+ }
+ //Décomposition des necessites
+ if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){
+ $entree['necessites']['plugin'] = array();
+ foreach (array_keys($necessites) as $necessite){
+ list($balise, $attributs) = spip_xml_decompose_tag($necessite);
+ array_push($entree['necessites'][$attributs['type']] , $attributs['nom']);
+ }
+ }
+
+ }
+ }
+ if (!$info)
+ return $entree;
+ else
+ return isset($entree[$info]) ? $entree[$info] : "";
+}
+
+// Suprrimer une entrée (et les éventuels sous-menus en cascade)
+function menus_supprimer_entree($id_menus_entree){
+ include_spip('base/abstract_sql');
+ $id_menus_entree = intval($id_menus_entree);
+
+ // On regarde d'abord s'il y a un sous-menu
+ $id_menu = intval(sql_getfetsel(
+ 'id_menu',
+ 'spip_menus',
+ 'id_menus_entree = '.$id_menus_entree
+ ));
+
+ // Dans ce cas on le supprime d'abord
+ $ok = true;
+ if ($id_menu)
+ $ok = menus_supprimer_menu($id_menu);
+
+ // Si c'est bon, on peut alors supprimer l'entrée
+ if ($ok)
+ $ok = sql_delete(
+ 'spip_menus_entrees',
+ 'id_menus_entree = '.$id_menus_entree
+ );
+
+ return $ok;
+}
+
+// Supprimer un menu (et donc toutes ses entrées aussi)
+function menus_supprimer_menu($id_menu){
+ include_spip('base/abstract_sql');
+ $id_menu = intval($id_menu);
+
+ // On récupère toutes les entrées
+ $entrees = sql_allfetsel(
+ 'id_menus_entree',
+ 'spip_menus_entrees',
+ 'id_menu = '.$id_menu
+ );
+ if (is_array($entrees))
+ $entrees = array_map('reset', $entrees);
+
+ // On les supprime
+ $ok = true;
+ if (is_array($entrees))
+ foreach ($entrees as $id_menus_entree){
+ if ($ok)
+ $ok = menus_supprimer_entree($id_menus_entree);
+ }
+
+ // Si tout s'est bien passé on peut enfin supprimer le menu
+ if ($ok)
+ $ok = sql_delete(
+ 'spip_menus',
+ 'id_menu = '.$id_menu
+ );
+
+ return $ok;
+}
+
+?>