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