4 * Plugin générique de configuration pour SPIP
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 $
15 if (!defined("_ECRIRE_INC_VERSION")) return;
20 * Renvoie la liste des configurations disponibles dans le path
21 * ou dans le dossier donne en argument
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
30 // tous les repertoires
32 foreach (creer_chemin() as $dir) {
33 $liste = array_merge($liste, preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$'));
35 // ou seulement celui demande
37 $dir = rtrim(rtrim($dir),'/').'/';
38 $liste = preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$');
43 foreach($liste as $cfg) {
44 $fonds = substr(basename($cfg,'.html'),4);
53 * Renvoie une icone avec un lien vers la page de configuration d'un repertoire donné
58 function icone_lien_cfg($dir, $script='cfg') {
60 if ($onglets = lister_onglets_cfg($dir, $script)){
61 foreach ($onglets as $fonds=>$ong){
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.'"
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)
85 function lister_onglets_cfg($dir='', $script='cfg'){
88 // scruter les onglets affichables
89 if ($l = liste_cfg($dir)) {
90 foreach($l as $fonds => $cfg) {
92 if (!isset($onglets[$fonds]))
93 $onglets[$fonds] = array();
95 $args['afficher'] = false;
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);
103 if ($tmp->autoriser()){
104 $args['onglet'] = $tmp->form
->param
['onglet'];
105 $args['url'] = generer_url_ecrire($script, 'cfg='.$fonds);
107 if (!$args['titre'] = $tmp->form
->param
['titre'])
108 $args['titre'] = $fonds;
110 $path = dirname(dirname($cfg));
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';
117 $args['icone'] = _DIR_PLUGIN_CFG
.'cfg-doc-22.png';
120 if ($tmp->form
->param
['onglet'] == 'oui')
121 $args['afficher'] = true;
124 $onglets[$fonds] = array_merge($args, $onglets[$fonds]); // conserver les donnees deja presentes ('enfant_actif')
133 * la classe cfg represente une page de configuration
140 var $form; // la classe cfg_formulaire
145 * @param string $cfg_id
148 function cfg($nom, $cfg_id = '', $opt = array()) {
149 include_spip('inc/cfg_formulaire');
150 $this->form
= new cfg_formulaire($nom, $cfg_id, $opt);
154 * Controller les droits pour traiter le formulaire de config
156 * @return int # 0 ou 1
158 function autoriser() {return $this->form
->autoriser(); }
164 function traiter() {return $this->form
->traiter();}
170 function get_titre(){ return $this->form
->param
['titre'];}
176 function get_nom() { return $this->form
->param
['nom'];}
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'];
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
196 function get_presentation() { return $this->form
->param
['presentation']; }
199 * Affiche la boite d'info des liens vers les autres fonds CFG
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
205 * <code><!-- liens*=prefixe_plugin:moncfg --></code>
206 * pour utiliser la chaine de langue de prefixe_plugin
214 foreach ($this->form
->param
['liens'] as $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" : "";
219 return ($return)?
"<ul>$return</ul>":'';
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
228 * @param string $lien
232 function generer_lien($lien, $nom='')
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 "";
238 // si c'est le lien actif, pas de <a>
239 if (_request('cfg') == $lien)
242 return "<a href='" . generer_url_ecrire("cfg","cfg=$lien") . "'>$nom</a>\n"; // &cfg_id= <-- a ajouter ?
247 * Les liens multi sont appelles par liens_multi*=nom_du_fond
248 * a condition que le fichier fonds/cfg_$lien.html existe
252 function liens_multi(){
254 foreach ($this->form
->param
['liens_multi'] as $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" : "";
259 return ($return)?
"<ul>$return</ul>":'';
264 * @param string $lien
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 "";
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";
282 // On ajoute un bouton 'nouveau'
283 return "<form method='get' action='".generer_url_ecrire('')."'><div>\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"
291 . "\n</div></form>\n";
296 * Affiche la liste des onglets de CFG
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...
305 * @return string # Le code HTML
307 function barre_onglets(){
309 // determiner les onglets a cacher et a mettre en surbrillance
310 if ($onglets = lister_onglets_cfg()){
311 foreach ($onglets as $fonds=>$ong){
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();
323 if (!isset($onglets[$o]['enfant_actif']))
324 $onglets[$o]['enfant_actif']=false;
326 $onglets[$o]['enfant_actif'] = ($onglets[$o]['enfant_actif'] OR $fonds == _request('cfg'));
331 // retourner le code des onglets selectionnes
334 $res = debut_onglet();
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();
346 ($args['actif'] ||
$args['enfant_actif']),
351 $res .= fin_onglet();
359 * affiche le descriptif du formulaire
363 function descriptif(){
364 if ($d = $this->form
->param
['descriptif'])
369 * affiche une colonne à gauche
374 if ($d = $this->form
->param
['gauche'])
379 * affiche le message en cas d'acces interdit
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]})");
392 * afficher les messages de cfg
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']);
402 if ($messages = trim(join('<br />', $messages))) {
403 return propre($messages);
409 * affichage du formulaire (ou a defaut du texte 'choisir le module a configurer')
413 function formulaire() {
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>";
420 $retour .= $formulaire;