Browse Source

Issue #89, pb 2 (conditionner toute une étape par afficher_si).

Etape a. Tester les futures étapes, et tant que condition d'afficher_si
pas rempli, avancer à l'étape suivante.

Attention cela nécessite des ajustements du core pas encore
officiellement releasés, mais présent dans :
  - SPIP 3.3/4
  - ou spip 3.2.12
Le fichier du core concerné est `inc/cvt_multietape.php`.

Cela nécessite également une reéécriture du retour de la fonction
`saisies_lister_par_etapes()`, qui au lieu de renvoyer
```
array(
  x => array(...),
  y => array(...),
  z => array(...),
)
```

renvoie désormais

```
array(
  etape_x => array(...),
  etape_y => array(...),
  etape_z => array(...),
)
```

En dehors de saisies et formidable, personne n'utilise encore pour
l'instant cette fonction, donc on peut se permettre la rupture.

But : `saisies_verifier_afficher_si()` supprime du tableau de saisies les étapes masquées par
afficher_si, et utilise par ailleurs des `array_merge()` sur le tableau de saisies pour gérer la récursion. Si on garde des clés strictement numériques, alors, en
supposant que l'étape y est masquée par afficher si, on obtient un
tableau de saisies de type

```
array(
  x => array(...),
  y => array(...),
)
```

et non pas, comme on le désirerait

```
array(
  x => array(...),
  z => array(...),
)
```

En préfixant les les clés, on obtient bien

```
array(
  etape_x => array(...),
  etape_z => array(...),
)
```

Ce qui permet de ne pas tenter à l'étape y d'appliquer les vérifications de l'étape z.
pull/112/head
Maïeul 2 years ago
parent
commit
47a9053508
  1. 9
      formulaires/inc-saisies-cvt-etapes.html
  2. 2
      formulaires/inc-saisies-cvt.html
  3. 2
      inc/saisies_afficher_si_js.php
  4. 51
      inc/saisies_formulaire.php
  5. 13
      inc/saisies_lister.php
  6. 43
      inc/saisies_verifier.php
  7. 2
      inclure/generer_saisies.html
  8. 19
      saisies_pipelines.php

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

@ -2,10 +2,11 @@
<nav class="formulaire_spip__etapes etapes" aria-label="<:saisies:etapes_formulaire:>">
<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>]
#SET{etape,#CLE|replace{etape_,''}}
<li class="etapes__item"[(#ENV{_etape}|=={#GET{etape}}|oui) aria-current="step"]>
[(#ENV{_etape}|=={#GET{etape}}|oui)<em>#VALEUR{options/label}</em>]
[(#ENV{_etape}|>{#GET{etape}}|oui)<input type="submit" class="submit" name="_retour_etape_#GET{etape}" value="#VALEUR{options/label}" />]
[(#ENV{_etape}|<{#GET{etape}}|oui)<span>#VALEUR{options/label}</span>]
</li>
</BOUCLE_etapes>
</ol>

2
formulaires/inc-saisies-cvt.html

@ -16,7 +16,7 @@
<[(#DIV|sinon{ul})] class="editer-groupe">
#SET{saisies, #ENV{_saisies}}
[(#ENV{_etape}|oui)
#SET{saisies, #GET{etapes}|table_valeur{#ENV{_etape}/saisies}}
#SET{saisies, #GET{etapes}|table_valeur{etape_#ENV{_etape}/saisies}}
#GENERER_SAISIES{#GET{saisies},saisies_par_etapes=#ENV{_saisies_par_etapes}}
]
[(#ENV{_etape}|non)

2
inc/saisies_afficher_si_js.php

@ -27,7 +27,7 @@ function saisies_afficher_si_js($condition, $saisies_par_etapes = array()) {
}
$saisies_par_etapes = pipeline('saisies_afficher_si_saisies', $saisies_par_etapes);
if ($etape = _request('_etape')) {
$saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes[$etape]['saisies']);
$saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes["etape_$etape"]['saisies']);
$saisies_toutes_par_nom = saisies_lister_par_nom($saisies_par_etapes);
} else {
$saisies_toutes_par_nom = $saisies_etape_courante_par_nom = saisies_lister_par_nom($saisies_par_etapes);

51
inc/saisies_formulaire.php

@ -69,3 +69,54 @@ function saisies_generer_nom($formulaire, $type_saisie) {
}
/**
* Détermine si peut faire une avance rapide en sautant des étapes qui sont "masquées" par afficher_si
* @param array $saisies le tableau d'ensemble des saisies
* @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
* @return int l'étape où avancer
**/
function saisies_determiner_avance_rapide($saisies, $etape) {
return saisies_determiner_deplacement_rapide($saisies, $etape, +1);
}
/**
* Détermine si peut faire un recul rapide en sautant des étapes qui sont "masquées" par afficher_si
* @param array $saisies le tableau d'ensemble des saisies
* @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
* @return int l'étape où avancer
**/
function saisies_determiner_recul_rapide($saisies, $etape) {
return saisies_determiner_deplacement_rapide($saisies, $etape, -1);
}
/**
* Détermine si peut faire un déplacement rapide en sautant des étapes qui sont "masquées" par afficher_si
* Pour le confort de lecture, on pourra préférer les fonctions appellantes
* `saisies_determiner_avance_rapide()` et `saisies_determiner_recul_rapide()`
* @param array $saisies le tableau d'ensemble des saisies
* @param int $etape l'étape à partir de laquelle on commence à tester les étapes suivantes
* @param int $sens 1 (avance) ou -1 (recule)
* @return int l'étape où avancer
**/
function saisies_determiner_deplacement_rapide($saisies, $etape, $sens) {
if (abs($sens) != 1) {
spip_log("Argument $sens invalide dans saisies_determiner_deplacement_rapide ($sens)", 'saisies.'._LOG_ERREUR);
return $etape;
}
$saisies_par_etapes = saisies_lister_par_etapes($saisies);
$saisies_afficher_si_liste_masquees = saisies_afficher_si_liste_masquees('get');
$nb_total_etapes = count($saisies_par_etapes);
$i = $etape + $sens;
$etape_a_conserver = false;//Basculé à true dès qu'un afficher_si réussit ou si pas d'afficher_si
while (!$etape_a_conserver and $i <= $nb_total_etapes) {//Tester les futures étapes 1 par 1
$etape = $saisies_par_etapes["etape_$i"];
if (!isset($etape['options']['afficher_si']) or !$etape['options']['afficher_si']) {
$etape_a_conserver = true;
} elseif (!in_array($etape, $saisies_afficher_si_liste_masquees)) {
$etape_a_conserver = true;
} else {
$i = $i + $sens;
}
}
return $i;
}

13
inc/saisies_lister.php

@ -204,6 +204,7 @@ function saisies_lister_par_type($contenu) {
* 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
* Retourne un tableau associatif "etape_xxx" => "contenu de l'étape" avec pour chacune leurs saisies, false si pas d'étapes
* Les noms des étapes sont automatiquement passés dans _T_ou_typo
*/
function saisies_lister_par_etapes($saisies) {
@ -230,15 +231,15 @@ function saisies_lister_par_etapes($saisies) {
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']);
if (isset($saisies_etapes["etape_$compteur_etape"]['saisies'])) {
$saisies_precedentes = $saisies_etapes["etape_$compteur_etape"]['saisies'];
$saisies_etapes["etape_$compteur_etape"] = $saisie;
$saisies_etapes["etape_$compteur_etape"]['saisies'] = array_merge($saisies_precedentes, $saisie['saisies']);
}
else {
$saisies_etapes[$compteur_etape] = $saisie;
$saisies_etapes["etape_$compteur_etape"] = $saisie;
}
$saisies_etapes[$compteur_etape]['options']['label'] = _T_ou_typo($saisies_etapes[$compteur_etape]['options']['label']);
$saisies_etapes["etape_$compteur_etape"]['options']['label'] = _T_ou_typo($saisies_etapes["etape_$compteur_etape"]['options']['label']);
}
// Sinon si champ externe à un groupe, on l'ajoute à toutes les étapes
elseif (isset($saisie['saisie'])) {

43
inc/saisies_verifier.php

@ -24,27 +24,35 @@ function saisies_verifier($formulaire, $saisies_masquees_empty_string = true, $e
include_spip('inc/verifier');
$verif_fonction = charger_fonction('verifier', 'inc', true);
// Lister les saisies par étapes, si besoin
if (is_numeric($etape)) {
$saisies_par_etapes = saisies_lister_par_etapes($formulaire);
} else {
$saisies_par_etapes = $formulaire;
}
// Enlever les afficher_si non vérifié, si besoin
if ($saisies_masquees_empty_string) {
$saisies_toutes_etapes = saisies_verifier_afficher_si($formulaire);
$saisies_par_etapes_apres_verification_afficher_si = saisies_verifier_afficher_si($saisies_par_etapes);
} else {
$saisies_toutes_etapes = $formulaires;
$saisies_par_etapes_apres_verification_afficher_si = $saisies_par_etapes;
}
// Trouver les saisies de l'étape courante
if (is_numeric($etape)) {
$saisies_par_etapes = saisies_lister_par_etapes($saisies_toutes_etapes);
if (isset($saisies_par_etapes[$etape])) {
$saisies_par_nom = saisies_lister_par_nom($saisies_par_etapes[$etape]['saisies']);
} else {//Sécurité si on n'a pas l'étape courante...
$saisies_par_nom = saisies_lister_par_nom($saisies_toutes_etapes);
if (isset($saisies_par_etapes_apres_verification_afficher_si["etape_$etape"])) {
$saisies_etape_courante_apres_verification_afficher_si = $saisies_par_etapes_apres_verification_afficher_si["etape_$etape"]['saisies'];
} else {//Si jamais l'étape courante a été masquée par afficher_si
$saisies_etape_courante_apres_verification_afficher_si = array();
}
} else {
$saisies_par_etapes = array();
$saisies_par_nom = saisies_lister_par_nom($saisies_toutes_etapes);
$saisies_etape_courante_apres_verification_afficher_si = $saisies_par_etapes_apres_verification_afficher_si;
}
$saisies_etape_courante_apres_verification_afficher_si_par_nom = saisies_lister_par_nom($saisies_etape_courante_apres_verification_afficher_si);
// Vérifier si c'est obligatoire
$erreurs = saisies_verifier_obligatoire($saisies_par_nom);
foreach ($saisies_par_nom as $saisie) {
$erreurs = saisies_verifier_obligatoire($saisies_etape_courante_apres_verification_afficher_si_par_nom);
foreach ($saisies_etape_courante_apres_verification_afficher_si_par_nom as $saisie) {
$champ = $saisie['options']['nom'];
if (isset($saisie['verifier']) and $saisie['verifier']) {
$verifier = $saisie['verifier'];
@ -84,17 +92,16 @@ function saisies_verifier($formulaire, $saisies_masquees_empty_string = true, $e
array(
'args'=>array(
'formulaire' => $formulaire,
'saisies' => $saisies_par_nom,
'saisies_apres_verification_afficher_si' => $saisies_toutes_etapes,
'saisies_apres_verification_afficher_si_par_etapes' => $saisies_par_etapes,
'saisies_apres_verification_afficher_si_par_nom' => $saisies_par_nom,
'saisies' => $saisies_etape_courante_apres_verification_afficher_si_par_nom,
'saisies_par_etapes' => $saisies_par_etapes,
'saisies_par_etapes_apres_verification_afficher_si' => $saisies_par_etapes_apres_verification_afficher_si,
'saisies_etape_courante_apres_verification_afficher_si' => $saisies_etape_courante_apres_verification_afficher_si,
'saisies_masquees_empty_string' => $saisies_masquees_empty_string,
'etape' => $etape
),
'data' => $erreurs
)
);
return $erreurs;
}

2
inclure/generer_saisies.html

@ -40,7 +40,7 @@
[(#ENV{_etape}|oui)
#SET{saisies_par_etapes, #ENV*{saisies_par_etapes}|sinon{#ENV*{_saisies_par_etapes}}|sinon{#ENV*{saisies}|saisies_lister_par_etapes}}
#SET{saisies, #GET{saisies_par_etapes/#ENV{_etape}/saisies}}
#SET{saisies, #GET{saisies_par_etapes/etape_#ENV{_etape}/saisies}}
]
<BOUCLE_contenu(POUR){tableau #GET{saisies}}>

19
saisies_pipelines.php

@ -273,7 +273,6 @@ function saisies_formulaire_verifier($flux) {
$flux['data'] = array_merge($erreurs, $flux['data']);
}
return $flux;
}
@ -293,15 +292,29 @@ function saisies_formulaire_verifier_etape($flux) {
if ($saisies) {
//A quelle étape est-on ?
$etape = $flux['args']['etape'];
$erreurs = saisies_verifier($saisies, true, $etape);
$flux['data'] = array_merge($erreurs, $flux['data']);
// Si on est en train de vérifier la dernière étape courante et qu'elle n'a pas d'erreur, alors voir si on peut sauter les étapes suivantes
if (
isset($flux['args']['etape_saisie'])
and $etape == $flux['args']['etape_saisie']
and empty($flux['data'])
and (!$flux['args']['etape_demandee'] or $flux['args']['etape_demandee'] > $etape)
) {
if (
$avance_rapide = saisies_determiner_avance_rapide($saisies, $etape)
and $avance_rapide != $etape + 1
) {
set_request('aller_a_etape', $avance_rapide);
$flux['args']['etape_demandee'] = $avance_rapide;
}
}
}
return $flux;
}
/**
* Retourne une chaine renvoyant les functions js de masquage/affiche
**/

Loading…
Cancel
Save