$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' => (isset($attributs['label']) && $attributs['label']) ? _T($attributs['label']) : $attributs['nom'], 'obligatoire' => (isset($attributs['obligatoire']) && $attributs['obligatoire'] == 'oui') ? true : false, 'class' => (isset($attributs['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; } ?>