From 952e1779364534865a3fd5e7abae85b52ec59c22 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ma=C3=AFeul=20Rouquette?= <maieul@maieul.net>
Date: Tue, 10 May 2022 13:21:22 +0200
Subject: [PATCH] =?UTF-8?q?fix=20#5=20:=20permettre=20de=20passer=20des=20?=
 =?UTF-8?q?param=C3=A8tres=20suppl=C3=A9mentaires=20=C3=A0=20un=20formulai?=
 =?UTF-8?q?re=20lorsqu'on=20l'appel=20dans=20un=20squelette.=20Pour=20ce?=
 =?UTF-8?q?=20faire,=20on=20modifie=20la=20syntaxe=20de=20`#FORMULAIRE=5FF?=
 =?UTF-8?q?ORMIDABLE`,=20qui=20ne=20prend=20d=C3=A9sormais=20plus=20que=20?=
 =?UTF-8?q?trois=20arguments=20-=20id=20nun=C3=A9rique=20ou=20identifiant?=
 =?UTF-8?q?=20textuel=20du=20formulaire=20-=20tableau=20de=20valeur=20par?=
 =?UTF-8?q?=20d=C3=A9faut=20-=20tableau=20d'options=20On=20assure=20la=20r?=
 =?UTF-8?q?etrocompatibilit=C3=A9,=20car=20il=20y=20a=20beaucoup=20de=20ge?=
 =?UTF-8?q?ns=20pour=20qui=20le=20troisi=C3=A8me=20param=C3=A8tre=20c'est?=
 =?UTF-8?q?=20l'id=20de=20r=C3=A9ponse.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Attention, pour l'heure on ne peut pas le faire dans un contenu, car il
n'y pas de syntaxe SPIP pour passer des tableaux en options de formulaire.
---
 formulaires/formidable.php | 107 ++++++++++++++++++++++++++++---------
 1 file changed, 83 insertions(+), 24 deletions(-)

diff --git a/formulaires/formidable.php b/formulaires/formidable.php
index 2facdf61..bc516a20 100644
--- a/formulaires/formidable.php
+++ b/formulaires/formidable.php
@@ -95,15 +95,29 @@ function formulaires_formidable_saisies_dist($id, $valeurs = array(), $id_formul
 * @param array $valeurs
 *     Valeurs par défauts passées au contexte du formulaire
 *     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 bool|str $url_redirect Url de redirection qui prend éventuellement la main
+* @param array $options_appel options diverses à l'appel, pour l'heure :
+*			- id_formulaires_reponse (int) : identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
+*			- url_redirect (string) : url de redirection qui prend éventuellement la main
+*			- forcer_modif (bool) : permet de forcer la modif de la réponse, même si non autorisé (cas de l'édition des réponses dans l'espace privé)
+*			<!> Anciennement c'était id_formulaires_reponse. On assure la retrocompat.
+* @param bool|str $deprecated_url_redirect
+* @param bool $deprecated_url_redirect
 * @return array
 *     Contexte envoyé au squelette HTML du formulaire.
 **/
-function formulaires_formidable_charger_dist($id, $valeurs = array(), $id_formulaires_reponse = false, $url_redirect = false, $forcer_modif = false) {
+function formulaires_formidable_charger_dist($id, $valeurs = array(), $options_appel = [], $deprecated_url_redirect = false, $deprecated_forcer_modif = false) {
 	$contexte = array();
 
+	// Retrocompatiblité
+	if (!is_array($options_appel)) {
+		$options_appel = ['id_formulaires_reponse' => $options_appel];
+		$options_appel['url_redirect'] = $deprecated_url_redirect;
+		$options_appel['forcer_modif'] = $deprecated_forcer_modif;
+	}
+
+	// Valeur par défaut pour les options
+	$id_formulaires_reponse = $options_appel['id_formulaires_reponse'] ?? false;
+
 	// On peut donner soit un id soit un identifiant
 	if (!$id_formulaire = formidable_id_formulaire($id)) {
 		return;
@@ -214,22 +228,40 @@ function formulaires_formidable_charger_dist($id, $valeurs = array(), $id_formul
 * @param array $valeurs
 *     Valeurs par défauts passées au contexte du formulaire
 *     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 bool|str $url_redirect Url de redirection qui prend éventuellement la main
-* @param bool $forcer_modif permet de forcer la modif d'une réponse existante, même si le formulaire n'est pas configuré pour (cas de modif des réponses depuis l'espace privé)
+* @param array $options_appel options diverses à l'appel, pour l'heure :
+*			- id_formulaires_reponse (int) : identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
+*			- url_redirect (string) : url de redirection qui prend éventuellement la main
+*			- forcer_modif (bool) : permet de forcer la modif de la réponse, même si non autorisé (cas de l'édition des réponses dans l'espace privé)
+*			<!> Anciennement c'était id_formulaires_reponse. On assure la retrocompat.
+* @param bool|str $deprecated_url_redirect
+* @param bool $deprecated_url_redirect
+* @param int|string $id
+*     Identifiant numerique ou textuel du formulaire formidable
+* @param array $valeurs
+*     Valeurs par défauts passées au contexte du formulaire
+*     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
 * @return array
 *     Tableau des erreurs
 **/
-function formulaires_formidable_verifier_dist($id, $valeurs = array(), $id_formulaires_reponse = false, $url_redirect = false, $forcer_modif = false) {
+function formulaires_formidable_verifier_dist($id, $valeurs = [], $options_appel = [],  $deprecated_url_redirect = false, $deprecated_forcer_modif = false) {
 	$erreurs = array();
 
+	// Retrocompatiblité
+	if (!is_array($options_appel)) {
+		$options_appel = ['id_formulaires_reponse' => $options_appel];
+		$options_appel['url_redirect'] = $deprecated_url_redirect;
+		$options_appel['forcer_modif'] = $deprecated_forcer_modif;
+	}
+
+	// Valeur par défaut pour les options
+	$id_formulaires_reponse = $options_appel['id_formulaires_reponse'] ?? false;
+
 	include_spip('inc/saisies');
 	$saisies = saisies_chercher_formulaire('formidable', array($id, $valeurs, $id_formulaires_reponse));
 
 	// Si on n'est pas dans un formulaire à étape, on lance les vérifications des traitements
 	if ($saisies and !saisies_lister_par_etapes($saisies)) {
-		$erreurs = formulaires_formidable_verifier_traitements($id, $valeurs, $id_formulaires_reponse);
+		$erreurs = formulaires_formidable_verifier_traitements($id, $valeurs, $options_appel);
 	}
 
 	// Sale bête ! Ça on le fait tout le temps
@@ -248,21 +280,31 @@ function formulaires_formidable_verifier_dist($id, $valeurs = array(), $id_formu
 * @param array $valeurs
 *     Valeurs par défauts passées au contexte du formulaire
 *     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 $options_appel options diverses à l'appel, pour l'heure :
+*			- id_formulaires_reponse (int) : identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
+*			- url_redirect (string) : url de redirection qui prend éventuellement la main
+*			- forcer_modif (bool) : permet de forcer la modif de la réponse, même si non autorisé (cas de l'édition des réponses dans l'espace privé)
+*			<!> Anciennement c'était id_formulaires_reponse. On assure la retrocompat.
 * @return array
 *     Tableau des erreurs
 **/
-function formulaires_formidable_verifier_etape_dist($etape, $id, $valeurs = array(), $id_formulaires_reponse = false) {
+function formulaires_formidable_verifier_etape_dist($etape, $id, $valeurs = array(), $options_appel = []) {
 	$erreurs = array();
 
+
+	// Retrocompatiblité
+	if (!is_array($options_appel)) {
+		$options_appel['id_formulaires_reponse'] = $options_appel;
+	}
+	// Valeur par défaut pour les options
+	$id_formulaires_reponse = $options_appel['id_formulaires_reponse'] ?? false;
+
 	include_spip('inc/saisies');
 	$saisies = saisies_chercher_formulaire('formidable', array($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);
+		$erreurs = formulaires_formidable_verifier_traitements($id, $valeurs, $options_appel, $etapes, $etape);
 	}
 
 	return $erreurs;
@@ -276,17 +318,18 @@ function formulaires_formidable_verifier_etape_dist($etape, $id, $valeurs = arra
  * @param array $valeurs
  *     Valeurs par défauts passées au contexte du formulaire
  *     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 $options_appel : options passés à l'appel du formulaire (pour la doc, voir la doc de `formulaire_formidable_verifier()`)
  * @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, $etapes = array(), $etape = null) {
+function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $options_appel = [], $etapes = array(), $etape = null) {
 	$erreurs = array();
 
+	$id_formulaires_reponse = $options_appel['id_formulaires_reponse'] ?? false;
+
 	if (
 		$id_formulaire = formidable_id_formulaire($id)
 		and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))
@@ -303,6 +346,7 @@ function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $i
 						'id_formulaire' => $formulaire['id_formulaire'],
 						'valeurs' => $valeurs,
 						'id_formulaires_reponse' => $id_formulaires_reponse,
+						'options_appel' => $options_appel,
 						'etapes' => $etapes,
 						'etape' => $etape
 					),
@@ -336,16 +380,30 @@ function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $i
  * @param array $valeurs
  *     Valeurs par défauts passées au contexte du formulaire
  *     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 bool|str $url_redirect Url de redirection qui prend éventuellement la main
- * @param bool $forcer_modif permet de forcer la modif d'une réponse existante, même si le formulaire n'est pas configuré pour (cas de modif des réponses depuis l'espace privé)
- * @return array
+ * @param array $options_appel options diverses à l'appel, pour l'heure :
+ *			- id_formulaires_reponse (int) : identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
+ *			- url_redirect (string) : url de redirection qui prend éventuellement la main
+ *			- forcer_modif (bool) : permet de forcer la modif de la réponse, même si non autorisé (cas de l'édition des réponses dans l'espace privé)
+ *			<!> Anciennement c'était id_formulaires_reponse. On assure la retrocompat.
+ * @param bool|str $deprecated_url_redirect
+ * @param bool $deprecated_url_redirect
  *     Tableau des erreurs
  **/
-function formulaires_formidable_traiter_dist($id, $valeurs = array(), $id_formulaires_reponse = false, $url_redirect = false, $forcer_modif = false) {
+function formulaires_formidable_traiter_dist($id, $valeurs = [], $options_appel = [], $deprecated_url_redirect = false, $deprecated_forcer_modif = false) {
 	$retours = array();
 
+	// Retrocompatiblité
+	if (!is_array($options_appel)) {
+		$options_appel = ['id_formulaires_reponse' => $options_appel];
+		$options_appel['url_redirect'] = $deprecated_url_redirect;
+		$options_appel['forcer_modif'] = $deprecated_forcer_modif;
+	}
+
+	// Valeur par défaut pour les options
+	$id_formulaires_reponse = $options_appel['id_formulaires_reponse'] ?? false;
+	$url_redirect = $options_appel['url_redirect'] ?? false;
+	$forcer_modif = $options_appel['forcer_modif'] ?? false;
+
 	include_spip('inc/texte');
 	// POST Mortem de securite : on log le $_POST pour ne pas le perdre si quelque chose se passe mal
 	include_spip('inc/json');
@@ -439,6 +497,7 @@ function formulaires_formidable_traiter_dist($id, $valeurs = array(), $id_formul
 							array(
 								'formulaire' => $formulaire,
 								'options' => $options,
+								'options_appel' => $options_appel,
 								'id_formulaire' => $id_formulaire,
 								'valeurs' => $valeurs,
 								'id_formulaires_reponse' => $id_formulaires_reponse,
-- 
GitLab