[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / cfg / inc / cfg.php
1 <?php
2
3 /**
4 * Plugin générique de configuration pour SPIP
5 *
6 * @license GNU/GPL
7 * @package plugins
8 * @subpackage cfg
9 * @category outils
10 * @copyright (c) toggg, marcimat 2007-2008
11 * @link http://www.spip-contrib.net/
12 * @version $Id: cfg.php 38187 2010-05-14 18:31:13Z esj@rezo.net $
13 */
14
15 if (!defined("_ECRIRE_INC_VERSION")) return;
16
17
18
19 /**
20 * Renvoie la liste des configurations disponibles dans le path
21 * ou dans le dossier donne en argument
22 *
23 * @param string $dir
24 * @return Array
25 */
26 function liste_cfg($dir='') {
27 // Faire la liste des elements qui ont un cfg ; ca peut etre des plugins
28 // mais aussi des squelettes ou n'importe quoi
29 $liste = array();
30 // tous les repertoires
31 if (!$dir){
32 foreach (creer_chemin() as $dir) {
33 $liste = array_merge($liste, preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$'));
34 }
35 // ou seulement celui demande
36 } else {
37 $dir = rtrim(rtrim($dir),'/').'/';
38 $liste = preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$');
39 }
40
41 if ($liste) {
42 $l = array();
43 foreach($liste as $cfg) {
44 $fonds = substr(basename($cfg,'.html'),4);
45 $l[$fonds] = $cfg;
46 }
47 ksort($l);
48 return $l;
49 }
50 }
51
52 /**
53 * Renvoie une icone avec un lien vers la page de configuration d'un repertoire donné
54 *
55 * @param string $dir
56 * @return string
57 */
58 function icone_lien_cfg($dir, $script='cfg') {
59 $ret = '';
60 if ($onglets = lister_onglets_cfg($dir, $script)){
61 foreach ($onglets as $fonds=>$ong){
62 if ($ong['afficher'])
63 $ret .= '<a href="'.$ong['url'].'">'
64 .'<img src="'._DIR_PLUGIN_CFG.'cfg-16.png"
65 width="16" height="16"
66 alt="'._T('icone_configuration_site').' '.$fonds.'"
67 title="'._T('icone_configuration_site').' '.$fonds.'"
68 /></a>';
69 }
70 }
71
72 return $ret;
73 }
74
75
76
77 /**
78 * retourne un tableau contenant une liste de fonds cfg et leurs parametres
79 * d'onglet (oui/non/titre_parent), plus quelques autres parametres (url, titre, icone),
80 * pour un repertoire donne (sinon tout le path)
81 *
82 * @param string $dir
83 * @return string
84 */
85 function lister_onglets_cfg($dir='', $script='cfg'){
86 $onglets = array();
87
88 // scruter les onglets affichables
89 if ($l = liste_cfg($dir)) {
90 foreach($l as $fonds => $cfg) {
91
92 if (!isset($onglets[$fonds]))
93 $onglets[$fonds] = array();
94 $args = array();
95 $args['afficher'] = false;
96
97 // On va chercher la config cible
98 // et on regarde ses donnees pour faire l'onglet
99 // seulement si l'onglet doit etre affiche
100 include_spip('inc/cfg');
101 $tmp = new cfg($fonds);
102
103 if ($tmp->autoriser()){
104 $args['onglet'] = $tmp->form->param['onglet'];
105 $args['url'] = generer_url_ecrire($script, 'cfg='.$fonds);
106 // titre
107 if (!$args['titre'] = $tmp->form->param['titre'])
108 $args['titre'] = $fonds;
109 // icone
110 $path = dirname(dirname($cfg));
111 $args['icone'] = '';
112 if ($tmp->form->param['icone'])
113 $args['icone'] = $path.'/'.$tmp->form->param['icone'];
114 else if (file_exists($path.'/plugin.xml'))
115 $args['icone'] = 'plugin-24.gif';
116 else
117 $args['icone'] = _DIR_PLUGIN_CFG.'cfg-doc-22.png';
118
119 // l'afficher ?
120 if ($tmp->form->param['onglet'] == 'oui')
121 $args['afficher'] = true;
122 }
123
124 $onglets[$fonds] = array_merge($args, $onglets[$fonds]); // conserver les donnees deja presentes ('enfant_actif')
125 }
126 }
127 return $onglets;
128 }
129
130
131
132 /**
133 * la classe cfg represente une page de configuration
134 *
135 * @package plugins
136 * @subpackage cfg
137 */
138 class cfg
139 {
140 var $form; // la classe cfg_formulaire
141
142 /**
143 *
144 * @param string $nom
145 * @param string $cfg_id
146 * @param Array $opt
147 */
148 function cfg($nom, $cfg_id = '', $opt = array()) {
149 include_spip('inc/cfg_formulaire');
150 $this->form = new cfg_formulaire($nom, $cfg_id, $opt);
151 }
152
153 /**
154 * Controller les droits pour traiter le formulaire de config
155 *
156 * @return int # 0 ou 1
157 */
158 function autoriser() {return $this->form->autoriser(); }
159
160 /**
161 *
162 * @return boolean
163 */
164 function traiter() {return $this->form->traiter();}
165
166 /**
167 *
168 * @return string
169 */
170 function get_titre(){ return $this->form->param['titre'];}
171
172 /**
173 *
174 * @return string
175 */
176 function get_nom() { return $this->form->param['nom'];}
177
178 /**
179 *
180 * @return string
181 */
182 function get_boite(){
183 if (!(($titre = $this->form->param['titre']) && ($boite = $this->form->param['boite']))){
184 $boite=($titre)?$titre: _T('icone_configuration_site') . ' ' . $this->form->param['nom'];
185 }
186 return $boite;
187 }
188
189 /**
190 * pour pouvoir testé si la presentation des formulaires doit etre appliquee ou non
191 * m'est avis que ca devrait virer cette 'presentation=auto'...
192 * c'est comme 'rediriger', il n'y a que le plugin 'autorite' qui l'utilise
193 *
194 * @return string
195 */
196 function get_presentation() { return $this->form->param['presentation']; }
197
198 /**
199 * Affiche la boite d'info des liens vers les autres fonds CFG
200 *
201 * Les liens sont definis par la variable liens
202 * <code><!-- liens*=moncfg --></code>
203 * s'il y a une chaine de langue 'moncfg', le texte sera traduit
204 * ou
205 * <code><!-- liens*=prefixe_plugin:moncfg --></code>
206 * pour utiliser la chaine de langue de prefixe_plugin
207 *
208 * @return string
209 */
210 function liens()
211 {
212 $return = '';
213 // liens simples
214 foreach ($this->form->param['liens'] as $lien) {
215 $nom = _T($lien);
216 $lien = array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue
217 $return .= ($l = $this->generer_lien($lien, $nom)) ? "<li>$l</li>\n" : "";
218 }
219 return ($return)?"<ul>$return</ul>":'';
220 }
221
222
223 /**
224 * Affiche un lien vers le fond dont le nom ($lien)
225 * est passe en parametre
226 * a condition que le fichier fonds/cfg_$lien.html existe
227 *
228 * @param string $lien
229 * @param string $nom
230 * @return string
231 */
232 function generer_lien($lien, $nom='')
233 {
234 // nom est une chaine, pas une cle de tableau.
235 if (empty($nom) OR !is_string($nom)) $nom = $lien;
236 if (!find_in_path('fonds/cfg_'.$lien.'.html')) return "";
237
238 // si c'est le lien actif, pas de <a>
239 if (_request('cfg') == $lien)
240 return "$nom\n";
241 else
242 return "<a href='" . generer_url_ecrire("cfg","cfg=$lien") . "'>$nom</a>\n"; // &cfg_id= <-- a ajouter ?
243 }
244
245
246 /**
247 * Les liens multi sont appelles par liens_multi*=nom_du_fond
248 * a condition que le fichier fonds/cfg_$lien.html existe
249 *
250 * @return string
251 */
252 function liens_multi(){
253 // liens multiples
254 foreach ($this->form->param['liens_multi'] as $lien) {
255 $nom = _T($lien);
256 $lien = array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue
257 $return .= ($l = $this->generer_lien_multi($lien, $nom)) ? "<li>$l</li>\n" : "";
258 }
259 return ($return)?"<ul>$return</ul>":'';
260 }
261
262 /**
263 *
264 * @param string $lien
265 * @param string $nom
266 * @return string
267 */
268 function generer_lien_multi($lien, $nom=''){
269 // nom est une chaine, pas une cle de tableau.
270 if (empty($nom) OR !is_string($nom)) $nom = $lien;
271 if (!find_in_path('fonds/cfg_'.$lien.'.html')) return "";
272
273 $dedans = '';
274 if (($exi = lire_config($lien)) && is_array($exi)) {
275 foreach ($exi as $compte => $info) {
276 $lid = $lien . "_" . $compte;
277 $dedans .= "\n<label for='$lid'>$compte</label>\n"
278 . "<input type='image' id='$lid' name='cfg_id' value='$compte' "
279 . "src='".find_in_path('images/triangle.gif')."' style='vertical-align: text-top;'/><br />\n";
280 }
281 }
282 // On ajoute un bouton 'nouveau'
283 return "<form method='get' action='".generer_url_ecrire('')."'><div>\n"
284 . "<h4>$nom</h4>\n"
285 . "<input type='hidden' name='exec' value='cfg' />\n"
286 . "<input type='hidden' name='cfg' value='$lien' />\n"
287 . "<label for='$lien" . "_'>" . _T('cfg:nouveau') . "</label>\n"
288 . "<input type='image' id='$lien" . "_' name='nouveau' value='1' "
289 . "src='".find_in_path('images/creer.gif')."' style='vertical-align: text-top;'/><br />\n"
290 . $dedans
291 . "\n</div></form>\n";
292
293 }
294
295 /**
296 * Affiche la liste des onglets de CFG
297 *
298 * Recupere les fonds CFG et analyse ceux-ci
299 * - si onglet=oui : affiche l'onglet (valeur par defaut)
300 * - si onglet=non : n'affiche pas l'onglet
301 * - si onglet=fond_cfg_parent : n'affiche pas l'onglet, mais 'exposera'
302 * l'element parent indique (sous entendu que
303 * le parent n'a pas 'onglet=non' sinon rien ne sera expose...
304 *
305 * @return string # Le code HTML
306 */
307 function barre_onglets(){
308
309 // determiner les onglets a cacher et a mettre en surbrillance
310 if ($onglets = lister_onglets_cfg()){
311 foreach ($onglets as $fonds=>$ong){
312 $o = $ong['onglet'];
313
314 // onglet actif
315 if ($o == 'oui')
316 $onglets[$fonds]['actif'] = ($fonds == _request('cfg'));
317 // rendre actif un parent si l'enfant est actif (onglet=nom_du_parent
318 // (/!\ ne pas le desactiver s'il a deja ete mis actif)
319 if ($o && $o!='oui' && $o!='non'){
320 if (!isset($onglets[$o]))
321 $onglets[$o]=array();
322
323 if (!isset($onglets[$o]['enfant_actif']))
324 $onglets[$o]['enfant_actif']=false;
325
326 $onglets[$o]['enfant_actif'] = ($onglets[$o]['enfant_actif'] OR $fonds == _request('cfg'));
327 }
328 }
329 }
330
331 // retourner le code des onglets selectionnes
332 $res = "";
333 if ($onglets) {
334 $res = debut_onglet();
335 $n = -1;
336 foreach ($onglets as $titre=>$args){
337 if ($args['afficher']){
338 // Faire des lignes s'il y en a effectivement plus de 6
339 if (!(++$n%6) && ($n>0))
340 $res .= fin_onglet().debut_onglet();
341
342 $res .= onglet(
343 $args['titre'],
344 $args['url'],
345 'cfg',
346 ($args['actif'] || $args['enfant_actif']),
347 $args['icone']);
348 }
349 }
350
351 $res .= fin_onglet();
352
353 }
354 return $res;
355 }
356
357
358 /**
359 * affiche le descriptif du formulaire
360 *
361 * @return string
362 */
363 function descriptif(){
364 if ($d = $this->form->param['descriptif'])
365 return propre($d);
366 }
367
368 /**
369 * affiche une colonne à gauche
370 *
371 * @return string
372 */
373 function gauche(){
374 if ($d = $this->form->param['gauche'])
375 return propre($d);
376 }
377
378 /**
379 * affiche le message en cas d'acces interdit
380 *
381 * @return string
382 */
383 function acces_refuse(){
384 include_spip('inc/minipres');
385 return minipres(_T('info_acces_refuse'),
386 $this->form->param['refus']
387 ? $this->form->param['refus']
388 : " (cfg {$this->form->param[nom]} - {$this->form->vue} - {$this->form->param[cfg_id]})");
389 }
390
391 /**
392 * afficher les messages de cfg
393 *
394 * @return string
395 */
396 function messages(){
397 $m = $this->form->messages; $messages = array();
398 if (count($m['message_ok'])) $messages[] = join('<br />', $m['message_ok']);
399 if (count($m['message_erreur'])) $messages[] = join('<br />', $m['message_erreur']);
400 if (count($m['erreurs'])) $messages[] = join('<br />', $m['erreurs']);
401
402 if ($messages = trim(join('<br />', $messages))) {
403 return propre($messages);
404 }
405 return '';
406 }
407
408 /**
409 * affichage du formulaire (ou a defaut du texte 'choisir le module a configurer')
410 *
411 * @return string
412 */
413 function formulaire() {
414 $retour = "";
415 if (!$formulaire = $this->form->formulaire()) {
416 // Page appellee sans formulaire valable
417 $retour .= "<img src='"._DIR_PLUGIN_CFG.'cfg.png'."' style='float:right' alt='' />\n";
418 $retour .= "<h3>" . _T("cfg:choisir_module_a_configurer") . "</h3>";
419 } else {
420 $retour .= $formulaire;
421 }
422 return $retour;
423 }
424 }
425
426 ?>