X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Fmenus%2Finc%2Fmenus.php;fp=www%2Fplugins%2Fmenus%2Finc%2Fmenus.php;h=3ebd03f1a916ea662fc69150d1594f0d9eb61bc2;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/plugins/menus/inc/menus.php b/www/plugins/menus/inc/menus.php new file mode 100644 index 0000000..3ebd03f --- /dev/null +++ b/www/plugins/menus/inc/menus.php @@ -0,0 +1,184 @@ +$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; +} + +?>