[PLUGINS] +les plugins de bases
[ptitvelo/web/www.git] / www / plugins / menus_1 / inc / menus.php
1 <?php
2
3 // Sécurité
4 if (!defined("_ECRIRE_INC_VERSION")) return;
5
6 /**
7 * Lister les types d'entrée de menus disponibles dans les dossiers menus/
8 *
9 * @staticvar array $resultats
10 * @param bool $informer
11 * @return array
12 */
13 function menus_lister_disponibles($informer=true){
14 static $resultats = null;
15
16 $plugins_actifs = unserialize($GLOBALS['meta']['plugin']);
17
18 if (is_null($resultats[$informer])){
19 $resultats[$informer] = array();
20 // rechercher les skel du type truc.html
21 $match = ".+[.]html$";
22
23 // lister les entrées disponibles
24 $liste = find_all_in_path('menus/', $match);
25 if (count($liste)){
26 foreach($liste as $squelette=>$chemin) {
27 $type = preg_replace(',[.]html$,i', '', $squelette);
28 $dossier = str_replace($squelette, '', $chemin);
29 // On ne garde que les squelettes ayant un XML de config
30 if (file_exists("$dossier$type.xml")
31 AND (
32 $entree = !$informer OR ($entree = menus_charger_infos($dossier.$type))
33 )){
34 //on ne garde que les menus repondants aux necessites
35 $necessite = true;
36 if (! empty($entree['necessites']['plugin'])) {
37 /* la globale $plugins liste tout en majuscule */
38 $entree['necessites']['plugin'] = array_map("strtoupper", $entree['necessites']['plugin']);
39 foreach($entree['necessites']['plugin'] as $plugin) {
40 if ( ! array_key_exists($plugin,$plugins_actifs) )
41 $necessite = false;
42 }
43 }
44 if ($necessite)
45 $resultats[$informer][$type] = $entree;
46 }
47 }
48 }
49 $resultats[$informer] = pipeline('menus_lister_disponibles',array(
50 'args' => array(),
51 'data' => $resultats[$informer]
52 )
53 );
54 }
55 return $resultats[$informer];
56 }
57
58 /**
59 * Decrire un type de menu
60 *
61 * @staticvar array $infos
62 * @param string $type
63 * @return array
64 */
65 function menus_informer($type){
66 static $infos = array();
67 if (!isset($infos[$type])){
68 $fichier = find_in_path("menus/$type.html");
69 $infos[$type] = menus_charger_infos($fichier);
70 }
71 return $infos[$type];
72 }
73
74 /**
75 * Charger les informations contenues dans le xml d'une entrée de menu
76 *
77 * @param string $type
78 * @param string $info
79 * @return array
80 */
81 function menus_charger_infos($type, $info=""){
82 // on peut appeler avec le nom du squelette
83 $fichier = preg_replace(',[.]html$,i','',$type).".xml";
84 include_spip('inc/xml');
85 include_spip('inc/texte');
86 $entree = array();
87 if ($xml = spip_xml_load($fichier, false)){
88 if (count($xml['entree'])){
89 $xml = reset($xml['entree']);
90 $entree['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));
91 $entree['rang'] = intval(trim(spip_xml_aplatit($xml['rang'])));
92 $entree['rang'] = ($entree['rang'] ? $entree['rang'] : 1000);
93 $entree['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';
94 $entree['icone'] = isset($xml['icone']) ? find_in_path(reset($xml['icone'])) : '';
95 $entree['refuser_sous_menu'] = isset($xml['refuser_sous_menu']);
96 // Décomposition des paramètres
97 $entree['parametres'] = array();
98 if (spip_xml_match_nodes(',^parametre,', $xml, $parametres)){
99 foreach (array_keys($parametres) as $parametre){
100 list($balise, $attributs) = spip_xml_decompose_tag($parametre);
101 $entree['parametres'][$attributs['nom']] = array(
102 'label' => (isset($attributs['label']) && $attributs['label']) ? _T($attributs['label']) : $attributs['nom'],
103 'obligatoire' => (isset($attributs['obligatoire']) && $attributs['obligatoire'] == 'oui') ? true : false,
104 'class' => (isset($attributs['class']) && $attributs['class']) ? $attributs['class'] : ''
105 );
106 }
107 }
108 //Décomposition des necessites
109 if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){
110 $entree['necessites']['plugin'] = array();
111 foreach (array_keys($necessites) as $necessite){
112 list($balise, $attributs) = spip_xml_decompose_tag($necessite);
113 array_push($entree['necessites'][$attributs['type']] , $attributs['nom']);
114 }
115 }
116
117 }
118 }
119 if (!$info)
120 return $entree;
121 else
122 return isset($entree[$info]) ? $entree[$info] : "";
123 }
124
125 // Suprrimer une entrée (et les éventuels sous-menus en cascade)
126 function menus_supprimer_entree($id_menus_entree){
127 include_spip('base/abstract_sql');
128 $id_menus_entree = intval($id_menus_entree);
129
130 // On regarde d'abord s'il y a un sous-menu
131 $id_menu = intval(sql_getfetsel(
132 'id_menu',
133 'spip_menus',
134 'id_menus_entree = '.$id_menus_entree
135 ));
136
137 // Dans ce cas on le supprime d'abord
138 $ok = true;
139 if ($id_menu)
140 $ok = menus_supprimer_menu($id_menu);
141
142 // Si c'est bon, on peut alors supprimer l'entrée
143 if ($ok)
144 $ok = sql_delete(
145 'spip_menus_entrees',
146 'id_menus_entree = '.$id_menus_entree
147 );
148
149 return $ok;
150 }
151
152 // Supprimer un menu (et donc toutes ses entrées aussi)
153 function menus_supprimer_menu($id_menu){
154 include_spip('base/abstract_sql');
155 $id_menu = intval($id_menu);
156
157 // On récupère toutes les entrées
158 $entrees = sql_allfetsel(
159 'id_menus_entree',
160 'spip_menus_entrees',
161 'id_menu = '.$id_menu
162 );
163 if (is_array($entrees))
164 $entrees = array_map('reset', $entrees);
165
166 // On les supprime
167 $ok = true;
168 if (is_array($entrees))
169 foreach ($entrees as $id_menus_entree){
170 if ($ok)
171 $ok = menus_supprimer_entree($id_menus_entree);
172 }
173
174 // Si tout s'est bien passé on peut enfin supprimer le menu
175 if ($ok)
176 $ok = sql_delete(
177 'spip_menus',
178 'id_menu = '.$id_menu
179 );
180
181 return $ok;
182 }
183
184 ?>