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

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

Correction de notices PHP

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