source: spip-zone/_plugins_/saisies/formulaires/construire_formulaire.php @ 57414

Last change on this file since 57414 was 57414, checked in by marcimat@…, 8 years ago

Quelques corrections pour permettre d'utiliser "afficher_si" dans le constructeur de formulaire (particulièrement dans la configuration d'une saisie) :

  • identifier chaque saisie du formulaire de configuration
  • limiter le $ a jQuery
  • utiliser de préférence l'identification de la saisie dans le js de afficher si s'il est connu
  • ne pas utiliser |interdire_script sur inserer_fin ( donc) qui ajoute le js du coup avec le constructeur de formulaire, sinon évidemnent le js ne s'execute pas...
  • permettre de rechercher des name sous forme de tableau pour affciher si (options[nom]) par exemple.
File size: 16.0 KB
Line 
1<?php
2
3// Sécurité
4if (!defined("_ECRIRE_INC_VERSION")) return;
5
6function formulaires_construire_formulaire_charger($identifiant, $formulaire_initial=array(), $options=array()){
7        include_spip('inc/saisies');
8        $contexte = array();
9       
10        // On ajoute un préfixe devant l'identifiant, pour être sûr
11        $identifiant = 'constructeur_formulaire_'.$identifiant;
12        $contexte['_identifiant_session'] = $identifiant;
13       
14        // On vérifie ce qui a été passé en paramètre
15        if (!is_array($formulaire_initial)) $formulaire_initial = array();
16       
17        // On initialise la session si elle est vide
18        if (is_null($formulaire_actuel = session_get($identifiant))){
19                session_set($identifiant, $formulaire_initial);
20                $formulaire_actuel = $formulaire_initial;
21        }
22       
23        // Si le formulaire actuel est différent du formulaire initial on agite un drapeau pour le dire
24        if ($formulaire_actuel != $formulaire_initial){
25                $contexte['formulaire_modifie'] = true;
26        }
27        $contexte['_message_attention'] = _T('saisies:construire_attention_modifie');
28       
29        // On passe ça pour l'affichage
30        $contexte['_contenu'] = $formulaire_actuel;
31        // On passe ça pour la récup plus facile des champs
32        $contexte['_saisies_par_nom'] = saisies_lister_par_nom($formulaire_actuel);
33        // Pour déclarer les champs modifiables à CVT
34        foreach(array_keys($contexte['_saisies_par_nom']) as $nom){
35                $contexte["saisie_modifiee_$nom"] = array();
36        }
37       
38        // La liste des saisies
39        $saisies_disponibles = saisies_lister_disponibles();
40        $contexte['_saisies_disponibles'] = $saisies_disponibles;
41       
42        $contexte['fond_generer'] = 'formulaires/inc-generer_saisies_configurables';
43       
44        return $contexte;
45}
46
47function formulaires_construire_formulaire_verifier($identifiant, $formulaire_initial=array(), $options=array()){
48        include_spip('inc/saisies');
49        $erreurs = array();
50
51        // Pas d'erreur si l'on ne demande rien
52        if (!($nom_ou_id = $configurer_saisie  = _request('configurer_saisie')
53        OR    $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))) {
54                return $erreurs;
55        }
56
57        // On ajoute un préfixe devant l'identifiant
58        $identifiant = 'constructeur_formulaire_'.$identifiant;
59        // On récupère le formulaire à son état actuel
60        $formulaire_actuel = session_get($identifiant);
61
62        // On récupère les saisies actuelles, par identifiant ou par nom
63        if ($nom_ou_id[0] == '@') {
64                $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
65                $nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
66        } else {
67                $saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
68                $nom = $nom_ou_id;
69        }
70        $noms_autorises = array_keys($saisies_actuelles);
71
72        // le nom (ou identifiant) doit exister
73        if (!in_array($nom_ou_id, $noms_autorises)) {
74                return $erreurs;
75        }
76       
77        // La liste des saisies
78        $saisies_disponibles = saisies_lister_disponibles();
79       
80        $saisie = $saisies_actuelles[$nom_ou_id];
81        $formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
82        array_walk_recursive($formulaire_config, 'formidable_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
83        $formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
84        $formulaire_config = $formulaire_config['saisies'];
85       
86        // Si la saisie possede un identifiant, on l'ajoute
87        // au formulaire de configuration pour ne pas le perdre en route
88        if (isset($saisie['identifiant']) and $saisie['identifiant']) {
89                $formulaire_config = saisies_inserer(
90                        $formulaire_config,
91                        array(
92                                'saisie' => 'hidden',
93                                'options' => array(
94                                        'nom' => "saisie_modifiee_${nom}[identifiant]",
95                                        'defaut' => $saisie['identifiant']
96                                ),
97                        )
98                );
99        }
100       
101        // S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
102        if ($options['modifier_nom'] and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true)){
103                $chemin_nom[] = 'saisies';
104                $chemin_nom[] = '0';
105
106                $formulaire_config = saisies_inserer(
107                        $formulaire_config,
108                        array(
109                                'saisie' => 'input',
110                                'options' => array(
111                                        'nom' => "saisie_modifiee_${nom}[options][nom]",
112                                        'label' => _T('saisies:option_nom_label'),
113                                        'explication' => _T('saisies:option_nom_explication'),
114                                        'obligatoire' => 'oui',
115                                        'size' => 50
116                                ),
117                                'verifier' => array(
118                                        'type' => 'regex',
119                                        'options' => array(
120                                                'modele' => '/^[\w]+$/'
121                                        )
122                                )
123                        ),
124                        $chemin_nom
125                );
126        }
127       
128        // S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
129        if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)){
130                include_spip('inc/verifier');
131                $liste_verifications = verifier_lister_disponibles();
132                $chemin_validation[] = 'saisies';
133                $chemin_validation[] = 1000000; // à la fin
134               
135                // On construit la saisie à insérer et les fieldset des options
136                $saisie_liste_verif = array(
137                        'saisie' => 'selection',
138                        'options' => array(
139                                'nom' => "saisie_modifiee_${nom}[verifier][type]",
140                                'label' => _T('saisies:construire_verifications_label'),
141                                'option_intro' => _T('saisies:construire_verifications_aucune'),
142                                'li_class' => 'liste_verifications',
143                                'datas' => array()
144                        )
145                );
146                $verif_options = array();
147                foreach ($liste_verifications as $type_verif => $verif){
148                        $saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre'];
149                        // Si le type de vérif a des options, on ajoute un fieldset
150                        if ($verif['options'] and is_array($verif['options'])){
151                                $groupe = array(
152                                        'saisie' => 'fieldset',
153                                        'options' => array(
154                                                'nom' => 'options',
155                                                'label' => $verif['titre'],
156                                                'li_class' => "$type_verif options_verifier"
157                                        ),
158                                        'saisies' => $verif['options']
159                                );
160                                array_walk_recursive($groupe, 'formidable_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
161                                $verif_options[$type_verif] = $groupe;
162                        }
163                }
164                $verif_options = array_merge(array($saisie_liste_verif), $verif_options);
165        }
166       
167       
168        if ($enregistrer_saisie){
169                // La saisie modifié
170                $saisie_modifiee = _request("saisie_modifiee_${nom}");
171                // On cherche les erreurs de la configuration
172                $vraies_erreurs = saisies_verifier($formulaire_config);
173                // Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
174                if ($options['modifier_nom'] and $options['nom_unique']){
175                        $nom_modifie = $saisie_modifiee['options']['nom'];
176                        if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie))
177                                $vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
178                }
179                // On regarde s'il a été demandé un type de vérif
180                if (($type_verif = $saisie_modifiee['verifier']['type']) != '' and $verif_options[$type_verif]){
181                        // On ne vérifie que les options du type demandé
182                        $vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
183                }
184        }
185       
186        // On insère chaque saisie des options de verification
187        if ($verif_options){
188                foreach ($verif_options as $saisie_verif){
189                        $formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
190                }
191        }
192        $erreurs['configurer_'.$nom] = $formulaire_config;
193        $erreurs['positionner'] = '#configurer_'.$nom;
194       
195        if ($enregistrer_saisie) {
196                if ($vraies_erreurs)
197                        $erreurs = array_merge($erreurs, $vraies_erreurs);
198                else
199                        $erreurs = array();
200        }
201       
202        return $erreurs;
203}
204
205function formulaires_construire_formulaire_traiter($identifiant, $formulaire_initial=array(), $options=array()){
206        include_spip('inc/saisies');
207        $retours = array();
208        $saisies_disponibles = saisies_lister_disponibles();
209       
210        // On ajoute un préfixe devant l'identifiant
211        $identifiant = 'constructeur_formulaire_'.$identifiant;
212        // On récupère le formulaire à son état actuel
213        $formulaire_actuel = session_get($identifiant);
214       
215        // Si on demande à ajouter une saisie
216        if ($ajouter_saisie = _request('ajouter_saisie')){
217                $nom = saisies_generer_nom($formulaire_actuel, $ajouter_saisie);
218                $saisie = array(
219                        'saisie' => $ajouter_saisie,
220                        'options' => array(
221                                'nom' => $nom
222                        )
223                );
224                // S'il y a des valeurs par défaut pour ce type de saisie, on les ajoute
225                if (($defaut = $saisies_disponibles[$ajouter_saisie]['defaut']) and is_array($defaut)){
226                        $defaut = _T_ou_typo($defaut, 'multi');
227
228                        //Compatibilite PHP<5.3.0
229                        //source : http://www.php.net/manual/en/function.array-replace-recursive.php#92574
230                        if (!function_exists('array_replace_recursive'))
231                        {
232                                function array_replace_recursive($array, $array1)
233                                {
234                                        function recurse($array, $array1)
235                                        {
236                                                foreach ($array1 as $key => $value)
237                                                {
238                                                        // create new key in $array, if it is empty or not an array
239                                                        if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key])))
240                                                        {
241                                                                $array[$key] = array();
242                                                        }
243                                                        // overwrite the value in the base array
244                                                        if (is_array($value))
245                                                        {
246                                                                $value = recurse($array[$key], $value);
247                                                        }
248                                                        $array[$key] = $value;
249                                                }
250                                                return $array;
251                                        }
252 
253                                        // handle the arguments, merge one by one
254                                        $args = func_get_args();
255                                        $array = $args[0];
256                                        if (!is_array($array))
257                                        {
258                                                return $array;
259                                        }
260                                        for ($i = 1; $i < count($args); $i++)
261                                        {
262                                                if (is_array($args[$i]))
263                                                {
264                                                        $array = recurse($array, $args[$i]);
265                                                }
266                                        }
267                                return $array;
268                                }
269                        }
270                        $saisie = array_replace_recursive($saisie, $defaut);
271                }
272                $formulaire_actuel = saisies_inserer($formulaire_actuel, $saisie);
273        }
274
275        // Si on demande à dupliquer une saisie
276        if ($dupliquer_saisie = _request('dupliquer_saisie')) {
277                $formulaire_actuel = saisies_dupliquer($formulaire_actuel, $dupliquer_saisie); 
278        }
279       
280        // Si on demande à supprimer une saisie
281        if ($supprimer_saisie = _request('supprimer_saisie')){
282                $formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie);
283        }
284       
285        // Si on enregistre la conf d'une saisie
286        if ($nom = _request('enregistrer_saisie')){
287                // On récupère ce qui a été modifié
288                $saisie_modifiee = _request("saisie_modifiee_$nom");
289               
290                // On regarde s'il y a une position à modifier
291                if (isset($saisie_modifiee['position'])){
292                        $position = $saisie_modifiee['position'];
293                        unset($saisie_modifiee['position']);
294                        // On ne déplace que si ce n'est pas la même chose
295                        if ($position != $nom)
296                                $formulaire_actuel = saisies_deplacer($formulaire_actuel, $nom, $position);
297                }
298               
299                // On regarde s'il y a des options de vérification à modifier
300                if (($type_verif = $saisie_modifiee['verifier']['type']) != ''){
301                        $saisie_modifiee['verifier'] = array(
302                                'type' => $type_verif,
303                                'options' => $saisie_modifiee['verifier'][$type_verif]
304                        );
305                }
306                else
307                        unset($saisie_modifiee['verifier']);
308       
309               
310                // On récupère les options postées en enlevant les chaines vides
311                $saisie_modifiee['options'] = array_filter($saisie_modifiee['options'], 'saisie_option_contenu_vide');
312                if ($saisie_modifiee['verifier']['options']) $saisie_modifiee['verifier']['options'] = array_filter($saisie_modifiee['verifier']['options'], 'saisie_option_contenu_vide');
313               
314                // On désinfecte à la main
315                if (is_array($saisie_modifiee['options']))
316                        spip_desinfecte($saisie_modifiee['options']);
317               
318                // On modifie enfin
319                $formulaire_actuel = saisies_modifier($formulaire_actuel, $nom, $saisie_modifiee);
320        }
321       
322        // Si on demande à réinitialiser
323        if (_request('reinitialiser') == 'oui'){
324                $formulaire_actuel = $formulaire_initial;
325        }
326       
327        // On enregistre en session la nouvelle version du formulaire
328        session_set($identifiant, $formulaire_actuel);
329       
330        // Le formulaire reste éditable
331        $retours['editable'] = true;
332       
333        return $retours;
334}
335
336// À utiliser avec un array_walk_recursive()
337// Applique une transformation à la @valeur@ de tous les champs "nom" d'un formulaire, y compris loin dans l'arbo
338function formidable_transformer_nom(&$valeur, $cle, $transformation){
339        if ($cle == 'nom' and is_string($valeur)){
340                $valeur = str_replace('@valeur@', $valeur, $transformation);
341        }
342}
343
344// Préparer une saisie pour la transformer en truc configurable
345function formidable_generer_saisie_configurable($saisie, $env){
346        // On récupère le nom
347        $nom = $saisie['options']['nom'];
348        $identifiant = $saisie['identifiant'];
349        // On cherche si ya un formulaire de config
350        $formulaire_config = $env['erreurs']['configurer_'.$nom];
351        // On ajoute une classe
352        $saisie['options']['li_class'] .= ' configurable';
353        // On ajoute l'option "tout_afficher"
354        $saisie['options']['tout_afficher'] = 'oui';
355       
356        // On ajoute les boutons d'actions, mais seulement s'il n'y a pas de configuration de lancée
357        if (!$env['erreurs']) {
358                $saisie = saisies_inserer_html(
359                        $saisie,
360                        recuperer_fond(
361                                'formulaires/inc-construire_formulaire-actions',
362                                array('nom' => $nom, 'identifiant' => $identifiant, 'formulaire_config' => $formulaire_config)
363                        ),
364                        'debut'
365                );
366        }
367       
368        // On ajoute une ancre pour s'y déplacer
369        $saisie = saisies_inserer_html(
370                $saisie,
371                "\n<a id=\"configurer_$nom\"></a>\n",
372                'debut'
373        );
374       
375        // Si ya un form de config on l'ajoute à la fin
376        if (is_array($formulaire_config)){
377                // On double l'environnement
378                $env2 = $env;
379                // On ajoute une classe
380                $saisie['options']['li_class'] .= ' en_configuration';
381               
382                // Si possible on met en readonly
383                $saisie['options']['readonly'] = 'oui';
384               
385                // On vire les sous-saisies s'il y en a
386                if ($saisie['saisies'] and is_array($saisie['saisies'])){
387                        $nb_champs_masques = count(saisies_lister_champs($saisie['saisies']));
388                        $saisie['saisies'] = array(
389                                array(
390                                        'saisie' => 'explication',
391                                        'options' => array(
392                                                'nom' => 'truc',
393                                                'texte' => _T('saisies:construire_info_nb_champs_masques', array('nb'=>$nb_champs_masques)),
394                                        )
395                                )
396                        );
397                }
398               
399                // On va ajouter le champ pour la position
400                if (!($chemin_description = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))){
401                        $chemin_description = array(0);
402                        $formulaire_config = saisies_inserer(
403                                $formulaire_config,
404                                array(
405                                        'saisie' => 'fieldset',
406                                        'options' => array(
407                                                'nom' => "saisie_modifiee_${nom}[options][description]",
408                                                'label' => _T('saisies:option_groupe_description')
409                                        ),
410                                        'saisies' => array()
411                                ),
412                                0
413                        );
414                }
415                $chemin_description[] = 'saisies';
416                $chemin_description[] = '0'; // tout au début
417                $formulaire_config = saisies_inserer(
418                        $formulaire_config,
419                        array(
420                                'saisie' => 'position_construire_formulaire',
421                                'options' => array(
422                                        'nom' => "saisie_modifiee_${nom}[position]",
423                                        'label' => _T('saisies:construire_position_label'),
424                                        'explication' => _T('saisies:construire_position_explication'),
425                                        'formulaire' => $env['_contenu'],
426                                        'saisie_a_positionner' => $nom
427                                )
428                        ),
429                        $chemin_description
430                );
431               
432                $env2['saisies'] = $formulaire_config;
433               
434                // Un test pour savoir si on prend le _request ou bien
435                $erreurs_test = $env['erreurs'];
436                unset($erreurs_test['configurer_'.$nom]);
437                unset($erreurs_test['positionner']);
438                if ($erreurs_test){
439                        // Là aussi on désinfecte à la main
440                        if (is_array($env2["saisie_modifiee_$nom"]['options']))
441                                spip_desinfecte($env2["saisie_modifiee_$nom"]['options']);
442                }
443                else{
444                        $env2["saisie_modifiee_$nom"] = $env2['_saisies_par_nom'][$nom];
445                        $env2["saisie_modifiee_$nom"]['verifier'][$env2["saisie_modifiee_$nom"]['verifier']['type']] = $env2["saisie_modifiee_$nom"]['verifier']['options'];
446                }
447               
448                $env2['fond_generer'] = 'inclure/generer_saisies';
449                $saisie = saisies_inserer_html(
450                        $saisie,
451                        '<div class="formulaire_configurer"><ul class="formulaire_configurer-contenus">'
452                        .recuperer_fond(
453                                'inclure/generer_saisies',
454                                $env2
455                        )
456                        .'<li class="boutons">
457                                <input type="hidden" name="enregistrer_saisie" value="'.$nom.'" />
458                                <button type="submit" class="submit link" name="enregistrer_saisie" value="">'._T('bouton_annuler').'</button>
459                                <input type="submit" class="submit" name="enregistrer" value="'._T('bouton_valider').'" />
460                        </li>'
461                        .'</ul></div>',
462                        'fin'
463                );
464        }
465        // On génère le HTML de la saisie
466        $html = saisies_generer_html($saisie, $env);
467        return $html;
468}
469
470/**
471 * Callback d'array_filter()
472 * Permet de retourner tout ce qui n'est pas un contenu vide.
473 * La valeur '0' est par contre retournée.
474 *
475 * @param $var La variable a tester
476 * @return bool L'accepte-t-on ?
477**/
478function saisie_option_contenu_vide($var) {
479        if (!$var) {
480                if (is_string($var) AND strlen($var)) {
481                        return true;
482                }
483                return false;
484        }
485        return true;
486}
487?>
Note: See TracBrowser for help on using the repository browser.