Changeset 114448 in spip-zone for _plugins_/saisies


Ignore:
Timestamp:
Mar 12, 2019, 5:18:11 PM (5 weeks ago)
Author:
rastapopoulos@…
Message:

Nouvelle fonctionnalité : le constructeur de formulaire permet désormais de configurer par interface des options globales à l'affichage d'un formulaire. Ces options sont déjà prévues dans l'API, par ex pour personnaliser le texte du bouton ou pour activer le multi-étapes. Elles sont stockés dans une clé 'options' à la racine du tableau de description du formulaire. Pour avoir l'interface, le constructeur a besoin de connaître la liste des champs qu'on permet de configurer pour CET appel. En effet, suivant les contextes, ce ne sont pas forcément les mêmes options ! Si on est dans Formidable, ou dans Champs Extras, les mêmes choses ne sont pas pertinentes. C'est donc au plugin qui appelle le constructeur de décider quelles sont les options qu'il permet.

Location:
_plugins_/saisies/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/saisies/trunk/formulaires/construire_formulaire.html

    r113488 r114448  
    1010                #ACTION_FORMULAIRE{#ENV{action}}
    1111                <input type="submit" class="submit noscroll invisible" name="enregistrer" value="<:bouton_enregistrer:>" />
    12 
     12               
     13                [(#ENV{_activer_options_globales}|oui)
     14                        [(#ENV{erreurs/configurer_globales}|non)
     15                        <div class="actions">
     16                                <button type="submit" class="submit" name="configurer_globales" value="oui">
     17                                        <:saisies:construire_configurer_globales_label:>
     18                                </button>
     19                        </div>
     20                        ]
     21                        [(#ENV{erreurs/configurer_globales}|oui)
     22                        <[(#DIV|sinon{ul})] class="editer-groupe en_configuration">
     23                                #GENERER_SAISIES{#ENV{erreurs/configurer_globales}}
     24                               
     25                                <[(#DIV|sinon{li})] class="boutons">
     26                                        <input type="hidden" name="enregistrer_globales" value="oui" />
     27                                        <button type="submit" class="submit link noscroll" name="enregistrer_globales" value=""><:bouton_annuler:></button>
     28                                        <input type="submit" class="submit noscroll" name="enregistrer" value="<:bouton_valider:>" />
     29                                </[(#DIV|sinon{li})]>
     30                        </[(#DIV|sinon{ul})]>
     31                        ]
     32                ]
     33               
    1334                <[(#DIV|sinon{ul})] class="editer-groupe" id="deplacable">
    14 
    1535                        <[(#DIV|sinon{li})] id="reinitialiser" class="actions_formulaire">
    1636                                <button type="submit" class="submit" name="reinitialiser" value="oui" onclick="return confirm('<:saisies:construire_reinitialiser_confirmer:>')">
     
    5070                        </[(#DIV|sinon{li})]>
    5171                        </B_saisies_groupes_disponibles>
    52 
    5372                </[(#DIV|sinon{ul})]>
    5473
  • _plugins_/saisies/trunk/formulaires/construire_formulaire.php

    r113487 r114448  
    3939        foreach (array_keys($contexte['_saisies_par_nom']) as $nom) {
    4040                $contexte["saisie_modifiee_$nom"] = array();
     41        }
     42       
     43        // La liste des options globales qu'on peut configurer, si elles existent
     44        if (isset($options['options_globales']) and is_array($options['options_globales'])) {
     45                $contexte['_activer_options_globales'] = true;
     46                if (isset($formulaire_actuel['options'])) {
     47                        $contexte['options_globales'] = $formulaire_actuel['options'];
     48                }
     49                else {
     50                        $contexte['options_globales'] = array();
     51                }
    4152        }
    4253
     
    7788        $configurer_saisie = $enregistrer_saisie = '';
    7889
    79         // Pas d'erreur si l'on ne demande rien
     90        // On ne fait rien du tout si on n'est pas dans l'un de ces cas
    8091        if (
    81                 !($nom_ou_id = $configurer_saisie  = _request('configurer_saisie')
    82                 or $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))
     92                !(
     93                        $nom_ou_id = $configurer_saisie  = _request('configurer_saisie')
     94                        or $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie')
     95                        or $configurer_globales = _request('configurer_globales')
     96                        or $enregistrer_globales = _request('enregistrer_globales')
     97                )
    8398        ) {
    8499                return $erreurs;
     
    89104        // On récupère le formulaire à son état actuel
    90105        $formulaire_actuel = session_get($identifiant);
    91 
    92         // On récupère les saisies actuelles, par identifiant ou par nom
    93         if ($nom_ou_id[0] == '@') {
    94                 $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
    95                 $nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
    96         }
     106       
     107        // Gestion de la config globales
     108        if ($configurer_globales or $enregistrer_globales) {
     109                array_walk_recursive($options['options_globales'], 'construire_formulaire_transformer_nom', 'options_globales[@valeur@]');
     110                $erreurs['configurer_globales'] = $options['options_globales'];
     111               
     112                if ($enregistrer_globales) {
     113                        $vraies_erreurs = saisies_verifier($erreurs['configurer_globales']);
     114                }
     115        }
     116        // Sinon c'est la gestion d'une saisie précise
    97117        else {
    98                 $saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
    99                 $nom = $nom_ou_id;
    100         }
    101         $noms_autorises = array_keys($saisies_actuelles);
    102 
    103         // le nom (ou identifiant) doit exister
    104         if (!in_array($nom_ou_id, $noms_autorises)) {
    105                 return $erreurs;
    106         }
    107 
    108         // La liste des saisies
    109         $saisies_disponibles = saisies_lister_disponibles();
    110 
    111         $saisie = $saisies_actuelles[$nom_ou_id];
    112         $formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
    113         array_walk_recursive($formulaire_config, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
    114         $formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
    115         $formulaire_config = $formulaire_config['saisies'];
    116 
    117         // Si la saisie possede un identifiant, on l'ajoute
    118         // au formulaire de configuration pour ne pas le perdre en route
    119         if (isset($saisie['identifiant']) and $saisie['identifiant']) {
    120                 $formulaire_config = saisies_inserer(
    121                         $formulaire_config,
    122                         array(
    123                                 'saisie' => 'hidden',
    124                                 'options' => array(
    125                                         'nom' => "saisie_modifiee_${nom}[identifiant]",
    126                                         'defaut' => $saisie['identifiant']
    127                                 ),
    128                         )
    129                 );
    130         }
    131 
    132         // S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
    133         if (
    134                 isset($options['modifier_nom']) and $options['modifier_nom']
    135                 and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true)
    136         ) {
    137                 $chemin_nom[] = 'saisies';
    138                 $chemin_nom[] = '0';
    139 
    140                 $formulaire_config = saisies_inserer(
    141                         $formulaire_config,
    142                         array(
    143                                 'saisie' => 'input',
    144                                 'options' => array(
    145                                         'nom' => "saisie_modifiee_${nom}[options][nom]",
    146                                         'label' => _T('saisies:option_nom_label'),
    147                                         'explication' => _T('saisies:option_nom_explication'),
    148                                         'obligatoire' => 'oui',
    149                                         'size' => 50
    150                                 ),
    151                                 'verifier' => array(
    152                                         'type' => 'regex',
     118                // On récupère les saisies actuelles, par identifiant ou par nom
     119                if ($nom_ou_id[0] == '@') {
     120                        $saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
     121                        $nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
     122                }
     123                else {
     124                        $saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
     125                        $nom = $nom_ou_id;
     126                }
     127                $noms_autorises = array_keys($saisies_actuelles);
     128
     129                // le nom (ou identifiant) doit exister
     130                if (!in_array($nom_ou_id, $noms_autorises)) {
     131                        return $erreurs;
     132                }
     133
     134                // La liste des saisies
     135                $saisies_disponibles = saisies_lister_disponibles();
     136
     137                $saisie = $saisies_actuelles[$nom_ou_id];
     138                $formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
     139                array_walk_recursive($formulaire_config, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
     140                $formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
     141                $formulaire_config = $formulaire_config['saisies'];
     142
     143                // Si la saisie possede un identifiant, on l'ajoute
     144                // au formulaire de configuration pour ne pas le perdre en route
     145                if (isset($saisie['identifiant']) and $saisie['identifiant']) {
     146                        $formulaire_config = saisies_inserer(
     147                                $formulaire_config,
     148                                array(
     149                                        'saisie' => 'hidden',
    153150                                        'options' => array(
    154                                                 'modele' => '/^[\w]+$/'
    155                                         )
    156                                 )
    157                         ),
    158                         $chemin_nom
    159                 );
    160         }
    161 
    162         // liste des options de vérification
    163         $verif_options = array();
    164 
    165         // S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
    166         if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)) {
    167                 include_spip('inc/verifier');
    168                 $liste_verifications = verifier_lister_disponibles();
    169 
    170                 // La vérification fichiers ne sert que pour la saisie fichiers, et réciproquement, cette saisies n'utilise que cette vérification
    171                 if ($saisie['saisie'] == 'fichiers') {
    172                         $liste_verifications = array('fichiers'=>$liste_verifications['fichiers']);
    173                 } else {
    174                         unset($liste_verifications['fichiers']);
    175                 }
    176                 uasort ($liste_verifications,'verifier_trier_par_titre');
    177                 $chemin_validation[] = 'saisies';
    178                 $chemin_validation[] = 1000000; // à la fin
    179 
    180                 // On construit la saisie à insérer et les fieldset des options
    181                 if ($saisie['saisie'] == 'fichiers') {
    182                         $saisie_liste_verif = array(
    183                                 'saisie' => 'hidden',
    184                                 'options' => array(
    185                                         'nom' => "saisie_modifiee_${nom}[verifier][type]",
    186                                         'defaut' => 'fichiers'
     151                                                'nom' => "saisie_modifiee_${nom}[identifiant]",
     152                                                'defaut' => $saisie['identifiant']
     153                                        ),
    187154                                )
    188155                        );
    189                 } else {
    190                         $saisie_liste_verif = array(
    191                                 'saisie' => 'selection',
    192                                 'options' => array(
    193                                         'nom' => "saisie_modifiee_${nom}[verifier][type]",
    194                                         'label' => _T('saisies:construire_verifications_label'),
    195                                         'option_intro' => _T('saisies:construire_verifications_aucune'),
    196                                         'conteneur_class' => 'liste_verifications',
    197                                         'datas' => array()
    198                                 )
     156                }
     157
     158                // S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
     159                if (
     160                        isset($options['modifier_nom']) and $options['modifier_nom']
     161                        and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true)
     162                ) {
     163                        $chemin_nom[] = 'saisies';
     164                        $chemin_nom[] = '0';
     165
     166                        $formulaire_config = saisies_inserer(
     167                                $formulaire_config,
     168                                array(
     169                                        'saisie' => 'input',
     170                                        'options' => array(
     171                                                'nom' => "saisie_modifiee_${nom}[options][nom]",
     172                                                'label' => _T('saisies:option_nom_label'),
     173                                                'explication' => _T('saisies:option_nom_explication'),
     174                                                'obligatoire' => 'oui',
     175                                                'size' => 50
     176                                        ),
     177                                        'verifier' => array(
     178                                                'type' => 'regex',
     179                                                'options' => array(
     180                                                        'modele' => '/^[\w]+$/'
     181                                                )
     182                                        )
     183                                ),
     184                                $chemin_nom
    199185                        );
    200186                }
    201                 foreach ($liste_verifications as $type_verif => $verif) {
    202                         $saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre'];
    203                         // Si le type de vérif a des options, on ajoute un fieldset
    204                         if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])) {
    205                                 $groupe = array(
    206                                         'saisie' => 'fieldset',
     187
     188                // liste des options de vérification
     189                $verif_options = array();
     190
     191                // S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
     192                if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)) {
     193                        include_spip('inc/verifier');
     194                        $liste_verifications = verifier_lister_disponibles();
     195
     196                        // La vérification fichiers ne sert que pour la saisie fichiers, et réciproquement, cette saisies n'utilise que cette vérification
     197                        if ($saisie['saisie'] == 'fichiers') {
     198                                $liste_verifications = array('fichiers'=>$liste_verifications['fichiers']);
     199                        } else {
     200                                unset($liste_verifications['fichiers']);
     201                        }
     202                        uasort ($liste_verifications,'verifier_trier_par_titre');
     203                        $chemin_validation[] = 'saisies';
     204                        $chemin_validation[] = 1000000; // à la fin
     205
     206                        // On construit la saisie à insérer et les fieldset des options
     207                        if ($saisie['saisie'] == 'fichiers') {
     208                                $saisie_liste_verif = array(
     209                                        'saisie' => 'hidden',
    207210                                        'options' => array(
    208                                                 'nom' => 'options',
    209                                                 'label' => $verif['titre'],
    210                                                 'conteneur_class' => "$type_verif options_verifier"
    211                                         ),
    212                                         'saisies' => $verif['options']
     211                                                'nom' => "saisie_modifiee_${nom}[verifier][type]",
     212                                                'defaut' => 'fichiers'
     213                                        )
    213214                                );
    214                                 array_walk_recursive($groupe, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
    215                                 array_walk_recursive($groupe, 'construire_formulaire_transformer_afficher_si', "saisie_modifiee_${nom}[verifier][$type_verif]");
    216                                 $verif_options[$type_verif] = $groupe;
    217                         }
    218                 }
    219                 $verif_options = array_merge(array($saisie_liste_verif), $verif_options);
    220         }
    221 
    222         // Permettre d'intégrer des saisies et fieldset au formulaire de configuration.
    223         // Si des vérifications sont à faire, elles seront prises en compte
    224         // lors des tests de vérifications à l'enregistrement.
    225         $formulaire_config = pipeline('saisies_construire_formulaire_config', array(
    226                 'data' => $formulaire_config,
    227                 'args' => array(
    228                         'identifiant' => $identifiant,
    229                         'action' => $enregistrer_saisie ? 'enregistrer' : 'configurer',
    230                         'options' => $options,
    231                         'nom' => $nom,
    232                         'saisie' => $saisie,
    233                 ),
    234         ));
    235 
    236         if ($enregistrer_saisie) {
    237                 // La saisie modifié
    238                 $saisie_modifiee = _request("saisie_modifiee_${nom}");//contient tous les paramètres de la saisie
    239                 // On cherche les erreurs de la configuration
    240                 $vraies_erreurs = saisies_verifier($formulaire_config);
    241 
    242                 // Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
    243                 if (isset($options['modifier_nom']) and $options['modifier_nom']
    244                         and isset($options['nom_unique']) and $options['nom_unique']) {
    245                         $nom_modifie = $saisie_modifiee['options']['nom'];
    246                         if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie)) {
    247                                 $vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
    248                         }
    249                 }
    250 
    251                 // On regarde s'il a été demandé un type de vérif
    252                 if (isset($saisie_modifiee['verifier']['type'])
    253                         and (($type_verif = $saisie_modifiee['verifier']['type']) != '')
    254                         and $verif_options[$type_verif]) {
    255                         // On ne vérifie que les options du type demandé
    256                         $vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
    257                 }
    258         }
    259 
    260         // On insère chaque saisie des options de verification
    261         if ($verif_options) {
    262                 foreach ($verif_options as $saisie_verif) {
    263                         $formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
    264                 }
    265         }
    266         $erreurs['configurer_'.$nom] = $formulaire_config;
    267 
    268         if ($enregistrer_saisie) {
     215                        } else {
     216                                $saisie_liste_verif = array(
     217                                        'saisie' => 'selection',
     218                                        'options' => array(
     219                                                'nom' => "saisie_modifiee_${nom}[verifier][type]",
     220                                                'label' => _T('saisies:construire_verifications_label'),
     221                                                'option_intro' => _T('saisies:construire_verifications_aucune'),
     222                                                'conteneur_class' => 'liste_verifications',
     223                                                'datas' => array()
     224                                        )
     225                                );
     226                        }
     227                        foreach ($liste_verifications as $type_verif => $verif) {
     228                                $saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre'];
     229                                // Si le type de vérif a des options, on ajoute un fieldset
     230                                if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])) {
     231                                        $groupe = array(
     232                                                'saisie' => 'fieldset',
     233                                                'options' => array(
     234                                                        'nom' => 'options',
     235                                                        'label' => $verif['titre'],
     236                                                        'conteneur_class' => "$type_verif options_verifier"
     237                                                ),
     238                                                'saisies' => $verif['options']
     239                                        );
     240                                        array_walk_recursive($groupe, 'construire_formulaire_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
     241                                        array_walk_recursive($groupe, 'construire_formulaire_transformer_afficher_si', "saisie_modifiee_${nom}[verifier][$type_verif]");
     242                                        $verif_options[$type_verif] = $groupe;
     243                                }
     244                        }
     245                        $verif_options = array_merge(array($saisie_liste_verif), $verif_options);
     246                }
     247
     248                // Permettre d'intégrer des saisies et fieldset au formulaire de configuration.
     249                // Si des vérifications sont à faire, elles seront prises en compte
     250                // lors des tests de vérifications à l'enregistrement.
     251                $formulaire_config = pipeline('saisies_construire_formulaire_config', array(
     252                        'data' => $formulaire_config,
     253                        'args' => array(
     254                                'identifiant' => $identifiant,
     255                                'action' => $enregistrer_saisie ? 'enregistrer' : 'configurer',
     256                                'options' => $options,
     257                                'nom' => $nom,
     258                                'saisie' => $saisie,
     259                        ),
     260                ));
     261
     262                if ($enregistrer_saisie) {
     263                        // La saisie modifié
     264                        $saisie_modifiee = _request("saisie_modifiee_${nom}");//contient tous les paramètres de la saisie
     265                        // On cherche les erreurs de la configuration
     266                        $vraies_erreurs = saisies_verifier($formulaire_config);
     267
     268                        // Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
     269                        if (isset($options['modifier_nom']) and $options['modifier_nom']
     270                                and isset($options['nom_unique']) and $options['nom_unique']) {
     271                                $nom_modifie = $saisie_modifiee['options']['nom'];
     272                                if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie)) {
     273                                        $vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
     274                                }
     275                        }
     276
     277                        // On regarde s'il a été demandé un type de vérif
     278                        if (isset($saisie_modifiee['verifier']['type'])
     279                                and (($type_verif = $saisie_modifiee['verifier']['type']) != '')
     280                                and $verif_options[$type_verif]) {
     281                                // On ne vérifie que les options du type demandé
     282                                $vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
     283                        }
     284                }
     285
     286                // On insère chaque saisie des options de verification
     287                if ($verif_options) {
     288                        foreach ($verif_options as $saisie_verif) {
     289                                $formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
     290                        }
     291                }
     292                $erreurs['configurer_'.$nom] = $formulaire_config;
     293        }
     294       
     295        // S'il y a des vraies erreurs au final
     296        if ($enregistrer_globales or $enregistrer_saisie) {
    269297                if ($vraies_erreurs) {
    270298                        $erreurs = array_merge($erreurs, $vraies_erreurs);
     
    356384                $formulaire_actuel = saisies_supprimer($formulaire_actuel, $supprimer_saisie);
    357385        }
    358 
     386       
     387        // Si on enregistre la conf globale
     388        if (_request('enregistrer_globales')) {
     389                $options_globales = _request('options_globales');
     390                if (is_array($options_globales)) {
     391                        spip_desinfecte($options_globales);
     392                }
     393               
     394                $formulaire_actuel['options'] = $options_globales;
     395        }
     396       
    359397        // Si on enregistre la conf d'une saisie
    360398        if ($nom = _request('enregistrer_saisie')) {
  • _plugins_/saisies/trunk/lang/saisies_fr.php

    r114338 r114448  
    2727        'construire_attention_supprime' => 'Vos modifications comportent des suppressions de champs. Veuillez confirmer l’enregistrement de cette nouvelle version du formulaire.',
    2828        'construire_aucun_champs' => 'Il n’y a pour l’instant aucun champ dans ce formulaire.',
     29        'construire_configurer_globales_label' => 'Configurer les options globales',
    2930        'construire_confirmer_supprimer_champ' => 'Voulez-vous vraiment supprimer ce champ ?',
    3031        'construire_info_nb_champs_masques' => '@nb@ champ(s) masqué(s) le temps de configurer le groupe.',
  • _plugins_/saisies/trunk/paquet.xml

    r114384 r114448  
    22        prefix="saisies"
    33        categorie="outil"
    4         version="3.17.0"
     4        version="3.18.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.