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_formulaire.php 46896 2011-04-20 11:05:37Z marcimat@rezo.net $
15 if (!defined("_ECRIRE_INC_VERSION")) return;
20 * la classe cfg represente une page de configuration
28 * les parametres des formulaires cfg sont stockes dans cet objet
34 * l'objet de classe cfg_depot qui assure lecture/ecriture/effacement des config
40 * le fond html utilise , en general pour config simple idem $nom
46 * l'adresse du fond html (sans l'extension .html)
52 * provient-on d'un formulaire de type CVT (charger/verifier/traiter) dans formulaires/ ?
55 var $depuis_cvt = false;
58 * compte-rendu des mises a jour
61 var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array());
64 * les champs trouve dans le fond
67 var $champs = array();
73 var $champs_id = array();
82 * pour tracer les valeurs modifiees
88 * contenu du fichier de formulaire
94 * stockage du fond compile par recuperer_fond()
97 var $fond_compile = '';
100 * y a t-il des extensions (classes css 'type_{nom}' ou 'cfg_{nom}' sur champs) a traiter ?
103 var $extensions = array();
106 * Alias pour passer facilement les parametres aux classes appelees
109 var $params = array();
112 * Constructeur de la classe
115 * @param string $cfg_id
118 function cfg_formulaire($nom, $cfg_id = '', $opt = array())
120 $this->param
= array(
121 'afficher_messages' => true, // afficher ce compte rendu ?
122 'autoriser' => 'configurer', // le "faire" de autoriser($faire), par defaut, autoriser_configurer_dist()
123 'autoriser_absence_id' => 'non', // autoriser l'insertion de nouveau contenu dans une table sans donner d'identifiant ?
124 'casier' => '', // sous tableau optionel du meta ou va etre stocke le fragment de config
125 'cfg_id' => '', // pour une config multiple , l'id courant
126 'descriptif' => '', // descriptif
127 'depot' => 'metapack', // (ancien 'storage') le depot utilise pour stocker les donnees, par defaut metapack: spip_meta serialise
128 'fichier' => '', // pour storage php, c'est l'adresse du fichier (depuis la racine de spip), sinon ca prend /local/cfg/nom.php
129 'gauche' => '', // pour une colonne à gauche
130 'head' => '', // partie du fond cfg a inserer dans le head par le pipeline header_prive (todo insert_head?)
131 'icone' => '', // lien pour une icone
132 'inline' => '', // code qui sera insere apres le contenu du fond (peut servir pour inserer du js)
133 '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.
134 'liens' => array(), // liens optionnels sur des sous-config <!-- liens*=xxx -->
135 'liens_multi' => array(), // liens optionnels sur des sous-config pour des fonds utilisant un champ multiple <!-- liens_multi*=xxx -->
136 'nom' => '', // le nom du meta (ou autre) ou va etre stocke la config concernee
137 'onglet' => 'oui', // cfg doit-il afficher un lien vers le fond sous forme d'onglet dans la page ?exec=cfg
138 'presentation' => 'auto', // cfg doit-il encadrer le formulaire tout seul ?
139 'refus' => '', // en cas de refus d'autorisation, un message informatif [(#REM) refus=...]
140 'table' => '', // nom de la table sql pour storage extra ou table
142 $this->param
['nom'] = $this->vue
= $nom;
143 $this->param
['cfg_id'] = $cfg_id;
145 // exception flagrante : le formulaire 'configurer'
146 // si c'est un formulaire generique, le nom et l'id ne sont pas bon.
147 if ($this->vue
== 'configurer') {
148 $this->param
['nom'] = $cfg_id;
149 $this->param
['cfg_id'] = '';
152 // definition de l'alias params
153 $this->params
= array(
154 'champs' => &$this->champs
,
155 'champs_id' => &$this->champs_id
,
156 'messages' => &$this->messages
,
157 'val' => &$this->val
,
158 'param' => &$this->param
161 foreach ($opt as $o=>$v) {
164 // charger les donnees du fond demande
169 * retourne true en cas d'erreur...
174 return $this->messages
['erreurs'] ||
$this->messages
['message_erreur'];
178 * ajoute une erreur sur un champ donne
180 * @param string $champ
181 * @param string $message
183 function ajouter_erreur($champ, $message) {
184 $this->messages
['erreurs'][$champ] = isset($this->messages
['erreurs'][$champ])
185 ?
$this->messages
['erreurs'][$champ] .= '<br />' . $message
190 * ajoute des erreurs sur les champs indiques dans le tableau
191 * (comme verifier de cvt)
196 function ajouter_erreurs($err) {
197 if (!is_array($err)) return false;
198 if (isset($err['message_erreur']) && $err['message_erreur'])
199 $this->messages
['message_erreur'][] = $err['message_erreur'];
200 if (isset($err['message_ok']) && $err['message_ok'])
201 $this->messages
['message_ok'][] = $err['message_ok'];
202 unset($err['message_erreur'], $err['message_ok']);
203 if ($err) $this->messages
['erreurs'] = $err; // ou un merge ?? //
209 * pre-analyser le formulaire,
210 * c'est a dire recuperer les parametres CFG
211 * et les noms des champs du formulaire
218 // si pas de fichier, rien a charger
219 if (!$this->vue
) return false;
221 // lecture de la vue (fond cfg)
222 // il s'agit de recuperer le contenu du fichier
223 if (!$fichier = find_in_path($nom = 'fonds/cfg_' . $this->vue
.'.html')){
224 if ($fichier = find_in_path($nom = 'formulaires/' . $this->vue
.'.html'))
225 $this->depuis_cvt
= true;
228 // si pas de fichier, rien a charger
229 if (!$fichier) return false;
231 if (!lire_fichier($fichier, $this->controldata
)) {
233 $this->messages
['message_erreur'][] = _T('cfg:erreur_lecture', array('nom' => $nom));
235 $this->path_vue
= substr($fichier,0,-5);
238 // recherche et stockage des parametres de cfg
239 $this->recuperer_parametres();
241 // si le fond ne doit pas etre calcule comme un fond CFG,
242 // on s'arrete ici. De cette maniere, CFG ne prendra pas
243 // comme des champs a recuperer les champs issus d'un autre formulaire
244 // CFG inclu depuis un formulaire CVT via #FORMULAIRE_XX
245 if ($this->param
['interpreter'] == 'non')
248 // recherche et stockage des noms de champs de formulaire
249 if ($err = $this->recuperer_noms_champs()){
251 $this->messages
['message_erreur'][] = $err;
254 // charger les champs particuliers si existants
255 $this->actionner_extensions('pre_charger');
257 // creer le storage et lire les valeurs
258 $this->param
['depot'] = strtolower(trim($this->param
['depot']));
259 include_spip('inc/cfg_config');
260 $this->depot
= new cfg_depot($this->param
['depot'], $this->params
);
261 $ok &= $this->lire();
263 // charger les champs particuliers si existants
264 $this->actionner_extensions('charger');
270 * Doit controler la validite des valeurs transmises
272 * Verifie les valeurs postees.
273 * - stocke les valeurs qui ont changees dans $this->val[$nom_champ] = 'nouvelle_valeur'
274 * - verifie que les types de valeurs attendus sont corrects ($this->verifier_champs_types)
276 * retourne les messages d'erreur
277 * @return boolean|string
279 function verifier() {
281 if ($this->erreurs() ||
!$this->autoriser())
284 // si on a pas poste de formulaire, pas la peine de controler
285 // ce qui mettrait de fausses valeurs dans l'environnement
286 if (!_request('_cfg_ok') && !_request('_cfg_delete')) return true;
288 // les formulaires CVT ont deja leurs securites
289 if (!$this->depuis_cvt
) {
290 $securiser_action = charger_fonction('securiser_action', 'inc');
294 // actions par champs speciaux, avant les tests des nouvelles valeurs
295 $this->actionner_extensions('pre_verifier');
297 // stockage des nouvelles valeurs
298 foreach ($this->champs
as $name => $def) {
299 // enregistrement des valeurs postees
300 $oldval = $this->val
[$name];
301 $this->val
[$name] = _request($name);
303 // tracer les modifications
304 if ($oldval != $this->val
[$name]) {
305 $this->log_modif
.= $name . ':' . var_export($oldval, true) . '/' . var_export($this->val
[$name], true) .', ';
309 // si pas de changement, pas la peine de continuer
310 if (!$this->log_modif
&& !_request('_cfg_delete')) {
311 $this->messages
['message_erreur'][] = _T('cfg:pas_de_changement', array('nom' => $this->nom_config()));
315 // verifier la validite des champs speciaux (cfg_xx, type_xx)
316 $this->actionner_extensions('verifier');
318 // stocker le fait que l'on a controle les valeurs
319 $this->verifier
= true;
320 return !$this->erreurs();
324 * Gere le traitement du formulaire.
326 * Si le chargement ou le controle n'ont pas ete fait,
327 * la fonction s'en occupe.
333 if (!$this->verifier
) $this->verifier();
335 if ($this->erreurs() ||
!$this->autoriser()) return false;
337 if (!_request('_cfg_ok') && !_request('_cfg_delete')) return false;
339 // les formulaires CVT ont deja leurs securites
340 if (!$this->depuis_cvt
) {
341 $securiser_action = charger_fonction('securiser_action', 'inc');
345 $this->actionner_extensions('pre_traiter');
347 if ($this->erreurs()) return false;
350 if (_request('_cfg_delete')) {
353 // sinon modification
358 // pipeline 'cfg_post_edition' ? (quelqu'un utilise ??)
359 $this->messages
= pipeline('cfg_post_edition',array('args'=>array('nom_config'=>$this->nom_config()),'data'=>$this->messages
));
361 $this->actionner_extensions('post_traiter');
363 // annuler le cache de SPIP
364 include_spip('inc/invalideur');
365 suivre_invalideur('cfg/' . $this->param
['nom'] .
366 ($this->param
['casier'] ?
'/' . $this->param
['casier'] : '') .
367 ($this->param
['cfg_id'] ?
'/' . $this->param
['cfg_id'] : ''));
371 * Determine l'arborescence ou CFG doit chercher les valeurs deja enregistrees
373 * si nom=toto, casier=chose/truc, cfg_id=2,
374 * cfg cherchera dans #CONFIG{toto/chose/truc/2}
378 function nom_config()
380 return $this->param
['nom'] .
381 ($this->param
['casier'] ?
'/' . $this->param
['casier'] : '') .
382 ($this->param
['cfg_id'] ?
'/' . $this->param
['cfg_id'] : '');
386 * Recherche et stockage
387 * des parametres #REM passes a CFG
389 * @deprecated (DEPRECIE)
391 function recuperer_parametres_rem(){
392 // cas de #REM (deprecie)
393 preg_replace_callback('/(\[\(#REM\) ([a-z0-9_]\w+)(\*)?=)(.*?)\]/sim',
394 array(&$this, 'post_params'), $this->controldata
);
398 * cette fonction recherche et stocke les parametres passes a cfg par <!-- param=valeur -->
399 * ces lignes sont alors effacees du code html. Ces proprietes sont lues apres recuperer_fond(),
400 * et interpretent donc les balises spip et les chaines de langues
402 * si la fonction est appelee 2 fois, les parametres identiques ne seront pas copies
403 * sauf si le parametre est un tableau (<!-- param*=valeur -->), les valeurs seront dupliquees
405 function recuperer_parametres(){
407 // pour compatibilite, recuperer l'ancien code #REM
408 $this->recuperer_parametres_rem();
410 $this->recuperer_fond();
411 $this->fond_compile
= preg_replace_callback('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim',
412 array(&$this, 'post_params'), $this->fond_compile
);
414 // s'il en reste : il y a un probleme !
415 // est-ce utile de tester ça ?
416 if (preg_match('/<!-- [a-z0-9_]\w+\*?=/', $this->fond_compile
)) {
417 die('Un parametre CFG n\'a pas pu etre importe depuis '.$this->vue
);
420 // pour compatibilite avec les anciennes versions (<1.4.1)
421 if (isset($this->param
['storage']))
422 $this->param
['depot'] = $this->param
['storage'];
424 if ($this->param
['depot'] == 'classic')
425 $this->param
['depot'] = 'meta';
427 if ($this->param
['depot'] == 'extrapack'){
428 $this->param
['depot'] = 'tablepack';
429 $this->param
['colonne'] = 'extra';
430 $this->param
['table'] = 'spip_auteurs';
433 // definir les parametres qui sont a traiter comme des extensions
434 // il faut que le parametre ne soit pas vide et qu'un fichier
435 // /cfg/params/{param}.php existe
436 $this->extensions_parametres
= array();
437 foreach ($this->param
as $nom=>$val){
438 if ($val) $this->ajouter_extension_parametre($nom);
443 * une fonction pour effacer les parametres du code html
444 * ce qui evite de dupliquer les tableaux
445 * (si on utilisait recuperer_parametres() a la place)
447 function effacer_parametres(){
448 $this->fond_compile
= preg_replace('/(<!-- ([a-z0-9_]\w+)(\*)?=)(.*?)-->/sim', '', $this->fond_compile
);
452 * Recherche des noms des champs (y) du formulaire <input type="x" name="y"... />
453 * stockes dans le tableau $this->champs
454 * a l'exception des noms par _cfg_, reserves a ce plugin
458 function recuperer_noms_champs(){
459 if (!$this->vue
) return;
461 // recherche d'au moins un champ de formulaire pour savoir si la vue est valide
462 $this->recuperer_fond();
464 /* '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="[^"]*?(?:type_(\w+))?[^"]*?(?:cfg_(\w+))?[^"]*?")?( multiple=)?[^>]*?>#ims', */
465 '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="([^"]*)")?( multiple=)?[^>]*?>#ims',
466 $this->fond_compile
, $matches, PREG_SET_ORDER
)) {
467 return _T('cfg:pas_de_champs_dans', array('nom' => $this->vue
));
470 foreach ($matches as $regs) {
472 if (substr($name, 0, 5) == '_cfg_') continue;
474 $this->champs
[$name] = array('balise' => $regs[1]);
476 if ($regs[2]) $this->champs
[$name]['type'] = $regs[2];
478 if ($regs[4]) $this->champs
[$name]['tableau'] = true;
481 // Extensions et validations des champs
482 // via les classes css
484 // attention : ordre important : <balise (type="xx")? name="xx" class="xx" multiple="xx" />
487 $tcss = explode(' ',trim($regs[5]));
488 foreach($tcss as $css){
489 // classes css type_xx
490 if (substr($css,0,5)=='type_') {
491 $this->ajouter_extension($css, $name);
492 // classes css cfg_xx
493 } elseif (substr($css,0,4)=='cfg_') {
494 $this->champs
[$name]['cfg'] = substr($css,4); // juste 'id' si classe = cfg_id
495 $this->ajouter_extension($css, $name);
500 // cas particulier automatiques :
501 // * input type file => type de verification : fichier
502 if (($regs[2] == 'file') AND (!$this->champs
[$name]['cfg'])){
503 $this->champs
[$name]['cfg'] = 'fichier';
504 $this->ajouter_extension('cfg_fichier', $name);
513 * ajoute une extension (classe cfg_xx ou type_xx)
515 * ce qui dit a cfg d'executer des fonctions particulieres
516 * si elles existent : ex: cfg_traiter_cfg_xx()
517 * lors de l'appel de 'actionner_extensions($faire)'
522 function ajouter_extension($ext, $nom){
523 if (!is_array($this->extensions
[$ext])) $this->extensions
[$ext] = array();
524 $this->extensions
[$ext][] = $nom;
528 * ajoute une extension sur un parametre
529 * seulement si un fichier sur ce parametre existe
531 * @param string $param
534 function ajouter_extension_parametre($param){
535 if (in_array($param, $this->extensions_parametres
))
538 if (find_in_path('cfg/params/'.$param.'.php')){
539 $this->extensions_parametres
[] = $param;
546 * Compiler le fond CFG si ce n'est pas fait
548 * @param Array $contexte
549 * @param boolean $forcer
552 function recuperer_fond($contexte = array(), $forcer = false){
554 if (!$this->fond_compile
OR $forcer){
555 include_spip('inc/presentation'); // offrir les fonctions d'espace prive
556 include_spip('public/assembler');
558 // rendre editable systematiquement
559 // sinon, ceux qui utilisent les fonds CFG avec l'API des formulaires dynamiques
560 // et mettent des [(#ENV**{editable}|oui) ... ] ne verraient pas leurs variables
561 // dans l'environnement vu que CFG ne pourrait pas lire les champs du formulaire
563 if ($this->depuis_cvt
)
564 if (!isset($contexte['editable'])) $contexte['editable'] = true; // plante 1.9.2 !!
567 if (!isset($contexte['cfg_id']) && $this->param
['cfg_id']) {
568 $contexte['cfg_id'] = $this->param
['cfg_id'];
571 if (!isset($contexte['id']) && $this->param
['cfg_id']) {
572 $contexte['id'] = $this->param
['cfg_id'];
574 // passer 'message_ok', 'message_erreur', 'erreurs'
575 if (!isset($contexte['message_ok']) && $this->messages
['message_ok']) {
576 $contexte['message_ok'] = join('<br />',$this->messages
['message_ok']);
578 if (!isset($contexte['message_erreur']) && $this->messages
['message_erreur']) {
579 $contexte['message_erreur'] = join('<br />',$this->messages
['message_erreur']);
581 if (!isset($contexte['erreurs']) && $this->messages
['erreurs']) {
582 $contexte['erreurs'] = $this->messages
['erreurs'];
585 // cas particulier du formulaire generique 'configurer'
586 if ($this->vue
== 'configurer') {
587 if (!isset($contexte['id'])) {
588 $contexte['id'] = $this->param
['nom'];
592 $val = $this->val ?
array_merge($contexte, $this->val
) : $contexte;
594 // si on est dans l'espace prive, $this->path_vue est
595 // de la forme ../plugins/mon_plugin/fonds/toto, d'ou le replace
596 $this->fond_compile
= recuperer_fond(
597 substr($this->path_vue
, strlen(_DIR_RACINE
)), $val);
599 return $this->fond_compile
;
603 * Verifie les autorisations
604 * d'affichage du formulaire
605 * (parametre autoriser=faire)
607 * @staticvar int $autoriser
612 static $autoriser=-1;
613 if ($autoriser !== -1) return $autoriser;
615 // on peut passer 'oui' ou 'non' directement au parametre autoriser
616 if ($this->param
['autoriser'] == 'oui')
617 return $autoriser = 1;
618 if ($this->param
['autoriser'] == 'non') {
619 $this->messages
['message_refus'] = $this->param
['refus'];
620 return $autoriser = 0;
622 // sinon, test de l'autorisation
623 // <!-- autoriser=webmestre -->
624 // <!-- autoriser=configurer -->
625 include_spip('inc/autoriser');
626 if (!$autoriser = autoriser($this->param
['autoriser'])){
627 $this->messages
['message_refus'] = $this->param
['refus'];
633 * Log le message passe en parametre
634 * $this->log('message');
636 * @param string $message
638 function log($message)
640 ($GLOBALS['auteur_session'] && ($qui = $GLOBALS['auteur_session']['login']))
641 ||
($qui = $GLOBALS['ip']);
642 spip_log('cfg (' . $this->nom_config() . ') par ' . $qui . ': ' . $message);
646 * lit les donnees depuis le depot
651 list ($ok, $val, $messages) = $this->depot
->lire($this->params
);
652 if ($messages) $this->messages
= $messages;
656 $this->messages
['message_erreur'][] = _T('cfg:erreur_lecture', array('nom' => $this->nom_config()));
663 * Ecrit les donnees dans le depot
668 list ($ok, $val, $messages) = $this->depot
->ecrire($this->params
);
669 if ($messages) $this->messages
= $messages;
672 $this->messages
['message_ok'][] = $msg = _T('cfg:config_enregistree', array('nom' => $this->nom_config()));
674 $this->messages
['message_erreur'][] = $msg = _T('cfg:erreur_enregistrement', array('nom' => $this->nom_config()));
676 $this->log($msg . ' ' . $this->log_modif
);
681 * Efface les donnees dans le depot
683 * dans le cas d'une suppression, il faut vider $this->val qui
684 * contient encore les valeurs du formulaire, sinon elles sont
685 * passees dans le fond et le formulaire garde les informations
686 * d'avant la suppression
691 list ($ok, $val, $messages) = $this->depot
->effacer($this->params
);
692 if ($messages) $this->messages
= $messages;
695 $this->messages
['message_ok'][] = $msg = _T('cfg:config_supprimee', array('nom' => $this->nom_config()));
697 $this->messages
['message_erreur'][] = $msg = _T('cfg:erreur_suppression', array('nom' => $this->nom_config()));
704 * Fabriquer les balises des champs d'apres un modele fonds/cfg_<driver>.html
705 * $contexte est un tableau (nom=>valeur)
706 * qui sera enrichi puis passe a recuperer_fond
708 * @param Array $contexte
711 function formulaire($contexte = array())
713 if (!$this->path_vue
)
716 if (!$this->depuis_cvt
)
717 $contexte['_cfg_'] = $this->creer_hash_cfg();
719 // recuperer le fond avec le contexte
721 $this->recuperer_fond($contexte, true);
722 $this->recuperer_parametres();
723 //$this->effacer_parametres(); // pour enlever les <!-- param=valeur --> ... sans dedoubler le contenu lorsque ce sont des tableau (param*=valeur)
724 return $this->fond_compile
;
730 * @param string $action
733 function creer_hash_cfg($action=''){
734 include_spip('inc/securiser_action');
735 $arg = 'cfg0.0.0-' . $this->param
['nom'] . '-' . $this->vue
;
737 '?cfg=' . $this->vue
.
738 '&cfg_id=' . $this->param
['cfg_id'] .
740 '&hash=' . calculer_action_auteur($action . '-' . $arg);
745 * teste et charge les points d'entrees de CFG a travers certaines actions
748 * <li> : fonctions generales cfg_{nom}_{action}</li>
749 * <li> : actions sur les types de champs particuliers
750 * notifies par 'type_XX' ou 'cfg_YY' sur les classes css
751 * s'ils existent dans /cfg/classes/ par des fonctions
752 * cfg_{action}_{classe}</li>
753 * <li> : actions en fonctions des parametres du formulaire
754 * s'ils existent dans /cfg/params/ par des fonctions
755 * cfg_{action}_{parametre}</li>
758 * les actions possibles sont :
759 * - pre_charger, charger,
760 * - pre_verifier, verifier,
761 * - pre_traiter, post_traiter
763 * @param string $action
765 function actionner_extensions($action){
766 // 1 - general : on transmet l'instance de cfg_formulaire
767 if (function_exists($f = 'cfg_' . $this->vue
. '_' . $action)) {
769 // compat ascendante (1.7 a 1.10.2) : verifier retournait un array comme cvt
770 // il faut envoyer le resultat dans la fonction d'ajout des erreurs
771 if ($action == 'verifier' AND is_array($res))
772 $this->ajouter_erreurs($res);
774 // 2 - type de champ : on transmet le nom du champ et l'instance de cfg_formulaire
775 if ($this->extensions
) {
776 foreach ($this->extensions
as $type => $champs){
777 // si un fichier de ce type existe, on lance la fonction
778 // demandee pour chaque champs possedant la classe css en question
779 if (include_spip('cfg/classes/'.$type)) {
780 foreach ($champs as $champ){
781 if (function_exists($f = 'cfg_' . $action . '_' . $type)){ // absence possible normale
788 // 3 - parametre : on transmet la valeur du parametre et l'instance de cfg_formulaire
789 if ($this->extensions_parametres
){
790 foreach ($this->extensions_parametres
as $param){
791 if (include_spip('cfg/params/'.$param)) {
792 if (function_exists($f = 'cfg_' . $action . '_param_' . $param)){ // absence possible normale
793 // artillerie lourde on passe
794 // la valeur et la classe
795 $f($this->param
[$param], $this);
803 *callback pour interpreter les parametres objets du formulaire
804 * commun avec celui de set_vue()
807 * - $regs[2] = 'parametre'
808 * - $regs[3] = '*' ou ''
809 * - $regs[4] = 'valeur'
811 * Lorsque des parametres sont passes dans le formulaire
812 * par <!-- param=valeur --><br>
813 * stocker $this->param['parametre']=valeur
815 * Si <!-- param*=valeur --><br>
816 * Stocker $this->param['parametre'][]=valeur
821 function post_params($regs) {
823 // $regs[3] peut valoir '*' pour signaler un tableau
824 $regs[4] = trim($regs[4]);
826 if (empty($regs[3])) {
827 $this->param
[$regs[2]] = $regs[4];
828 } elseif (is_array($this->param
[$regs[2]])) {
829 $this->param
[$regs[2]][] = $regs[4];
831 // plus besoin de garder ca