[SPIP] v3.2.11 -> v3.2.12
[lhc/web/www.git] / www / ecrire / inc / cvt_multietapes.php
index 8d9bb5e..4bd3d13 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2017                                                *
+ *  Copyright (c) 2001-2019                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -208,7 +208,7 @@ function cvtmulti_formulaire_verifier($flux) {
 
 /**
  * Verifier les etapes de saisie
- * 
+ *
  * @param array $args
  * @param $erreurs
  * @return array
@@ -221,13 +221,15 @@ function cvtmulti_formulaire_verifier_etapes($args, $erreurs) {
        ) {
                // recuperer l'etape saisie et le nombre d'etapes total
                list($etape, $etapes) = $e;
-               $etape_demandee = _request('aller_a_etape'); // possibilite de poster en entier dans aller_a_etape
+               $etape_demandee = intval(_request('aller_a_etape')); // possibilite de poster un entier dans aller_a_etape
 
+               $args['etape_saisie'] = $etape;
+               $args['etapes'] = $etapes;
                // lancer les verifs pour chaque etape deja saisie de 1 a $etape
                $erreurs_etapes = array();
                $derniere_etape_ok = 0;
                $e = 0;
-               while ($e < $etape and $e < $etapes) {
+               while ($e < max($etape, $etape_demandee -1) and $e < $etapes) {
                        $e++;
                        $erreurs_etapes[$e] = array();
                        if ($verifier = charger_fonction("verifier_$e", "formulaires/$form/", true)) {
@@ -239,6 +241,7 @@ function cvtmulti_formulaire_verifier_etapes($args, $erreurs) {
                        }
                        // et on appelle un pipeline dedie aux etapes, plus easy
                        $args['etape'] = $e;
+                       $args['etape_demandee'] = $etape_demandee;
                        $erreurs_etapes[$e] = pipeline(
                                'formulaire_verifier_etape',
                                array(
@@ -250,15 +253,21 @@ function cvtmulti_formulaire_verifier_etapes($args, $erreurs) {
                        if ($derniere_etape_ok == $e - 1 and !count($erreurs_etapes[$e])) {
                                $derniere_etape_ok = $e;
                        }
-                       // possibilite de poster dans _retour_etape_x
+                       // possibilite de poster dans _retour_etape_x ou aller_a_etape
                        if (!is_null(_request("_retour_etape_$e"))) {
                                $etape_demandee = $e;
                        }
+                       // Il se peut que les verifications ait décidé de faire sauter des étapes
+                       if ($aller_a_etape = intval(_request('aller_a_etape'))) {
+                               $etape_demandee = $aller_a_etape; // possibilite de poster un entier dans aller_a_etape
+                       }
                }
 
+
                // si la derniere etape OK etait la derniere
                // on renvoie le flux inchange et ca declenche traiter
-               if ($derniere_etape_ok == $etapes and !$etape_demandee) {
+               if ($derniere_etape_ok == $etapes
+                       and (!$etape_demandee or $etape_demandee>=$etapes)) {
                        return $erreurs;
                } else {
                        $etape = $derniere_etape_ok + 1;
@@ -271,7 +280,9 @@ function cvtmulti_formulaire_verifier_etapes($args, $erreurs) {
                        $erreurs = isset($erreurs_etapes[$etape]) ? $erreurs_etapes[$etape] : array();
                        // Ne pas se tromper dans le texte du message d'erreur : la clé '_etapes' n'est pas une erreur !
                        if ($erreurs) {
-                               $erreurs['message_erreur'] = singulier_ou_pluriel(count($erreurs), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
+                               if (!isset($erreurs['message_erreur'])) {
+                                       $erreurs['message_erreur'] = singulier_ou_pluriel(count($erreurs), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
+                               }
                        } else {
                                $erreurs['message_erreur'] = "";
                        }