You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
5.7 KiB

<?php
// Sécurité
6 years ago
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
*/
6 years ago
function menus_lister_disponibles($informer = true) {
static $resultats = null;
6 years ago
$plugins_actifs = unserialize($GLOBALS['meta']['plugin']);
2 years ago
if (!isset($resultats[$informer])) {
$resultats[$informer] = array();
// rechercher les skel du type truc.html
6 years ago
$match = '.+[.]html$';
// lister les entrées disponibles
$liste = find_all_in_path('menus/', $match);
6 years ago
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")
6 years ago
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;
}
}
}
}
6 years ago
$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
*/
6 years ago
function menus_informer($type) {
static $infos = array();
6 years ago
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
*/
6 years ago
function menus_charger_infos($type, $info = '') {
// on peut appeler avec le nom du squelette
6 years ago
$fichier = preg_replace(',[.]html$,i', '', $type).'.xml';
include_spip('inc/xml');
include_spip('inc/texte');
include_spip('inc/filtres');
$entree = array();
6 years ago
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(!empty($xml['rang']) ? $xml['rang'] : 1000)));
6 years ago
$entree['description'] = isset($xml['description']) ?
_T_ou_typo(spip_xml_aplatit($xml['description'])) : '';
$icone = (isset($xml['icone']) ? reset($xml['icone']) : '');
if ($icone) {
$icone = find_in_path($icone);
if (function_exists('http_img_variante_svg_si_possible')) {
$icone = http_img_variante_svg_si_possible($icone);
}
}
$entree['icone'] = $icone;
$entree['refuser_sous_menu'] = isset($xml['refuser_sous_menu']);
// Décomposition des paramètres
$entree['parametres'] = array();
6 years ago
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(
6 years ago
'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
6 years ago
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);
6 years ago
array_push($entree['necessites'][$attributs['type']], $attributs['nom']);
}
}
}
}
6 years ago
if (!$info) {
return $entree;
6 years ago
} else {
return isset($entree[$info]) ? $entree[$info] : '';
}
}
6 years ago
/**
* Supprimer une entrée (et les éventuels sous-menus en cascade)
*
* @param int $id_menus_entree
* @return boolean
*/
function menus_supprimer_entree($id_menus_entree) {
include_spip('base/abstract_sql');
$id_menus_entree = intval($id_menus_entree);
6 years ago
// 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
));
6 years ago
// Dans ce cas on le supprime d'abord
$ok = true;
6 years ago
if ($id_menu) {
$ok = menus_supprimer_menu($id_menu);
6 years ago
}
// Si c'est bon, on peut alors supprimer l'entrée
6 years ago
if ($ok) {
$ok = sql_delete(
'spip_menus_entrees',
'id_menus_entree = '.$id_menus_entree
);
6 years ago
}
return $ok;
}
6 years ago
/**
* Supprimer un menu (et donc toutes ses entrées aussi)
*
* @param int $id_menu
* @return boolean
*/
function menus_supprimer_menu($id_menu) {
include_spip('base/abstract_sql');
$id_menu = intval($id_menu);
6 years ago
// On récupère toutes les entrées
$entrees = sql_allfetsel(
'id_menus_entree',
'spip_menus_entrees',
'id_menu = '.$id_menu
);
6 years ago
if (is_array($entrees)) {
$entrees = array_map('reset', $entrees);
6 years ago
}
// On les supprime
$ok = true;
6 years ago
if (is_array($entrees)) {
foreach ($entrees as $id_menus_entree) {
if ($ok) {
$ok = menus_supprimer_entree($id_menus_entree);
6 years ago
}
}
6 years ago
}
// Si tout s'est bien passé on peut enfin supprimer le menu
6 years ago
if ($ok) {
$ok = sql_delete(
'spip_menus',
'id_menu = '.$id_menu
);
6 years ago
}
return $ok;
}