[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / cfg / inc / cfg.php
diff --git a/www/plugins/auto/cfg/inc/cfg.php b/www/plugins/auto/cfg/inc/cfg.php
new file mode 100644 (file)
index 0000000..854a513
--- /dev/null
@@ -0,0 +1,426 @@
+<?php
+
+/**
+ * Plugin générique de configuration pour SPIP
+ *
+ * @license    GNU/GPL
+ * @package    plugins
+ * @subpackage cfg
+ * @category   outils
+ * @copyright  (c) toggg, marcimat 2007-2008
+ * @link       http://www.spip-contrib.net/
+ * @version    $Id: cfg.php 38187 2010-05-14 18:31:13Z esj@rezo.net $
+ */
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+
+
+/**
+ * Renvoie la liste des configurations disponibles dans le path
+ * ou dans le dossier donne en argument
+ * 
+ * @param string $dir
+ * @return Array
+ */
+function liste_cfg($dir='') {
+       // Faire la liste des elements qui ont un cfg ; ca peut etre des plugins
+       // mais aussi des squelettes ou n'importe quoi
+       $liste = array();
+       // tous les repertoires
+       if (!$dir){
+               foreach (creer_chemin() as $dir) {
+                       $liste = array_merge($liste, preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$'));
+               }
+       // ou seulement celui demande
+       } else {        
+               $dir = rtrim(rtrim($dir),'/').'/';
+               $liste = preg_files($d=$dir.'fonds/', $d.'cfg_[^/]*[.]html$');
+       }
+
+       if ($liste) {
+               $l = array();
+               foreach($liste as $cfg) {
+                       $fonds = substr(basename($cfg,'.html'),4);
+                       $l[$fonds] = $cfg;
+               }
+               ksort($l);
+               return $l;
+       }
+}
+
+/**
+ * Renvoie une icone avec un lien vers la page de configuration d'un repertoire donné
+ * 
+ * @param string $dir
+ * @return string
+ */
+function icone_lien_cfg($dir, $script='cfg') {
+       $ret = '';
+       if ($onglets = lister_onglets_cfg($dir, $script)){
+               foreach ($onglets as $fonds=>$ong){
+                       if ($ong['afficher'])
+                               $ret .= '<a href="'.$ong['url'].'">'
+                                       .'<img src="'._DIR_PLUGIN_CFG.'cfg-16.png"
+                                               width="16" height="16"
+                                               alt="'._T('icone_configuration_site').' '.$fonds.'"
+                                               title="'._T('icone_configuration_site').' '.$fonds.'"
+                                       /></a>';                                        
+               }
+       }
+
+       return $ret;
+}
+
+
+
+/**
+ * retourne un tableau contenant une liste de fonds cfg et leurs parametres
+ * d'onglet (oui/non/titre_parent), plus quelques autres parametres (url, titre, icone),
+ * pour un repertoire donne (sinon tout le path)
+ * 
+ * @param string $dir
+ * @return string
+ */
+function lister_onglets_cfg($dir='', $script='cfg'){
+       $onglets = array();
+       
+       // scruter les onglets affichables
+       if ($l = liste_cfg($dir)) {
+               foreach($l as $fonds => $cfg) {
+
+                       if (!isset($onglets[$fonds])) 
+                               $onglets[$fonds] = array();
+                       $args = array();
+                       $args['afficher'] = false;
+                       
+                       // On va chercher la config cible
+                       // et on regarde ses donnees pour faire l'onglet
+                       // seulement si l'onglet doit etre affiche
+                       include_spip('inc/cfg');
+                       $tmp = new cfg($fonds);
+
+                       if ($tmp->autoriser()){
+                               $args['onglet'] = $tmp->form->param['onglet'];
+                               $args['url'] = generer_url_ecrire($script, 'cfg='.$fonds);
+                               // titre
+                               if (!$args['titre'] = $tmp->form->param['titre'])
+                                       $args['titre'] = $fonds;
+                               // icone        
+                               $path = dirname(dirname($cfg)); 
+                               $args['icone'] = '';
+                               if ($tmp->form->param['icone'])
+                                       $args['icone'] = $path.'/'.$tmp->form->param['icone'];
+                               else if (file_exists($path.'/plugin.xml'))
+                                       $args['icone'] = 'plugin-24.gif';
+                               else
+                                       $args['icone'] = _DIR_PLUGIN_CFG.'cfg-doc-22.png';      
+                               
+                               // l'afficher ?
+                               if ($tmp->form->param['onglet'] == 'oui')
+                                       $args['afficher'] = true;
+                       }
+                       
+                       $onglets[$fonds] = array_merge($args, $onglets[$fonds]); // conserver les donnees deja presentes ('enfant_actif')
+               }
+       }
+       return $onglets;        
+}
+       
+
+
+/**
+ * la classe cfg represente une page de configuration
+ *
+ * @package    plugins
+ * @subpackage cfg
+ */
+class cfg
+{
+       var $form; // la classe cfg_formulaire
+       
+       /**
+        *
+        * @param string $nom
+        * @param string $cfg_id
+        * @param Array $opt
+        */
+       function cfg($nom, $cfg_id = '', $opt = array()) {
+               include_spip('inc/cfg_formulaire');
+               $this->form = new cfg_formulaire($nom, $cfg_id, $opt);
+       }
+
+       /**
+        * Controller les droits pour traiter le formulaire de config
+        *
+        * @return int # 0 ou 1
+        */
+       function autoriser()  {return $this->form->autoriser(); }
+       
+       /**
+        *
+        * @return boolean
+        */
+       function traiter()  {return $this->form->traiter();}
+       
+       /**
+        *
+        * @return string
+        */
+       function get_titre(){ return $this->form->param['titre'];}
+       
+       /**
+        *
+        * @return string
+        */
+       function get_nom()  { return $this->form->param['nom'];}
+       
+       /**
+        *
+        * @return string
+        */
+       function get_boite(){ 
+               if (!(($titre = $this->form->param['titre']) && ($boite = $this->form->param['boite']))){
+                       $boite=($titre)?$titre: _T('icone_configuration_site') . ' ' . $this->form->param['nom'];
+               }
+               return $boite;
+       }
+
+       /**
+        * pour pouvoir testé si la presentation des formulaires doit etre appliquee ou non
+        * m'est avis que ca devrait virer cette 'presentation=auto'...
+        * c'est comme 'rediriger', il n'y a que le plugin 'autorite' qui l'utilise
+        * 
+        * @return string
+        */
+       function get_presentation() { return $this->form->param['presentation'];        }
+       
+       /**
+        * Affiche la boite d'info des liens vers les autres fonds CFG
+        *
+        * Les liens sont definis par la variable liens
+        * <code><!-- liens*=moncfg --></code>
+        * s'il y a une chaine de langue 'moncfg', le texte sera traduit
+        * ou
+        * <code><!-- liens*=prefixe_plugin:moncfg --></code>
+        * pour utiliser la chaine de langue de prefixe_plugin
+        *
+        * @return string
+        */
+       function liens()
+       {
+               $return = '';
+               // liens simples
+               foreach ($this->form->param['liens'] as $lien) {
+                       $nom = _T($lien);
+                       $lien =  array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue
+                       $return .= ($l = $this->generer_lien($lien, $nom)) ? "<li>$l</li>\n" : "";
+               }
+               return ($return)?"<ul>$return</ul>":'';
+       }
+
+
+       /**
+        * Affiche un lien vers le fond dont le nom ($lien)
+        * est passe en parametre
+        * a condition que le fichier fonds/cfg_$lien.html existe
+        *
+        * @param string $lien
+        * @param string $nom
+        * @return string
+        */
+       function generer_lien($lien, $nom='')
+       {
+               // nom est une chaine, pas une cle de tableau.
+               if (empty($nom) OR !is_string($nom)) $nom = $lien;
+               if (!find_in_path('fonds/cfg_'.$lien.'.html')) return "";
+               
+               // si c'est le lien actif, pas de <a>
+               if (_request('cfg') == $lien) 
+                       return "$nom\n";
+               else
+                       return "<a href='" . generer_url_ecrire("cfg","cfg=$lien") . "'>$nom</a>\n"; // &cfg_id= <-- a ajouter ?
+       }
+       
+       
+       /**
+        * Les liens multi sont appelles par liens_multi*=nom_du_fond
+        * a condition que le fichier fonds/cfg_$lien.html existe
+        *
+        * @return string
+        */
+       function liens_multi(){
+               // liens multiples
+               foreach ($this->form->param['liens_multi'] as $lien) {
+                       $nom = _T($lien);
+                       $lien =  array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue
+                       $return .= ($l = $this->generer_lien_multi($lien, $nom)) ? "<li>$l</li>\n" : "";
+               }
+               return ($return)?"<ul>$return</ul>":'';
+       }
+
+       /**
+        *
+        * @param string $lien
+        * @param string $nom
+        * @return string
+        */
+       function generer_lien_multi($lien, $nom=''){
+               // nom est une chaine, pas une cle de tableau.
+               if (empty($nom) OR !is_string($nom)) $nom = $lien;
+               if (!find_in_path('fonds/cfg_'.$lien.'.html')) return "";
+               
+               $dedans = '';
+               if (($exi = lire_config($lien)) && is_array($exi)) {
+                       foreach ($exi as $compte => $info) {
+                               $lid = $lien . "_" . $compte;
+                               $dedans .= "\n<label for='$lid'>$compte</label>\n"
+                                               .  "<input type='image' id='$lid' name='cfg_id' value='$compte' "
+                                               .  "src='".find_in_path('images/triangle.gif')."' style='vertical-align: text-top;'/><br />\n";
+                       }
+               }
+               // On ajoute un bouton 'nouveau'
+               return    "<form method='get' action='".generer_url_ecrire('')."'><div>\n"
+                               . "<h4>$nom</h4>\n"
+                               . "<input type='hidden' name='exec' value='cfg' />\n"
+                               . "<input type='hidden' name='cfg' value='$lien' />\n"
+                               . "<label for='$lien" . "_'>" . _T('cfg:nouveau') . "</label>\n"
+                               . "<input type='image' id='$lien" . "_' name='nouveau' value='1' "
+                               . "src='".find_in_path('images/creer.gif')."' style='vertical-align: text-top;'/><br />\n" 
+                               . $dedans
+                               . "\n</div></form>\n";
+       
+       }
+       
+       /**
+        * Affiche la liste des onglets de CFG
+        *
+        * Recupere les fonds CFG et analyse ceux-ci
+        * - si onglet=oui : affiche l'onglet (valeur par defaut)
+        * - si onglet=non : n'affiche pas l'onglet
+        * - si onglet=fond_cfg_parent : n'affiche pas l'onglet, mais 'exposera'
+        * l'element parent indique (sous entendu que
+        * le parent n'a pas 'onglet=non' sinon rien ne sera expose...
+        *
+        * @return string # Le code HTML
+        */
+       function barre_onglets(){
+               
+               // determiner les onglets a cacher et a mettre en surbrillance
+               if ($onglets = lister_onglets_cfg()){
+                       foreach ($onglets as $fonds=>$ong){
+                               $o = $ong['onglet'];
+
+                               // onglet actif
+                               if ($o == 'oui')        
+                                       $onglets[$fonds]['actif'] = ($fonds == _request('cfg'));
+                               // rendre actif un parent si l'enfant est actif (onglet=nom_du_parent
+                               // (/!\ ne pas le desactiver s'il a deja ete mis actif)
+                               if ($o && $o!='oui' && $o!='non'){
+                                       if (!isset($onglets[$o])) 
+                                               $onglets[$o]=array();
+                                       
+                                       if (!isset($onglets[$o]['enfant_actif'])) 
+                                               $onglets[$o]['enfant_actif']=false;
+                                               
+                                       $onglets[$o]['enfant_actif'] = ($onglets[$o]['enfant_actif'] OR $fonds == _request('cfg'));
+                               }
+                       }
+               }
+
+               // retourner le code des onglets selectionnes
+               $res = "";
+               if ($onglets) {
+                       $res = debut_onglet();
+                       $n = -1;
+                       foreach ($onglets as $titre=>$args){
+                               if ($args['afficher']){
+                                       // Faire des lignes s'il y en a effectivement plus de 6
+                                       if (!(++$n%6) && ($n>0))
+                                               $res .= fin_onglet().debut_onglet();
+                                               
+                                       $res .= onglet(
+                                                       $args['titre'], 
+                                                       $args['url'], 
+                                                       'cfg', 
+                                                       ($args['actif'] || $args['enfant_actif']), 
+                                                       $args['icone']);
+                               }       
+                       }
+                       
+                       $res .= fin_onglet();
+                       
+               }
+               return $res;
+       }
+       
+
+       /**
+        * affiche le descriptif du formulaire
+        *
+        * @return string
+        */
+       function descriptif(){
+               if ($d = $this->form->param['descriptif'])
+                       return propre($d);      
+       }
+       
+       /**
+        * affiche une colonne à gauche
+        *
+        * @return string
+        */
+       function gauche(){
+               if ($d = $this->form->param['gauche'])
+                       return propre($d);      
+       }
+       
+       /**
+        * affiche le message en cas d'acces interdit
+        *
+        * @return string
+        */
+       function acces_refuse(){
+               include_spip('inc/minipres');
+               return minipres(_T('info_acces_refuse'), 
+                       $this->form->param['refus']
+                               ? $this->form->param['refus']
+                               : " (cfg {$this->form->param[nom]} - {$this->form->vue} - {$this->form->param[cfg_id]})");
+       }
+       
+       /**
+        * afficher les messages de cfg
+        *
+        * @return string
+        */
+       function messages(){
+               $m = $this->form->messages; $messages = array();
+               if (count($m['message_ok']))            $messages[] = join('<br />', $m['message_ok']);
+               if (count($m['message_erreur']))        $messages[] = join('<br />', $m['message_erreur']);
+               if (count($m['erreurs']))                       $messages[] = join('<br />', $m['erreurs']);
+               
+               if ($messages = trim(join('<br />', $messages))) {
+                       return propre($messages);
+               }
+               return '';
+       }
+       
+       /**
+        * affichage du formulaire (ou a defaut du texte 'choisir le module a configurer')
+        * 
+        * @return string
+        */
+       function formulaire() {
+               $retour = "";   
+               if (!$formulaire = $this->form->formulaire()) {
+                       // Page appellee sans formulaire valable
+                       $retour .= "<img src='"._DIR_PLUGIN_CFG.'cfg.png'."' style='float:right' alt='' />\n";
+                       $retour .=  "<h3>" . _T("cfg:choisir_module_a_configurer") . "</h3>";
+               } else {
+                       $retour .= $formulaire;
+               }
+               return $retour;
+       }
+}
+
+?>