/_plugins_/menus/trunk/inc/menus.php
https://bitbucket.org/pombredanne/spip-zone-treemap · PHP · 184 lines · 127 code · 19 blank · 38 comment · 24 complexity · 5ae246a4ab60361ca9429180c4a53932 MD5 · raw file
- <?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' => (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;
- }
- ?>