Changeset 114384 in spip-zone for _plugins_/saisies


Ignore:
Timestamp:
Mar 7, 2019, 11:34:36 PM (6 weeks ago)
Author:
rastapopoulos@…
Message:

Nouveauté sans rien casser (normalement) : l'API saisies permet maintenant d'activer un formulaire multi-étapes en une ligne ! Pour ça, il suffit 1) d'avoir des fieldsets racines qui se transformeront en étapes et 2) d'avoir un tableau options dans le tableau des saisies avec 'options'=>array('etapes_activer'=>true). Et… c'est tout ! Paf magie. Comme option, on peut aussi utiliser 'etapes_suivant' et 'etapes_precedent' pour personnaliser les labels des boutons qui s'affichent quand on n'est pas encore à la fin du formulaire. Ça ajoute aussi un menu pas trop mal accessible (ça suit accedeweb) qui liste les étapes avec leur nom humain (le label des fieldsets) et quand ce sont les étapes précédentes, ça fait un bouton pour y revenir. La suite : permettre aussi de configurer tout ça par interface dans le constructeur de formulaire, afin de pouvoir l'utiliser dans Formidable ! Demain est un autre jour…

Location:
_plugins_/saisies/trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/saisies/trunk/demo/page-saisies_cvt.html

    r45189 r114384  
    1 <h1>CVT automatique avec Saisies</h1>
    2 <p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
     1<!DOCTYPE html>
     2<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
     3<head>
     4        <title>Demo Saisies CVT</title>
     5        <INCLURE{fond=inclure/head} />
     6</head>
     7<body>
     8        <div class="page">
     9                <h1>CVT automatique avec Saisies</h1>
     10                <p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
    311
    4 #FORMULAIRE_SAISIES_CVT
     12                <div class="ajax">
     13                #FORMULAIRE_SAISIES_CVT
     14                </div>
     15        </div>
     16</body>
     17</html>
  • _plugins_/saisies/trunk/formulaires/inc-saisies-cvt.html

    r110994 r114384  
    1010                #ACTION_FORMULAIRE{#ENV{action}}
    1111               
     12                [(#ENV{_etape}|oui)
     13                        #SET{etapes, #ENV{_saisies}|saisies_lister_par_etapes}
     14                        <INCLURE{fond=formulaires/inc-saisies-cvt-etapes, etapes=#GET{etapes}, env} />
     15                ]
     16               
    1217                <[(#DIV|sinon{ul})] class="editer-groupe">
    13                         #GENERER_SAISIES{#ENV{_saisies}}
     18                        #SET{saisies, #ENV{_saisies}}
     19                        [(#ENV{_etape}|oui)
     20                                #SET{saisies, #GET{etapes}|table_valeur{#ENV{_etape}/saisies}}
     21                        ]
     22                        #GENERER_SAISIES{#GET{saisies}}
    1423                </[(#DIV|sinon{ul})]>
    1524               
     
    1928                <p class="boutons">
    2029                        <span class="image_loading"></span>
    21                         <input type="submit" class="submit" value="[(#ENV{_saisies/options/texte_submit, #ENV{saisies_texte_submit, <:bouton_enregistrer:>}})]" />
     30                        [(#SET{label_valider, #ENV{_saisies/options/texte_submit, #ENV{saisies_texte_submit, <:bouton_enregistrer:>}}})]
     31                        [(#ENV{_etape}|et{#ENV{_etape}|!={#ENV{_etapes}}})
     32                                [(#SET{label_valider, #ENV{_saisies/options/etapes_suivant, <:bouton_suivant:>}})]
     33                        ]
     34                        [(#ENV{_etape}|>{1}|oui)
     35                                <input type="submit" class="submit" name="_retour_etape_[(#ENV{_etape}|moins{1})]" value="[(#ENV{_saisies/options/etapes_precedent, <:bouton_precedent:>})]" />
     36                        ]
     37                        <input type="submit" class="submit" value="#GET{label_valider}" />
    2238                </p>
    2339        </div></form>
  • _plugins_/saisies/trunk/formulaires/saisies_cvt.php

    r107777 r114384  
    1111        $saisies = array(
    1212                'options' => array(
    13                         'texte_submit' => 'Prout !',
    14                         'activer_etapes' => true,
     13                        'texte_submit' => 'Pouet !',
     14                        'etapes_activer' => true,
     15                        'etapes_suivant' => 'Suivant pouet',
     16                        'etapes_precedent' => 'Précédent pouet',
     17                        'etapes_navigation' => 'on',
    1518                ),
    1619                array(
    17                         'saisie' => 'input',
     20                        'saisie' => 'fieldset',
    1821                        'options' => array(
    19                                 'nom' => 'nom',
    20                                 'label' => 'Nom'
    21                         )
     22                                'nom' => 'persos',
     23                                'label' => 'Informations personnelles',
     24                        ),
     25                        'saisies' => array(
     26                                array(
     27                                        'saisie' => 'input',
     28                                        'options' => array(
     29                                                'nom' => 'nom',
     30                                                'label' => 'Nom'
     31                                        )
     32                                ),
     33                                array(
     34                                        'saisie' => 'input',
     35                                        'options' => array(
     36                                                'nom' => 'email',
     37                                                'obligatoire' => 'oui',
     38                                                'label' => 'E-mail'
     39                                        ),
     40                                        'verifier' => array(
     41                                                'type' => 'email'
     42                                        )
     43                                ),
     44                                array(
     45                                        'saisie' => 'input',
     46                                        'options' => array(
     47                                                'nom' => 'a_supprimer',
     48                                                'label' => 'Un champ à supprimer'
     49                                        )
     50                                ),
     51                        ),
    2252                ),
    2353                array(
    24                         'saisie' => 'input',
     54                        'saisie' => 'case',
    2555                        'options' => array(
    26                                 'nom' => 'email',
    27                                 'obligatoire' => 'oui',
    28                                 'label' => 'E-mail'
     56                                'nom' => 'out',
     57                                'label_case' => 'Un champ à l’extérieur des groupes'
    2958                        ),
    30                         'verifier' => array(
    31                                 'type' => 'email'
    32                         )
    3359                ),
    3460                array(
    35                         'saisie' => 'input',
     61                        'saisie' => 'fieldset',
    3662                        'options' => array(
    37                                 'nom' => 'a_supprimer',
    38                                 'label' => 'Un champ à supprimer'
    39                         )
     63                                'nom' => 'ecrire',
     64                                'label' => 'Des choses à dire',
     65                        ),
     66                        'saisies' => array(
     67                                array(
     68                                        'saisie' => 'input',
     69                                        'options' => array(
     70                                                'nom' => 'sujet',
     71                                                'label' => 'Sujet'
     72                                        )
     73                                ),
     74                                array(
     75                                        'saisie' => 'textarea',
     76                                        'options' => array(
     77                                                'nom' => 'message',
     78                                                'obligatoire' => 'oui',
     79                                                'label' => 'Un message',
     80                                                'conteneur_class' => 'pleine_largeur',
     81                                        ),
     82                                        'verifier' => array(
     83                                                'type' => 'taille',
     84                                                'options' => array('min' => 10)
     85                                        )
     86                                ),
     87                        ),
    4088                ),
    41                 array(
    42                         'saisie' => 'textarea',
    43                         'options' => array(
    44                                 'nom' => 'message',
    45                                 'obligatoire' => 'oui',
    46                                 'label' => 'Un message'
    47                         ),
    48                         'verifier' => array(
    49                                 'type' => 'taille',
    50                                 'options' => array('min' => 10)
    51                         )
    52                 )
    5389        );
    5490       
     
    5793        $saisies = saisies_dupliquer($saisies, 'message');
    5894        $saisies = saisies_deplacer($saisies, 'email', 'nom');
    59         var_dump($saisies);
     95        //var_dump($saisies);
    6096       
    6197        return $saisies;
     
    64100function formulaires_saisies_cvt_charger() {
    65101        $contexte = array(
    66                 'saisies_texte_submit' => 'Caca !',
     102                'saisies_texte_submit' => 'Prout !',
    67103        );
    68104       
  • _plugins_/saisies/trunk/inc/saisies_lister.php

    r113849 r114384  
    173173
    174174        return $saisies;
     175}
     176
     177/**
     178 * Liste les saisies par étapes s'il y en a
     179 *
     180 * @param array $saisies
     181 *              Liste des saisies
     182 * @return array|bool
     183 *              Retourne un tableau associatif par numéro d'étape avec pour chacune leurs saisies, false si pas d'étapes
     184 */
     185function saisies_lister_par_etapes($saisies) {
     186        $saisies_etapes = false;
     187        $etapes = 0;
     188       
     189        if (isset($saisies['options']['etapes_activer']) and $saisies['options']['etapes_activer']) {
     190                // Un premier parcourt pour compter les étapes
     191                foreach ($saisies as $cle => $saisie) {
     192                        if (is_array($saisies) and $saisie['saisie'] == 'fieldset') {
     193                                $etapes++;
     194                        }
     195                }
     196               
     197                // Seulement s'il y a au moins deux étapes
     198                if ($etapes > 1) {
     199                        $saisies_etapes = array();
     200                        $compteur_etape = 0;
     201                       
     202                        // On reparcourt pour lister les saisies
     203                        foreach ($saisies as $cle => $saisie) {
     204                                // Si c'est un groupe, on ajoute son contenu à l'étape
     205                                if (isset($saisie['saisie']) and $saisie['saisie'] == 'fieldset') {
     206                                        $compteur_etape++;
     207                                        // S'il y a eu des champs hors groupe avant, on fusionne
     208                                        if (isset($saisies_etapes[$compteur_etape]['saisies'])) {
     209                                                $saisies_precedentes = $saisies_etapes[$compteur_etape]['saisies'];
     210                                                $saisies_etapes[$compteur_etape] = $saisie;
     211                                                $saisies_etapes[$compteur_etape]['saisies'] = array_merge($saisies_precedentes, $saisie['saisies']);
     212                                        }
     213                                        else {
     214                                                $saisies_etapes[$compteur_etape] = $saisie;
     215                                        }
     216                                }
     217                                // Sinon si champ externe à un groupe, on l'ajoute à toutes les étapes
     218                                elseif (isset($saisie['saisie'])) {
     219                                        for ($e=1;$e<=$etapes;$e++) {
     220                                                if (!isset($saisies_etapes[$e]['saisies'])) {
     221                                                        $saisies_etapes[$e] = array('saisies'=>array());
     222                                                }
     223                                                array_push($saisies_etapes[$e]['saisies'], $saisie);
     224                                        }
     225                                }
     226                        }
     227                }
     228        }
     229       
     230        return $saisies_etapes;
    175231}
    176232
  • _plugins_/saisies/trunk/paquet.xml

    r114339 r114384  
    22        prefix="saisies"
    33        categorie="outil"
    4         version="3.16.0"
     4        version="3.17.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.2.*]"
     
    2727        <pipeline nom="formulaire_charger" inclure="saisies_pipelines.php" />
    2828        <pipeline nom="formulaire_verifier" inclure="saisies_pipelines.php" />
     29        <pipeline nom="formulaire_verifier_etape" inclure="saisies_pipelines.php" />
    2930        <pipeline nom="styliser" inclure="saisies_pipelines.php" />
    3031
  • _plugins_/saisies/trunk/saisies.css.html

    r104579 r114384  
    11#CACHE{3600*100,cache-client}
    22[(#REM)<style>]
    3 #HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
     3#HTTP_HEADER{Content-Type: text/css; charset=utf-8}
    44#HTTP_HEADER{Vary: Accept-Encoding}
    55
     
    5555/* avec crayons + formulaire de saisies, éviter un padding à gauche du label */
    5656.formulaire_crayon .editer-groupe .editer { padding-left:10px; }
     57
     58/* les étapes */
     59.formulaire_spip .etapes__items {
     60        list-style: none;
     61}
     62.formulaire_spip .etapes__item {
     63        display: inline-block;
     64}
     65.formulaire_spip .etapes__item:not(:first-child):before {
     66        content: ' → ';
     67}
  • _plugins_/saisies/trunk/saisies_pipelines.php

    r109884 r114384  
    120120                $contexte = saisies_lister_valeurs_defaut($saisies);
    121121                $flux['data'] = array_merge($contexte, $flux['data']);
    122 
     122               
     123                // On cherche si on gère des étapes
     124                if ($etapes = saisies_lister_par_etapes($saisies)) {
     125                        $flux['data']['_etapes'] = count($etapes);
     126                }
     127               
    123128                // On ajoute le tableau complet des saisies
    124129                $flux['data']['_saisies'] = $saisies;
     
    176181        include_spip('inc/saisies');
    177182        $saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args']);
    178         if ($saisies) {
    179                 // On ajoute au contexte les champs à déclarer
     183        if ($saisies and !saisies_lister_par_etapes($saisies)) {
    180184                $erreurs = saisies_verifier($saisies);
     185               
    181186                if ($erreurs and !isset($erreurs['message_erreur'])) {
    182187                        $erreurs['message_erreur'] = _T('saisies:erreur_generique');
     
    184189
    185190                $flux['data'] = array_merge($erreurs, $flux['data']);
    186 
    187         }
    188 
    189         return $flux;
    190 }
     191        }
     192
     193        return $flux;
     194}
     195
     196/**
     197 * Ajouter les vérifications déclarées dans la fonction "saisies" du CVT mais pour les étapes
     198 *
     199 * @see saisies_formulaire_charger()
     200 * @uses saisies_verifier()
     201 *
     202 * @param array $flux
     203 *     Liste des erreurs du formulaire
     204 * @return array
     205 *     iste des erreurs
     206 */
     207function saisies_formulaire_verifier_etape($flux) {
     208        // Il faut que la fonction existe et qu'elle retourne bien un tableau
     209        include_spip('inc/saisies');
     210        $saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args']);
     211        if ($saisies and $etapes = saisies_lister_par_etapes($saisies)) {
     212                // On récupère les sous-saisies de cette étape précise
     213                $saisies_etape = $etapes[$flux['args']['etape']]['saisies'];
     214               
     215                $erreurs = saisies_verifier($saisies_etape);
     216
     217                $flux['data'] = array_merge($erreurs, $flux['data']);
     218        }
     219
     220        return $flux;
     221}
Note: See TracChangeset for help on using the changeset viewer.