From 9d338d9b6883644709255e5836d8f0b22a6112ff Mon Sep 17 00:00:00 2001
From: "maieul@maieul.net" <>
Date: Sun, 17 Mar 2019 16:00:17 +0000
Subject: [PATCH] =?UTF-8?q?Passer=20les=20=C3=A9tapes=20et=20l'=C3=A9tape?=
 =?UTF-8?q?=20courante=20=C3=A0=20la=20v=C3=A9rif=20propre=20=C3=A0=20chaq?=
 =?UTF-8?q?ue=20traitement.=20Utiliser=20cette=20v=C3=A9rif=20=C3=A0=20cha?=
 =?UTF-8?q?que=20=C3=A9tape.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Pour le traitement enregistrer, tester l'unicité d'un champ si le champ
est dans l'étape courante.
---
 formulaires/formidable.php | 14 +++++++++-----
 traiter/enregistrement.php | 12 ++++++++++--
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/formulaires/formidable.php b/formulaires/formidable.php
index d80c4e7d..c0c9e1fb 100644
--- a/formulaires/formidable.php
+++ b/formulaires/formidable.php
@@ -248,9 +248,9 @@ function formulaires_formidable_verifier_etape_dist($etape, $id, $valeurs = arra
 	include_spip('inc/saisies');
 	$saisies = saisies_chercher_formulaire('formidable', array($id, $valeurs, $id_formulaires_reponse));
 
-	// Seulement si on est à la DERNIÈRE étape, on lance les vérifications propres aux traitements
-	if ($saisies and $etapes = saisies_lister_par_etapes($saisies) and $etape==count($etapes)) {
-		$erreurs = formulaires_formidable_verifier_traitements($id, $valeurs, $id_formulaires_reponse);
+	// On lance les vérifications propres aux traitements à chaque étape, pour avoir les messages d'erreurs à chaque étape
+	if ($saisies and $etapes = saisies_lister_par_etapes($saisies)) {
+		$erreurs = formulaires_formidable_verifier_traitements($id, $valeurs, $id_formulaires_reponse, $etapes, $etape);
 	}
 
 	return $erreurs;
@@ -266,11 +266,13 @@ function formulaires_formidable_verifier_etape_dist($etape, $id, $valeurs = arra
  *     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
  * @param int|bool $id_formulaires_reponse
  *     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
- *
+ * @param array $etapes
+ *		 Liste des saisies, ordonnées par étape
+ * @param int|null $etape le numéro de l'étape courante
  * @return array
  *     Tableau des erreurs
  */
-function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $id_formulaires_reponse = false) {
+function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $id_formulaires_reponse = false, $etapes = array(), $etape = null) {
 	$erreurs = array();
 
 	if (
@@ -289,6 +291,8 @@ function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $i
 						'id_formulaire' => $formulaire['id_formulaire'],
 						'valeurs' => $valeurs,
 						'id_formulaires_reponse' => $id_formulaires_reponse,
+						'etapes' => $etapes,
+						'etape' => $etape
 					),
 					$erreurs
 				);
diff --git a/traiter/enregistrement.php b/traiter/enregistrement.php
index 6ed6be6e..44e7fa6b 100644
--- a/traiter/enregistrement.php
+++ b/traiter/enregistrement.php
@@ -194,8 +194,16 @@ function traiter_enregistrement_verifier_dist($args, $erreurs) {
 	$id_formulaire = $args['id_formulaire'];
 	$options = $args['options'];
 	$id_formulaires_reponse = $args['id_formulaires_reponse'];
-
-	if (($unicite = $options['unicite']) != '' and !$erreurs[$unicite]) {
+	$etape = $args['etape'];
+	if (($unicite = $options['unicite']) != '' and !$erreurs[$unicite]
+		and
+		(
+			$etape === null
+			or (
+			 array_key_exists($unicite, saisies_lister_par_nom(array($args['etapes'][$etape])))
+			)
+		)
+	) {
 		if (!$id_formulaires_reponse) { // si pas de réponse explictement passée au formulaire, on cherche la réponse qui serait édité
 			$id_formulaires_reponse = formidable_trouver_reponse_a_editer($id_formulaire, $id_formulaires_reponse, $options);
 		}
-- 
GitLab