Your IP : 216.73.216.20


Current Path : /home/e/t/i/etiennec/www/oldsite/plugins/auto/cfg/inc/
Upload File :
Current File : /home/e/t/i/etiennec/www/oldsite/plugins/auto/cfg/inc/cfg_formulaire.php

<?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_formulaire.php 37380 2010-04-17 19:47:06Z marcimat@rezo.net $
 */

if (!defined("_ECRIRE_INC_VERSION")) return;



/**
 * la classe cfg represente une page de configuration
 *
 * @package    plugins
 * @subpackage cfg
 */
class cfg_formulaire{

	/**
	 * les parametres des formulaires cfg sont stockes dans cet objet
	 * @var Array 
	 */
	var $param;
	
	/**
	 * l'objet de classe cfg_depot qui assure lecture/ecriture/effacement des config
	 * @var <type> 
	 */
	var $depot = null;

	/**
	 * le fond html utilise , en general pour config simple idem $nom
	 * @var string 
	 */
	var $vue = '';

	/**
	 * l'adresse du fond html (sans l'extension .html)
	 * @var string 
	 */
	var $path_vue = '';

	/**
	 * provient-on d'un formulaire de type CVT (charger/verifier/traiter) dans formulaires/ ?
	 * @var boolean
	 */
	var $depuis_cvt = false;

	/**
	 * compte-rendu des mises a jour
	 * @var Array
	 */
	var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());

	/**
	 * les champs trouve dans le fond
	 * @var Array
	 */
	var $champs = array();

	/**
	 * les champs index
	 * @var Array
	 */
	var $champs_id = array();

	/**
	 * leurs valeurs
	 * @var Array
	 */
	var $val = array();

	/**
	 * pour tracer les valeurs modifiees
	 * @var string
	 */
	var $log_modif = '';

	/**
	 * contenu du fichier de formulaire
	 * @var string
	 */
	var $controldata ='';

	/**
	 * stockage du fond compile par recuperer_fond()
	 * @var <type>
	 */
	var $fond_compile = '';

	/**
	 * y a t-il des extensions (classes css 'type_{nom}' ou 'cfg_{nom}' sur champs) a traiter ?
	 * @var Array
	 */
	var $extensions = array();

	/**
	 * Alias pour passer facilement les parametres aux classes appelees
	 * @var Array
	 */
	var $params = array();

	/**
	 * Constructeur de la classe
	 * 
	 * @param string $nom
	 * @param string $cfg_id
	 * @param Array $opt 
	 */
	function cfg_formulaire($nom, $cfg_id = '', $opt = array())
	{
		$this->param = array(
			'afficher_messages' => true, // afficher ce compte rendu ?
			'autoriser' => 'configurer',	// le "faire" de autoriser($faire), par defaut, autoriser_configurer_dist()	
			'autoriser_absence_id' => 'non', // autoriser l'insertion de nouveau contenu dans une table sans donner d'identifiant ?
			'casier' => '', // sous tableau optionel du meta ou va etre stocke le fragment de config
			'cfg_id' => '', // pour une config multiple , l'id courant
			'descriptif' => '', // descriptif
			'depot' => 'metapack', // (ancien 'storage') le depot utilise pour stocker les donnees, par defaut metapack: spip_meta serialise 
			'fichier' => '', // pour storage php, c'est l'adresse du fichier (depuis la racine de spip), sinon ca prend /local/cfg/nom.php
			'gauche' => '', // pour une colonne à gauche
			'head' => '', // partie du fond cfg a inserer dans le head par le pipeline header_prive (todo insert_head?)
			'icone' => '', // lien pour une icone
			'inline' => '', // code qui sera insere apres le contenu du fond (peut servir pour inserer du js)
			'interpreter' => 'oui', // si interpreter vaut 'non', le fond ne sera pas traite comme un fond cfg, mais comme une inclusion simple (pas de recherche des champs de formulaires). Cela permet d'utiliser des #FORMULAIRES_XX dans un fonds/ tout en utilisant la simplicite des parametres <!-- liens=.. --> par exemple.
			'liens' => array(), // liens optionnels sur des sous-config <!-- liens*=xxx -->
			'liens_multi' => array(), // liens optionnels sur des sous-config pour des fonds utilisant un champ multiple  <!-- liens_multi*=xxx -->
			'nom' => '', // le nom du meta (ou autre) ou va etre stocke la config concernee
			'onglet' => 'oui', // cfg doit-il afficher un lien vers le fond sous forme d'onglet dans la page ?exec=cfg
			'presentation' => 'auto', // cfg doit-il encadrer le formulaire tout seul ?
			'refus' => '', // en cas de refus d'autorisation, un message informatif [(#REM) refus=...]
			'table' => '', // nom de la table sql pour storage extra ou table
		);
		$this->param['nom'] = $this->vue = $nom;
		$this->param['cfg_id'] = $cfg_id;

		// exception flagrante : le formulaire 'configurer'
		// si c'est un formulaire generique, le nom et l'id ne sont pas bon.
		if ($this->vue == 'configurer') {
			$this->param['nom'] = $cfg_id;
			$this->param['cfg_id'] = '';
		}
				
		// definition de l'alias params
		$this->params = array(
			'champs' => &$this->champs, 
			'champs_id' => &$this->champs_id,
			'messages' => &$this->messages,
			'val' => &$this->val,
			'param' => &$this->param
		);	
		
		foreach ($opt as $o=>$v) {
			$this->$o = $v;
		}    
		// charger les donnees du fond demande
		$this->charger();
	}
	
	/**
	 * retourne true en cas d'erreur...
	 * 
	 * @return boolean 
	 */
	function erreurs(){
		return $this->messages['erreurs'] || $this->messages['message_erreur'];
	}

	/**
	 * ajoute une erreur sur un champ donne
	 * 
	 * @param string $champ
	 * @param string $message 
	 */
	function ajouter_erreur($champ, $message) {
		$this->messages['erreurs'][$champs] = isset($this->messages['erreurs'][$champs]) 
			? $this->messages['erreurs'][$champs] .= '<br />' . $message
			: $message;
	}
	
	/**
	 * ajoute des erreurs sur les champs indiques dans le tableau
	 * (comme verifier de cvt)
	 * 
	 * @param Array $err
	 * @return boolean 
	 */
	function ajouter_erreurs($err) {
		if (!is_array($err)) return false;
		if (isset($err['message_erreur']) && $err['message_erreur']) 
			$this->messages['message_erreur'][] = $err['message_erreur'];
		if (isset($err['message_ok']) && $err['message_ok']) 	
			$this->messages['message_ok'][] = $err['message_ok'];
		unset($err['message_erreur'], $err['message_ok']);
		if ($err) $this->messages['erreurs'] = $err;		// ou un merge ?? //
		return true;
	}
	
	
	/**
	 * pre-analyser le formulaire,
	 * c'est a dire recuperer les parametres CFG 
	 * et les noms des champs du formulaire	
	 * 
	 * @return boolean 
	 */
	function charger(){
		$ok = true;
		
		// si pas de fichier, rien a charger
		if (!$this->vue) return false;

		// lecture de la vue (fond cfg)
		// il s'agit de recuperer le contenu du fichier
 		if (!$fichier = find_in_path($nom = 'fonds/cfg_' . $this->vue .'.html')){
			if ($fichier = find_in_path($nom = 'formulaires/' . $this->vue .'.html'))
				$this->depuis_cvt = true;
		}
		
		// si pas de fichier, rien a charger
		if (!$fichier) return false;
		
		if (!lire_fichier($fichier, $this->controldata)) {
			$ok = false;
			$this->messages['message_erreur'][] =  _T('cfg:erreur_lecture', array('nom' => $nom));
		} else {
			$this->path_vue = substr($fichier,0,-5);
		}		

		// recherche et stockage des parametres de cfg 
		$this->recuperer_parametres();

		// si le fond ne doit pas etre calcule comme un fond CFG,
		// on s'arrete ici. De cette maniere, CFG ne prendra pas
		// comme des champs a recuperer les champs issus d'un autre formulaire
		// CFG inclu depuis un formulaire CVT via #FORMULAIRE_XX
		if ($this->param['interpreter'] == 'non')
			return true;
			
		// recherche et stockage des noms de champs de formulaire
		if ($err = $this->recuperer_noms_champs()){
			$ok = false;
			$this->messages['message_erreur'][] = $err;
		}
	    
		// charger les champs particuliers si existants
		$this->actionner_extensions('pre_charger');	  
		  
		// creer le storage et lire les valeurs
		$this->param['depot'] = strtolower(trim($this->param['depot']));
		include_spip('inc/cfg_config');
		$this->depot = new cfg_depot($this->param['depot'], $this->params);
		$ok &= $this->lire();

		// charger les champs particuliers si existants
		$this->actionner_extensions('charger');
		
		return $ok;
	}

	/**
	 * Doit controler la validite des valeurs transmises
	 * 
	 * Verifie les valeurs postees.
	 * - stocke les valeurs qui ont changees dans $this->val[$nom_champ] = 'nouvelle_valeur'
	 * - verifie que les types de valeurs attendus sont corrects ($this->verifier_champs_types)
	 * 
	 * retourne les messages d'erreur
	 * @return boolean|string 
	 */
	function verifier() {

		if ($this->erreurs() || !$this->autoriser()) 
				return false;

		// si on a pas poste de formulaire, pas la peine de controler
		// ce qui mettrait de fausses valeurs dans l'environnement
		if  (!_request('_cfg_ok') && !_request('_cfg_delete')) return true;

		// les formulaires CVT ont deja leurs securites
		if (!$this->depuis_cvt) {
			$securiser_action = charger_fonction('securiser_action', 'inc');
			$securiser_action();
		}

		// actions par champs speciaux, avant les tests des nouvelles valeurs
		$this->actionner_extensions('pre_verifier');
		
		// stockage des nouvelles valeurs
		foreach ($this->champs as $name => $def) {
			// enregistrement des valeurs postees
			$oldval = $this->val[$name];
		    $this->val[$name] = _request($name);
		    
		    // tracer les modifications
		    if ($oldval != $this->val[$name]) {
		    	$this->log_modif .= $name . ':' . var_export($oldval, true) . '/' . var_export($this->val[$name], true) .', ';
		    }
		}
	    
		// si pas de changement, pas la peine de continuer
		if (!$this->log_modif && !_request('_cfg_delete')) {
			$this->messages['message_erreur'][] = _T('cfg:pas_de_changement', array('nom' => $this->nom_config()));
			return false;
		}
		
		// verifier la validite des champs speciaux (cfg_xx, type_xx)
		$this->actionner_extensions('verifier');
		
		// stocker le fait que l'on a controle les valeurs
		$this->verifier = true;
	    return !$this->erreurs();
	}
	
	/**
	 * Gere le traitement du formulaire.
	 * 
	 * Si le chargement ou le controle n'ont pas ete fait,
	 * la fonction s'en occupe.
	 *
	 * @return boolean
	 */
	function traiter()
	{
		if (!$this->verifier) $this->verifier();
		
		if ($this->erreurs() || !$this->autoriser()) return false;
	
		if (!_request('_cfg_ok') && !_request('_cfg_delete')) return false;
		
		// les formulaires CVT ont deja leurs securites
		if (!$this->depuis_cvt) {
			$securiser_action = charger_fonction('securiser_action', 'inc');
			$securiser_action();
		}
		
		$this->actionner_extensions('pre_traiter');	
		
		if ($this->erreurs()) return false;		
			
		// suppression
		if (_request('_cfg_delete')) {
			$this->effacer();
		
		// sinon modification
		} else {
			$this->ecrire();
		}

		// pipeline 'cfg_post_edition' ? (quelqu'un utilise ??)
		$this->messages = pipeline('cfg_post_edition',array('args'=>array('nom_config'=>$this->nom_config()),'data'=>$this->messages));

		$this->actionner_extensions('post_traiter');

		// annuler le cache de SPIP
		include_spip('inc/invalideur');
		suivre_invalideur('cfg/' . $this->param['nom'] .
			($this->param['casier'] ? '/' . $this->param['casier'] : '') .
			($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : ''));		
	}

	/**
	 * Determine l'arborescence ou CFG doit chercher les valeurs deja enregistrees
	 * 
	 * si nom=toto, casier=chose/truc, cfg_id=2, 
	 * cfg cherchera dans #CONFIG{toto/chose/truc/2}
	 *
	 * @return string
	 */
	function nom_config()
	{
	    return $this->param['nom'] . 
	    		($this->param['casier'] ? '/' . $this->param['casier'] : '') .
	    		($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : '');
	}

	/**
	 * Recherche et stockage
	 * des parametres #REM passes a CFG
	 * 
	 * @deprecated (DEPRECIE)
	 */
	function recuperer_parametres_rem(){
		// cas de #REM (deprecie)
		preg_replace_callback('/(\[\(#REM\) ([a-z0-9_]\w+)(\*)?=)(.*?)\]/sim',
					array(&$this, 'post_params'), $this->controldata);
	}

	/**
	 * cette fonction recherche et stocke les parametres passes a cfg par <!-- param=valeur -->
	 * ces lignes sont alors effacees du code html. Ces proprietes sont lues apres recuperer_fond(),
	 * et interpretent donc les balises spip et les chaines de langues
	 *
	 * si la fonction est appelee 2 fois, les parametres identiques ne seront pas copies
	 * sauf si le parametre est un tableau (<!-- param*=valeur -->), les valeurs seront dupliquees
	 */
	function recuperer_parametres(){

		// pour compatibilite, recuperer l'ancien code #REM
		$this->recuperer_parametres_rem();	
		
		$this->recuperer_fond();
		$this->fond_compile = preg_replace_callback('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim',
							array(&$this, 'post_params'), $this->fond_compile);

		// s'il en reste : il y a un probleme !
		// est-ce utile de tester ça ?
		if (preg_match('/<!-- [a-z0-9_]\w+\*?=/', $this->fond_compile)) {
			die('Un parametre CFG n\'a pas pu etre importe depuis '.$this->vue);
		}

		// pour compatibilite avec les anciennes versions (<1.4.1)
		if (isset($this->param['storage'])) 
			$this->param['depot'] = $this->param['storage'];
		
		if ($this->param['depot'] == 'classic')
			$this->param['depot'] = 'meta';
			
		if ($this->param['depot'] == 'extrapack'){
			$this->param['depot'] = 'tablepack';
			$this->param['colonne'] = 'extra';
			$this->param['table'] = 'spip_auteurs';
		}
		
		// definir les parametres qui sont a traiter comme des extensions
		// il faut que le parametre ne soit pas vide et qu'un fichier 
		// /cfg/params/{param}.php existe
		$this->extensions_parametres = array();
		foreach ($this->param as $nom=>$val){
			if ($val) $this->ajouter_extension_parametre($nom);		
		}
	}

	/**
	 * une fonction pour effacer les parametres du code html
	 * ce qui evite de dupliquer les tableaux 
	 * (si on utilisait recuperer_parametres() a la place)
	 */
	function effacer_parametres(){
		$this->fond_compile = preg_replace('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim', '', $this->fond_compile);		
	}
	
	/**
	 * Recherche  des noms des champs (y) du formulaire <input type="x" name="y"... />
	 * stockes dans le tableau $this->champs
	 * a l'exception des noms par _cfg_, reserves a ce plugin
	 *
	 * @return string
	 */
	function recuperer_noms_champs(){	
		if (!$this->vue) return;

		// recherche d'au moins un champ de formulaire pour savoir si la vue est valide
		$this->recuperer_fond();
		if (!preg_match_all(
		/*  '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="[^"]*?(?:type_(\w+))?[^"]*?(?:cfg_(\w+))?[^"]*?")?( multiple=)?[^>]*?>#ims', */
		  '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="([^"]*)")?( multiple=)?[^>]*?>#ims',
						$this->fond_compile, $matches, PREG_SET_ORDER)) {
			return _T('cfg:pas_de_champs_dans', array('nom' => $this->vue));
		}
		
		foreach ($matches as $regs) {
			$name = $regs[3];
			if (substr($name, 0, 5) == '_cfg_') continue;

			$this->champs[$name] = array('balise' => $regs[1]); 
			// input type
		    if ($regs[2]) $this->champs[$name]['type'] = $regs[2];
		    // champs tableau[]
			if ($regs[4]) $this->champs[$name]['tableau'] = true;

			//
			// Extensions et validations des champs
			// via les classes css
			//
			// attention : ordre important : <balise (type="xx")? name="xx" class="xx" multiple="xx" />
			//
			if ($regs[5]) {
				$tcss = explode(' ',trim($regs[5]));
				foreach($tcss as $css){
					// classes css type_xx
					if (substr($css,0,5)=='type_') {
						$this->ajouter_extension($css, $name);
					// classes css cfg_xx
					} elseif (substr($css,0,4)=='cfg_') {
						$this->champs[$name]['cfg'] = substr($css,4); // juste 'id' si classe = cfg_id
						$this->ajouter_extension($css, $name);
					}
				}
			}
			
			// cas particulier automatiques : 
			// * input type file => type de verification : fichier
			if (($regs[2] == 'file') AND (!$this->champs[$name]['cfg'])){
				$this->champs[$name]['cfg'] = 'fichier';
				$this->ajouter_extension('cfg_fichier', $name);	
			}
			
	    }

	    return '';
	}	 
	
	/**
	 * ajoute une extension (classe cfg_xx ou type_xx) 
	 * 
	 * ce qui dit a cfg d'executer des fonctions particulieres
	 * si elles existent : ex: cfg_traiter_cfg_xx()
	 * lors de l'appel de 'actionner_extensions($faire)'
	 *
	 * @param string $ext
	 * @param string $nom
	 */
	function ajouter_extension($ext, $nom){
		if (!is_array($this->extensions[$ext])) $this->extensions[$ext] = array();
		$this->extensions[$ext][] = $nom;	
	}

	/**
	 * ajoute une extension sur un parametre
	 * seulement si un fichier sur ce parametre existe
	 *
	 * @param string $param
	 * @return boolean
	 */
	function ajouter_extension_parametre($param){
		if (in_array($param, $this->extensions_parametres))
			return true;
		
		if (find_in_path('cfg/params/'.$param.'.php')){
			$this->extensions_parametres[] = $param;
			return true;
		}
		return false;
	}
	
	/**
	 * Compiler le fond CFG si ce n'est pas fait
	 * 
	 * @param Array $contexte
	 * @param boolean $forcer
	 * @return string
	 */
	function recuperer_fond($contexte = array(), $forcer = false){

		if (!$this->fond_compile OR $forcer){
			include_spip('inc/presentation'); // offrir les fonctions d'espace prive
			include_spip('public/assembler');
			
			// rendre editable systematiquement
			// sinon, ceux qui utilisent les fonds CFG avec l'API des formulaires dynamiques
			// et mettent des [(#ENV**{editable}|oui) ... ] ne verraient pas leurs variables
			// dans l'environnement vu que CFG ne pourrait pas lire les champs du formulaire

			if ($this->depuis_cvt)
				if (!isset($contexte['editable'])) $contexte['editable'] = true; // plante 1.9.2 !!
		
			// passer cfg_id...
			if (!isset($contexte['cfg_id']) && $this->param['cfg_id']) {
				$contexte['cfg_id'] = $this->param['cfg_id'];
			}
			// passer id aussi
			if (!isset($contexte['id']) && $this->param['cfg_id']) {
				$contexte['id'] = $this->param['cfg_id'];
			}
			// passer 'message_ok', 'message_erreur', 'erreurs'	
			if (!isset($contexte['message_ok']) && $this->messages['message_ok']) {
				$contexte['message_ok'] = join('<br />',$this->messages['message_ok']);
			}
			if (!isset($contexte['message_erreur']) && $this->messages['message_erreur']) {
				$contexte['message_erreur'] = join('<br />',$this->messages['message_erreur']);
			}
			if (!isset($contexte['erreurs']) && $this->messages['erreurs']) {
				$contexte['erreurs'] = $this->messages['erreurs'];
			}

			// cas particulier du formulaire generique 'configurer'
			if ($this->vue == 'configurer') {
				if (!isset($contexte['id'])) {
					$contexte['id'] = $this->param['nom'];
				}
			}
						
			$val = $this->val ? array_merge($contexte, $this->val) : $contexte;
	
			// si on est dans l'espace prive, $this->path_vue est
			// de la forme ../plugins/mon_plugin/fonds/toto, d'ou le replace
			$this->fond_compile = recuperer_fond(
				substr($this->path_vue, strlen(_DIR_RACINE)), $val);
		}
		return $this->fond_compile;
	}

	/**
	 * Verifie les autorisations 
	 * d'affichage du formulaire
	 * (parametre autoriser=faire)
	 *
	 * @staticvar int $autoriser
	 * @return int
	 */
	function autoriser()
	{
		static $autoriser=-1;
		if ($autoriser !== -1) return $autoriser;

		// on peut passer 'oui' ou 'non' directement au parametre autoriser
		if ($this->param['autoriser'] == 'oui')
			return $autoriser = 1;
		if ($this->param['autoriser'] == 'non') {
			$this->messages['message_refus'] = $this->param['refus'];
			return $autoriser = 0;
		}
		// sinon, test de l'autorisation
		// <!-- autoriser=webmestre -->
		// <!-- autoriser=configurer -->
		include_spip('inc/autoriser');
		if (!$autoriser = autoriser($this->param['autoriser'])){
			$this->messages['message_refus'] = $this->param['refus'];
		}
		return $autoriser;
	}

	/**
	 * Log le message passe en parametre
	 * $this->log('message');
	 *
	 * @param string $message
	 */
	function log($message)
	{
		($GLOBALS['auteur_session'] && ($qui = $GLOBALS['auteur_session']['login']))
		|| ($qui = $GLOBALS['ip']);
		spip_log('cfg (' . $this->nom_config() . ') par ' . $qui . ': ' . $message);
	}

	/**
	 * lit les donnees depuis le depot
	 * 
	 * @return boolean
	 */
	function lire(){
		list ($ok, $val, $messages) = $this->depot->lire($this->params);
		if ($messages) $this->messages = $messages;
		if ($ok) {
			$this->val = $val;	
		} else {
			$this->messages['message_erreur'][] = _T('cfg:erreur_lecture', array('nom' => $this->nom_config()));
		}
		return $ok;
	}
	
	
	/**
	 * Ecrit les donnees dans le depot
	 *
	 * @return string
	 */
	function ecrire() {
		list ($ok, $val, $messages) = $this->depot->ecrire($this->params);
		if ($messages) $this->messages = $messages;
		if ($ok){
			$this->val = $val;
			$this->messages['message_ok'][] = $msg = _T('cfg:config_enregistree', array('nom' => $this->nom_config()));
		} else {
			$this->messages['message_erreur'][] = $msg =  _T('cfg:erreur_enregistrement', array('nom' => $this->nom_config()));
		}
		$this->log($msg . ' ' . $this->log_modif);
		return $msg;
	}

	/**
	 * Efface les donnees dans le depot
	 *
	 * dans le cas d'une suppression, il faut vider $this->val qui
	 * contient encore les valeurs du formulaire, sinon elles sont
	 * passees dans le fond et le formulaire garde les informations
	 * d'avant la suppression
	 *
	 * @return string
	 */
	function effacer(){
		list ($ok, $val, $messages) = $this->depot->effacer($this->params);
		if ($messages) $this->messages = $messages;
		if ($ok) {
			$this->val = $val;
			$this->messages['message_ok'][] = $msg = _T('cfg:config_supprimee', array('nom' => $this->nom_config()));
		} else {
			$this->messages['message_erreur'][] = $msg = _T('cfg:erreur_suppression', array('nom' => $this->nom_config()));
		}
		$this->log($msg);	
		return $msg;	
	}

	/**
	 * Fabriquer les balises des champs d'apres un modele fonds/cfg_<driver>.html
	 * $contexte est un tableau (nom=>valeur)
	 * qui sera enrichi puis passe a recuperer_fond
	 *
	 * @param Array $contexte
	 * @return string
	 */
	function formulaire($contexte = array())
	{
		if (!$this->path_vue)
			return '';

		if (!$this->depuis_cvt)
			$contexte['_cfg_'] = $this->creer_hash_cfg();
	
		// recuperer le fond avec le contexte
		// forcer le calcul.
		$this->recuperer_fond($contexte, true);
		$this->recuperer_parametres();
		//$this->effacer_parametres(); // pour enlever les <!-- param=valeur --> ... sans dedoubler le contenu lorsque ce sont des tableau (param*=valeur)
		return $this->fond_compile;
	}
	
	
	/**
	 *
	 * @param string $action
	 * @return string
	 */
	function creer_hash_cfg($action=''){
		include_spip('inc/securiser_action');
	    $arg = 'cfg0.0.0-' . $this->param['nom'] . '-' . $this->vue;
		return 
			'?cfg=' . $this->vue .
			'&cfg_id=' . $this->param['cfg_id'] .
		    '&arg=' . $arg .
		    '&hash=' .  calculer_action_auteur($action . '-' . $arg);		
	}
	
	
	/**
	 * teste et charge les points d'entrees de CFG a travers certaines actions
	 *
	 * <ol>
	 * <li> : fonctions generales cfg_{nom}_{action}</li>
	 * <li> : actions sur les types de champs particuliers
	 *     notifies par 'type_XX' ou 'cfg_YY' sur les classes css
	 *     s'ils existent dans /cfg/classes/ par des fonctions
	 *     cfg_{action}_{classe}</li>
	 * <li> : actions en fonctions des parametres du formulaire
	 *     s'ils existent dans /cfg/params/ par des fonctions
	 *     cfg_{action}_{parametre}</li>
	 * </ol>
	 *
	 * les actions possibles sont :
	 * - pre_charger, charger,
	 * - pre_verifier, verifier,
	 * - pre_traiter, post_traiter
	 *
	 * @param string $action
	 */
	function actionner_extensions($action){
		// 1 - general : on transmet l'instance de cfg_formulaire
		if (function_exists($f = 'cfg_' . $this->vue . '_' . $action)) {
			$res = $f($this);
			// compat ascendante (1.7 a 1.10.2) : verifier retournait un array comme cvt
			// il faut envoyer le resultat dans la fonction d'ajout des erreurs
			if ($action == 'verifier' AND is_array($res))
				$this->ajouter_erreurs($res);
		} 
		// 2 - type de champ : on transmet le nom du champ et l'instance de cfg_formulaire
		if ($this->extensions) {
			foreach ($this->extensions as $type => $champs){
				// si un fichier de ce type existe, on lance la fonction 
				// demandee pour chaque champs possedant la classe css en question
				if (include_spip('cfg/classes/'.$type)) {
					foreach ($champs as $champ){
						if (function_exists($f = 'cfg_' . $action . '_' . $type)){ // absence possible normale
							$f($champ, $this);
						}
					}
				}	
			}
		}
		// 3 - parametre : on transmet la valeur du parametre et l'instance de cfg_formulaire
		if ($this->extensions_parametres){
			foreach ($this->extensions_parametres as $param){
				if (include_spip('cfg/params/'.$param)) {
					if (function_exists($f = 'cfg_' . $action . '_param_' . $param)){ // absence possible normale
						// artillerie lourde on passe
						// la valeur et la classe
						$f($this->param[$param], $this);						
					}
				}
			}
		}
	}
	
	/**
	 *callback pour interpreter les parametres objets du formulaire
	 * commun avec celui de set_vue()
	 *
	 * Parametres :
	 * - $regs[2] = 'parametre'
	 * - $regs[3] = '*' ou ''
	 * - $regs[4] = 'valeur'
	 *
	 * Lorsque des parametres sont passes dans le formulaire
	 * par <!-- param=valeur --><br>
	 * stocker $this->param['parametre']=valeur
	 *
	 * Si <!-- param*=valeur --><br>
	 * Stocker $this->param['parametre'][]=valeur
	 *
	 * @param Array $regs
	 * @return string
	 */
	function post_params($regs) {

		// $regs[3] peut valoir '*' pour signaler un tableau
		$regs[4] = trim($regs[4]);
		
		if (empty($regs[3])) {
		    $this->param[$regs[2]] = $regs[4];
		} elseif (is_array($this->param[$regs[2]])) {
		    $this->param[$regs[2]][] = $regs[4];
		}
		// plus besoin de garder ca
		return '';
	}
}

?>