From dfcf2af0fbd15cc15618944fae567644f4b19918 Mon Sep 17 00:00:00 2001
From: "maieul@maieul.net" <>
Date: Thu, 11 Oct 2018 20:53:52 +0000
Subject: [PATCH] =?UTF-8?q?refactorisation=20du=20code=20:=20une=20seule?=
 =?UTF-8?q?=20fonction=20pour=20trouver=20la=20r=C3=A9ponse=20qui=20doit?=
 =?UTF-8?q?=20=C3=AAtre=20modifi=C3=A9=20si=20on=20autorise=20la=20modific?=
 =?UTF-8?q?ation=20des=20r=C3=A9ponses=20Pour=20le=20moment=20appeller:=20?=
 =?UTF-8?q?=20=20-=20lors=20du=20chargement=20du=20formulaire=20=20=20-=20?=
 =?UTF-8?q?lors=20de=20l'enregistrement=20des=20r=C3=A9ponses?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 formulaires/formidable.php | 45 ++++++++++++----------------------
 inc/formidable.php         | 50 ++++++++++++++++++++++++++++++++++++++
 traiter/enregistrement.php | 30 +----------------------
 3 files changed, 66 insertions(+), 59 deletions(-)

diff --git a/formulaires/formidable.php b/formulaires/formidable.php
index 62d0a6d3..8fbf289c 100644
--- a/formulaires/formidable.php
+++ b/formulaires/formidable.php
@@ -126,36 +126,17 @@ function formulaires_formidable_charger($id, $valeurs = array(), $id_formulaires
 				}
 			}
 
-			// Si on passe un identifiant de reponse, on edite cette reponse si elle existe
-			if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
-				$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
-				if ($ok == false) {
-					$contexte['editable'] = false;
-					$contexte['message_erreur'] = _T(
-						'formidable:traiter_enregistrement_erreur_edition_reponse_inexistante'
-					);
-				}
-			} else {
-				// calcul des paramètres d'anonymisation
-				$options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
-
-				$anonymisation = (isset($options['anonymiser']) && $options['anonymiser']==true)
-					? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
-					: '';
-
-				// Si multiple = non mais que c'est modifiable, alors on va chercher
-				// la dernière réponse si elle existe
-				if ($options
-					and !$options['multiple']
-					and $options['modifiable']
-					and $reponses = formidable_verifier_reponse_formulaire(
-						$formulaire['id_formulaire'],
-						$options['identification'],
-						$anonymisation
-					)) {
-					$id_formulaires_reponse = array_pop($reponses);
-					$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
-				}
+			//trouver la réponse à éditer
+			$options_enregistrement = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
+			$id_formulaires_reponse = formidable_trouver_reponse_a_editer($formulaire['id_formulaire'], $id_formulaires_reponse, $options_enregistrement);
+
+			// adapter le contexte en conséquence
+			$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
+			if ($ok == false) {
+				$contexte['editable'] = false;
+				$contexte['message_erreur'] = _T(
+					'formidable:traiter_enregistrement_erreur_edition_reponse_inexistante'
+				);
 			}
 		} else {
 			$contexte['editable'] = false;
@@ -539,6 +520,10 @@ function formulaires_formidable_fichiers($id, $valeurs = array(), $id_formulaire
  **/
 function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) {
 
+	if ($id_formulaires_reponse == false) {
+		$ok = true;
+		return $contexte;
+	}
 	// On prépare des infos si jamais on a des champs fichiers
 	$saisies_fichiers = saisies_lister_avec_type($contexte['_saisies'], 'fichiers');// les saisies de type fichier
 	$fichiers = array();
diff --git a/inc/formidable.php b/inc/formidable.php
index 4f0d7a86..210bf62c 100644
--- a/inc/formidable.php
+++ b/inc/formidable.php
@@ -92,6 +92,56 @@ function formidable_generer_nom_cookie($id_formulaire) {
 	return $GLOBALS['cookie_prefix'].'cookie_formidable_'.$id_formulaire;
 }
 
+
+/*
+ * Trouver la réponse à éditer pour un formulaire donné,
+ * dans un contexte donné
+ * en fonction de la configuration du formulaire.
+ * @param int $id_formulaire L'identifiant du formulaire
+ * @param int $id_formulaires_reponse L'identifant de réponse passé au moment de l'appel du formulaire
+ * @param array $options Les options d'enregistrement du formulaire
+ * @param boolean $verifier_est_auteur si égal à true, on vérifie si $id_formulaires_reponse est passé que l'auteur connecté est bien l'auteur de la réponse passée en argument
+ * @return int $id_formulaires_reponse L'identifiant de la réponse à modifier effectivement.
+ *
+ */
+function formidable_trouver_reponse_a_editer($id_formulaire, $id_formulaires_reponse, $options, $verifier_est_auteur = false) {
+	// Si on passe un identifiant de reponse, on edite cette reponse si elle existe
+	if ($id_formulaires_reponse = intval($id_formulaires_reponse) and $verifier_est_auteur == false) {
+		return $id_formulaires_reponse;
+	} else {
+		// calcul des paramètres d'anonymisation
+		$anonymisation = (isset($options['anonymiser']) && $options['anonymiser'] == 'on')
+			? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
+			: '';
+
+		$reponses = formidable_verifier_reponse_formulaire(
+			$id_formulaire,
+			$options['identification'],
+			$anonymisation
+		);
+
+		//A-t-on demandé de vérifier que l'auteur soit bien celui de la réponse?
+		if ($id_formulaires_reponse = intval($id_formulaires_reponse)
+			and $verifier_est_auteur == true) {
+			if (in_array($id_formulaires_reponse, $reponses) == false) {
+				$id_formulaires_reponse = false;
+			}
+			return $id_formulaires_reponse;
+		}
+
+		// Si multiple = non mais que c'est modifiable, alors on va chercher
+		// la dernière réponse si elle existe
+		if ($options
+			and !$options['multiple']
+			and $options['modifiable']
+			and is_array($reponses)
+			) {
+				$id_formulaires_reponse = array_pop($reponses);
+		}
+	}
+	return $id_formulaires_reponse;
+}
+
 /*
  * Vérifie si le visiteur a déjà répondu à un formulaire
  *
diff --git a/traiter/enregistrement.php b/traiter/enregistrement.php
index ae85f262..beaa5f19 100644
--- a/traiter/enregistrement.php
+++ b/traiter/enregistrement.php
@@ -39,35 +39,7 @@ function traiter_enregistrement_dist($args, $retours) {
 
 	// On regarde si c'est une modif d'une réponse existante
 	$id_formulaires_reponse = $args['id_formulaires_reponse'];
-
-	// recherche d'éventuelles anciennes réponses
-	$reponses = formidable_verifier_reponse_formulaire(
-		$id_formulaire,
-		$options['identification'],
-		($options['anonymiser'] == 'on')
-			? $options['anonymiser_variable']
-			: false
-	);
-
-	// pas d'id_formulaires_reponse : on cherche une éventuelle réponse en base
-	if ($id_formulaires_reponse == false) {
-		$traitements_formulaire = unserialize($formulaire['traitements']);
-
-		if (isset($traitements_formulaire['enregistrement'])) {
-			$options =  $traitements_formulaire['enregistrement'];
-
-			if (isset($options['multiple']) && $options['multiple'] == ''
-					&& isset($options['modifiable']) && $options['modifiable'] == 'on'
-					&& is_array($reponses) && count($reponses) > 0) {
-				$id_formulaires_reponse = max($reponses);
-			}
-		}
-	} else {
-		// vérifier que l'auteur est bien l'auteur de la réponse, si non, on invalide l'id_formulaires_reponse
-		if (in_array($id_formulaires_reponse, $reponses) == false) {
-			$id_formulaires_reponse = false;
-		}
-	}
+	$id_formulaires_reponse = formidable_trouver_reponse_a_editer($id_formulaire, $id_formulaires_reponse, $options, true);
 
 	// Si la moderation est a posteriori ou que la personne est un boss, on publie direct
 	if ($options['moderation'] == 'posteriori'
-- 
GitLab