Browse Source

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…

svn/root/tags/v3.17.0 v3.17.0
rastapopoulos@spip.org 4 years ago
parent
commit
79ab8047fa
  1. 1
      .gitattributes
  2. 19
      demo/page-saisies_cvt.html
  3. 13
      formulaires/inc-saisies-cvt-etapes.html
  4. 20
      formulaires/inc-saisies-cvt.html
  5. 98
      formulaires/saisies_cvt.php
  6. 56
      inc/saisies_lister.php
  7. 3
      paquet.xml
  8. 15
      saisies.css.html
  9. 37
      saisies_pipelines.php

1
.gitattributes vendored

@ -17,6 +17,7 @@ formulaires/construire_formulaire.html -text
formulaires/construire_formulaire.php -text
formulaires/inc-construire_formulaire-actions.html -text
formulaires/inc-generer_saisies_configurables.html -text
formulaires/inc-saisies-cvt-etapes.html -text
formulaires/inc-saisies-cvt.html -text
formulaires/saisies_cvt.html -text
formulaires/saisies_cvt.php -text

19
demo/page-saisies_cvt.html

@ -1,4 +1,17 @@
<h1>CVT automatique avec Saisies</h1>
<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
<head>
<title>Demo Saisies CVT</title>
<INCLURE{fond=inclure/head} />
</head>
<body>
<div class="page">
<h1>CVT automatique avec Saisies</h1>
<p>Démonstration d'un formulaire CVT généré uniquement à partir d'une déclaration de Saisies</p>
#FORMULAIRE_SAISIES_CVT
<div class="ajax">
#FORMULAIRE_SAISIES_CVT
</div>
</div>
</body>
</html>

13
formulaires/inc-saisies-cvt-etapes.html

@ -0,0 +1,13 @@
<B_etapes>
<nav class="formulaire_spip__etapes etapes">
<ol class="etapes__items">
<BOUCLE_etapes(DATA){source table, #ENV{etapes}}>
<li class="etapes__item"[(#ENV{_etape}|=={#CLE}|oui) aria-current="step"]>
[(#ENV{_etape}|=={#CLE}|oui)<em>#VALEUR{options/label}</em>]
[(#ENV{_etape}|>{#CLE}|oui)<input type="submit" class="submit" name="_retour_etape_#CLE" value="#VALEUR{options/label}" />]
[(#ENV{_etape}|<{#CLE}|oui)<span>#VALEUR{options/label}</span>]
</li>
</BOUCLE_etapes>
</ol>
</nav>
</B_etapes>

20
formulaires/inc-saisies-cvt.html

@ -9,8 +9,17 @@
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
[(#ENV{_etape}|oui)
#SET{etapes, #ENV{_saisies}|saisies_lister_par_etapes}
<INCLURE{fond=formulaires/inc-saisies-cvt-etapes, etapes=#GET{etapes}, env} />
]
<[(#DIV|sinon{ul})] class="editer-groupe">
#GENERER_SAISIES{#ENV{_saisies}}
#SET{saisies, #ENV{_saisies}}
[(#ENV{_etape}|oui)
#SET{saisies, #GET{etapes}|table_valeur{#ENV{_etape}/saisies}}
]
#GENERER_SAISIES{#GET{saisies}}
</[(#DIV|sinon{ul})]>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
@ -18,7 +27,14 @@
<p class="boutons">
<span class="image_loading"></span>
<input type="submit" class="submit" value="[(#ENV{_saisies/options/texte_submit, #ENV{saisies_texte_submit, <:bouton_enregistrer:>}})]" />
[(#SET{label_valider, #ENV{_saisies/options/texte_submit, #ENV{saisies_texte_submit, <:bouton_enregistrer:>}}})]
[(#ENV{_etape}|et{#ENV{_etape}|!={#ENV{_etapes}}})
[(#SET{label_valider, #ENV{_saisies/options/etapes_suivant, <:bouton_suivant:>}})]
]
[(#ENV{_etape}|>{1}|oui)
<input type="submit" class="submit" name="_retour_etape_[(#ENV{_etape}|moins{1})]" value="[(#ENV{_saisies/options/etapes_precedent, <:bouton_precedent:>})]" />
]
<input type="submit" class="submit" value="#GET{label_valider}" />
</p>
</div></form>
]

98
formulaires/saisies_cvt.php

@ -10,60 +10,96 @@ function formulaires_saisies_cvt_saisies_dist() {
$saisies = array(
'options' => array(
'texte_submit' => 'Prout !',
'activer_etapes' => true,
'texte_submit' => 'Pouet !',
'etapes_activer' => true,
'etapes_suivant' => 'Suivant pouet',
'etapes_precedent' => 'Précédent pouet',
'etapes_navigation' => 'on',
),
array(
'saisie' => 'input',
'saisie' => 'fieldset',
'options' => array(
'nom' => 'nom',
'label' => 'Nom'
)
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'email',
'obligatoire' => 'oui',
'label' => 'E-mail'
'nom' => 'persos',
'label' => 'Informations personnelles',
),
'saisies' => array(
array(
'saisie' => 'input',
'options' => array(
'nom' => 'nom',
'label' => 'Nom'
)
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'email',
'obligatoire' => 'oui',
'label' => 'E-mail'
),
'verifier' => array(
'type' => 'email'
)
),
array(
'saisie' => 'input',
'options' => array(
'nom' => 'a_supprimer',
'label' => 'Un champ à supprimer'
)
),
),
'verifier' => array(
'type' => 'email'
)
),
array(
'saisie' => 'input',
'saisie' => 'case',
'options' => array(
'nom' => 'a_supprimer',
'label' => 'Un champ à supprimer'
)
'nom' => 'out',
'label_case' => 'Un champ à l’extérieur des groupes'
),
),
array(
'saisie' => 'textarea',
'saisie' => 'fieldset',
'options' => array(
'nom' => 'message',
'obligatoire' => 'oui',
'label' => 'Un message'
'nom' => 'ecrire',
'label' => 'Des choses à dire',
),
'saisies' => array(
array(
'saisie' => 'input',
'options' => array(
'nom' => 'sujet',
'label' => 'Sujet'
)
),
array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'message',
'obligatoire' => 'oui',
'label' => 'Un message',
'conteneur_class' => 'pleine_largeur',
),
'verifier' => array(
'type' => 'taille',
'options' => array('min' => 10)
)
),
),
'verifier' => array(
'type' => 'taille',
'options' => array('min' => 10)
)
)
),
);
$chemin = saisies_chercher($saisies, 'a_supprimer', true);
$saisies = saisies_supprimer($saisies, $chemin);
$saisies = saisies_dupliquer($saisies, 'message');
$saisies = saisies_deplacer($saisies, 'email', 'nom');
var_dump($saisies);
//var_dump($saisies);
return $saisies;
}
function formulaires_saisies_cvt_charger() {
$contexte = array(
'saisies_texte_submit' => 'Caca !',
'saisies_texte_submit' => 'Prout !',
);
return $contexte;

56
inc/saisies_lister.php

@ -174,6 +174,62 @@ function saisies_lister_par_type($contenu) {
return $saisies;
}
/**
* Liste les saisies par étapes s'il y en a
*
* @param array $saisies
* Liste des saisies
* @return array|bool
* Retourne un tableau associatif par numéro d'étape avec pour chacune leurs saisies, false si pas d'étapes
*/
function saisies_lister_par_etapes($saisies) {
$saisies_etapes = false;
$etapes = 0;
if (isset($saisies['options']['etapes_activer']) and $saisies['options']['etapes_activer']) {
// Un premier parcourt pour compter les étapes
foreach ($saisies as $cle => $saisie) {
if (is_array($saisies) and $saisie['saisie'] == 'fieldset') {
$etapes++;
}
}
// Seulement s'il y a au moins deux étapes
if ($etapes > 1) {
$saisies_etapes = array();
$compteur_etape = 0;
// On reparcourt pour lister les saisies
foreach ($saisies as $cle => $saisie) {
// Si c'est un groupe, on ajoute son contenu à l'étape
if (isset($saisie['saisie']) and $saisie['saisie'] == 'fieldset') {
$compteur_etape++;
// S'il y a eu des champs hors groupe avant, on fusionne
if (isset($saisies_etapes[$compteur_etape]['saisies'])) {
$saisies_precedentes = $saisies_etapes[$compteur_etape]['saisies'];
$saisies_etapes[$compteur_etape] = $saisie;
$saisies_etapes[$compteur_etape]['saisies'] = array_merge($saisies_precedentes, $saisie['saisies']);
}
else {
$saisies_etapes[$compteur_etape] = $saisie;
}
}
// Sinon si champ externe à un groupe, on l'ajoute à toutes les étapes
elseif (isset($saisie['saisie'])) {
for ($e=1;$e<=$etapes;$e++) {
if (!isset($saisies_etapes[$e]['saisies'])) {
$saisies_etapes[$e] = array('saisies'=>array());
}
array_push($saisies_etapes[$e]['saisies'], $saisie);
}
}
}
}
}
return $saisies_etapes;
}
/**
* Prend la description complète du contenu d'un formulaire et retourne
* une liste des noms des champs du formulaire.

3
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="saisies"
categorie="outil"
version="3.16.0"
version="3.17.0"
etat="stable"
compatibilite="[3.0.0;3.2.*]"
logo="images/logo_saisie_48.png"
@ -26,6 +26,7 @@
<pipeline nom="saisies_verifier" action="" />
<pipeline nom="formulaire_charger" inclure="saisies_pipelines.php" />
<pipeline nom="formulaire_verifier" inclure="saisies_pipelines.php" />
<pipeline nom="formulaire_verifier_etape" inclure="saisies_pipelines.php" />
<pipeline nom="styliser" inclure="saisies_pipelines.php" />
<menu nom="saisies_doc" titre="saisies:titre_page_saisies_doc" parent="menu_developpement" icone="images/saisies-16.png" />

15
saisies.css.html

@ -1,6 +1,6 @@
#CACHE{3600*100,cache-client}
[(#REM)<style>]
#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
#HTTP_HEADER{Content-Type: text/css; charset=utf-8}
#HTTP_HEADER{Vary: Accept-Encoding}
#SET{left,#LANG_DIR|choixsiegal{ltr,left,right}}
@ -53,4 +53,15 @@
}
/* avec crayons + formulaire de saisies, éviter un padding à gauche du label */
.formulaire_crayon .editer-groupe .editer { padding-left:10px; }
.formulaire_crayon .editer-groupe .editer { padding-left:10px; }
/* les étapes */
.formulaire_spip .etapes__items {
list-style: none;
}
.formulaire_spip .etapes__item {
display: inline-block;
}
.formulaire_spip .etapes__item:not(:first-child):before {
content: ' → ';
}

37
saisies_pipelines.php

@ -119,7 +119,12 @@ function saisies_formulaire_charger($flux) {
// On ajoute au contexte les champs à déclarer
$contexte = saisies_lister_valeurs_defaut($saisies);
$flux['data'] = array_merge($contexte, $flux['data']);
// On cherche si on gère des étapes
if ($etapes = saisies_lister_par_etapes($saisies)) {
$flux['data']['_etapes'] = count($etapes);
}
// On ajoute le tableau complet des saisies
$flux['data']['_saisies'] = $saisies;
}
@ -175,15 +180,41 @@ function saisies_formulaire_verifier($flux) {
// Il faut que la fonction existe et qu'elle retourne bien un tableau
include_spip('inc/saisies');
$saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args']);
if ($saisies) {
// On ajoute au contexte les champs à déclarer
if ($saisies and !saisies_lister_par_etapes($saisies)) {
$erreurs = saisies_verifier($saisies);
if ($erreurs and !isset($erreurs['message_erreur'])) {
$erreurs['message_erreur'] = _T('saisies:erreur_generique');
}
$flux['data'] = array_merge($erreurs, $flux['data']);
}
return $flux;
}
/**
* Ajouter les vérifications déclarées dans la fonction "saisies" du CVT mais pour les étapes
*
* @see saisies_formulaire_charger()
* @uses saisies_verifier()
*
* @param array $flux
* Liste des erreurs du formulaire
* @return array
* iste des erreurs
*/
function saisies_formulaire_verifier_etape($flux) {
// Il faut que la fonction existe et qu'elle retourne bien un tableau
include_spip('inc/saisies');
$saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args']);
if ($saisies and $etapes = saisies_lister_par_etapes($saisies)) {
// On récupère les sous-saisies de cette étape précise
$saisies_etape = $etapes[$flux['args']['etape']]['saisies'];
$erreurs = saisies_verifier($saisies_etape);
$flux['data'] = array_merge($erreurs, $flux['data']);
}
return $flux;

Loading…
Cancel
Save