diff --git a/CHANGELOG.md b/CHANGELOG.md index 68157c666c261e329fd2cacb139243a58030148b..d060530e6cc4188a12a81ba9fe7a490efbbf2614 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,21 @@ - Lors de la construction du formulaire, vérifier à la fin si les champs conditionnant des affichages sont bien présents, retourner un message d'erreur dans le cas contraire - #105 Ajout des pipelines `formidable_pre_raccourcis_arobases` et `formidable_post_raccourcis_arobases` pour ajustement les traitements avant/après l'interprétation des raccourcis `@champs@` +- #99 #111 Ajout du filtre `|formidable_deserialize` qui reçoit au choix : + * Un tableau déjà déserializé + * Un tableau serializé via `json_encode()` + * Un tableau serializé via `serialize()` + Et renvoie le tableau deserializé, ou la valeur reçue en cas d'échec. +- #111 Les traitements reçoivent comme arguments les forment déserializées des traitements et saisies associées au formulaire +>>>>>>> 7d12b82... Perf : passer systématiquement aux traitements le tableau des saisies et ### Changed +- #99 #111 Les tableaux stockés en base (saisies et traitements d'un formulaire, réponses de champs multivaluées) sont à l'avenir encodés via `json_encode()` (à travers `formidable_serialize()`). + Le changement se fait au fur et à mesure de l'édition des formulaires. On peut donc dans une même base avoir des tableau serializé via `serialize()` (anciens) et `json_encode()` (nouveaux). + Pour les plugins qui étendent formidable : + - dans les traitements, on peut récuperer directement les valeurs déserializées des tableaux, qui sont désormais passés en arguments; + - dans les squelettes et autres fonctions perso, utiliser le filtre `|formidable_deserialize`. - #105 `formidable_raccourcis_arobases_2_valeurs_champs` reçoit désormais les arguments suivants : 1. `$chaine` chaîne à transformer 2. `$saisies` liste des saisies du formulaire @@ -36,9 +48,15 @@ ### Removed - #105 pipeline `formidable_affiche_resume_reponse` supprimé, remplacée par `formidable_pre_raccourcis_arobases` et `formidable_post_raccourcis_arobases` + +### Deprecated + +- Filtre `tenter_unserialize`, utiliser à la place `formidable_deserialize` + ### Fixed - #114 Afficher correctement les erreurs lors de la saisie d'une configuration de formulaire +- Possibilité d'utiliser des emojis dans les saisies / traitements - #108 #109 Les modèles historiques `<form>` et `<formidable>` dans l'espace privé affichent une alerte si le formulaire n'est pas publié - `secret_du_formidable` créé également à l'installation du plugin, pas seulement à la MAJ - Inclusivité des chaînes de langue diff --git a/afficher_diff/array_serialized.php b/afficher_diff/array_serialized.php index 08cd4a0cb6d5e90db98397ab07244d01dfa3acc0..0956bd2e0a3ec633c793e3db7ce398355f950b5f 100644 --- a/afficher_diff/array_serialized.php +++ b/afficher_diff/array_serialized.php @@ -18,9 +18,9 @@ if (!defined('_ECRIRE_INC_VERSION')) { function afficher_diff_array_serialized($champ, $old, $new, $format = 'diff') { // Pour le diff de saisies, faire comme un diff de yaml include_spip('inc/yaml'); - $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/'); - $new = $tenter_unserialize($new); - $old = $tenter_unserialize($old); + include_spip('formidable_fonctions'); + $new = formidable_deserialize($new); + $old = formidable_deserialize($old); if (is_array($new)) { $new = yaml_encode($new); } else { diff --git a/controleurs/formulaires_reponses_champ.php b/controleurs/formulaires_reponses_champ.php index c27ae6971ccfea42068d5293505c16623bbd9de5..73073ed924f5c1cae434bddcb6c9da0502d1a4d0 100644 --- a/controleurs/formulaires_reponses_champ.php +++ b/controleurs/formulaires_reponses_champ.php @@ -9,6 +9,8 @@ */ function controleurs_formulaires_reponses_champ_dist($regs, $c = null) { include_spip('inc/saisies'); + include_spip('formidable_fonctions'); + list(,$crayon, $type, $champ, $id) = $regs; $id_formulaires_reponses_champ = $regs[4]; @@ -27,7 +29,10 @@ function controleurs_formulaires_reponses_champ_dist($regs, $c = null) { $nom = $data['nom']; $valeur = $data['valeur']; - $saisie = saisies_chercher(unserialize($data['saisies']), $nom); + $saisie = saisies_chercher( + formidable_deserialize($data['saisies']), + $nom + ); $valeur = $data['valeur']; $n = new Crayon( @@ -41,11 +46,11 @@ function controleurs_formulaires_reponses_champ_dist($regs, $c = null) { unset($saisie['options']['explication']); unset($saisie['options']['class']); unset($saisie['options']['conteneur_class']); + // Crayons utilise son propre formalisme pour le 'name' des saisies. $nom_crayons = 'content_' . $key . '_valeur'; $saisie['options']['nom'] = $nom_crayons; - include_spip('inc/formidable'); - $valeur = filtre_tenter_unserialize_dist($valeur);// Pour une raison mystérieuse, charger_fonction déclenche une erreur (!) + $valeur = formidable_deserialize($valeur); $contexte = array('_saisies' => array($saisie), $nom_crayons => $valeur); $html = $n->formulaire($contexte); diff --git a/echanger/formulaire/wcs.php b/echanger/formulaire/wcs.php index abacda3c585560e367964e68ca34809e342c26dc..dc4894c1c1cf0e7e5941eec4f17bf9e24aaf9ed1 100644 --- a/echanger/formulaire/wcs.php +++ b/echanger/formulaire/wcs.php @@ -9,6 +9,7 @@ function echanger_formulaire_wcs_importer_dist($fichier) { include_spip('inc/xml'); include_spip('inc/filtres'); include_spip('inc/saisies'); + include_spip('inc/formidable'); $arbre = spip_xml_load($fichier, false); if ($arbre and is_array($arbre) and isset($arbre['formdef'])) { @@ -157,10 +158,10 @@ function echanger_formulaire_wcs_importer_dist($fichier) { // Si ça a marché on transforme les tableaux et on modifie les champs if ($id_formulaire > 0) { if (is_array($formulaire['saisies'])) { - $formulaire['saisies'] = serialize($formulaire['saisies']); + $formulaire['saisies'] = formidable_serialize($formulaire['saisies']); } if (is_array($formulaire['traitements'])) { - $formulaire['traitements'] = serialize($formulaire['traitements']); + $formulaire['traitements'] = formidable_serialize($formulaire['traitements']); } $erreur = formulaire_modifier($id_formulaire, $formulaire); diff --git a/echanger/formulaire/yaml.php b/echanger/formulaire/yaml.php index 56db60024cebf1ae316749001bf0368552131fc0..1a419ab0c88ee1545c90c61a3dc24924709d8597 100644 --- a/echanger/formulaire/yaml.php +++ b/echanger/formulaire/yaml.php @@ -7,6 +7,7 @@ if (!defined('_ECRIRE_INC_VERSION')) { function echanger_formulaire_yaml_exporter_dist($id_formulaire) { include_spip('base/abstract_sql'); + include_spip('formidable_fonctions'); include_spip('inc/yaml'); $id_formulaire = intval($id_formulaire); $export = ''; @@ -20,8 +21,8 @@ function echanger_formulaire_yaml_exporter_dist($id_formulaire) { ); // On décompresse les trucs sérialisés - $formulaire['saisies'] = unserialize($formulaire['saisies']); - $formulaire['traitements'] = unserialize($formulaire['traitements']); + $formulaire['saisies'] = formidable_deserialize($formulaire['saisies']); + $formulaire['traitements'] = formidable_deserialize($formulaire['traitements']); // On envode en yaml $export = yaml_encode($formulaire); @@ -35,7 +36,7 @@ function echanger_formulaire_yaml_exporter_dist($id_formulaire) { } function echanger_formulaire_yaml_importer_dist($fichier) { - + include_spip('inc/formidable'); // Initialisation $id_formulaire = 0; $erreur = ''; @@ -64,10 +65,10 @@ function echanger_formulaire_yaml_importer_dist($fichier) { // Si ça a marché on transforme les tableaux et on modifie les champs if ($id_formulaire > 0) { if (is_array($formulaire['saisies'])) { - $formulaire['saisies'] = serialize($formulaire['saisies']); + $formulaire['saisies'] = formidable_serialize($formulaire['saisies']); } if (is_array($formulaire['traitements'])) { - $formulaire['traitements'] = serialize($formulaire['traitements']); + $formulaire['traitements'] = formidable_serialize($formulaire['traitements']); } $erreur = formulaire_modifier($id_formulaire, $formulaire); diff --git a/filtre/tenter_unserialize.php b/filtre/tenter_unserialize.php new file mode 100644 index 0000000000000000000000000000000000000000..4a9d86e16a8d3affc8376bd1f636395d6e73f374 --- /dev/null +++ b/filtre/tenter_unserialize.php @@ -0,0 +1,16 @@ +<?php + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + +/** + * @deprecated + * @see `filtre_formidable_deserialize_dist()` + * @param string|array $texte + * @return array|string +**/ +function filtre_tenter_deserialize_dist($texte) { + include_spip('formidable_fonctions'); + return formidable_deserialize($texte); +} diff --git a/formidable_autorisations.php b/formidable_autorisations.php index c1a3bac03abafc203d3e20a2a44ce45462908645..a25c810f333e51994771d7fa8003c2a5f4de4b4d 100644 --- a/formidable_autorisations.php +++ b/formidable_autorisations.php @@ -157,7 +157,8 @@ function autoriser_formulaire_repondre_dist($faire, $type, $id, $qui, $opt) { $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id); } - $traitements = unserialize($formulaire['traitements']); + include_spip('formidable_fonctions'); + $traitements = formidable_deserialize($formulaire['traitements']); // S'il n'y a pas d'enregistrement, c'est forcément bon if (!isset($traitements['enregistrement']) or !($options = $traitements['enregistrement'])) { diff --git a/formidable_fonctions.php b/formidable_fonctions.php index 0fa361059c444ea0e3cb39ebf3a33148ea7a6cd5..ccb55eec6263effdb5844ed2d47f0387f6378ebe 100644 --- a/formidable_fonctions.php +++ b/formidable_fonctions.php @@ -13,6 +13,7 @@ if (!defined('_ECRIRE_INC_VERSION')) { include_spip('inc/formidable'); include_spip('public/formidable_criteres'); +include_spip('filtre/tenter_unserialize');// Obsolète /** * #VOIR_REPONSE{checkbox_2} dans une boucle (FORMULAIRES_REPONSES) * @@ -55,11 +56,11 @@ function balise_VOIR_REPONSE_dist($p) { function calculer_voir_reponse($id_formulaires_reponse, $id_formulaire, $nom, $sql_serveur = '', $type_retour = null, $sans_reponse = null) { static $formulaires_saisies = array(); static $reponses_valeurs = array(); - $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/'); + include_spip('formidable_fonctions'); // Si pas déjà présent, on cherche les saisies de ce formulaire if (!isset($formulaires_saisies[$id_formulaire])) { - $formulaires_saisies[$id_formulaire] = unserialize( + $formulaires_saisies[$id_formulaire] = formidable_deserialize( sql_getfetsel('saisies',//select 'spip_formulaires',//from 'id_formulaire = '.intval($id_formulaire),//where @@ -86,7 +87,7 @@ function calculer_voir_reponse($id_formulaires_reponse, $id_formulaire, $nom, $s foreach ($champs as $champ) { $reponses_valeurs[$id_formulaires_reponse][$champ['nom']] = array( 'valeur' => formidable_ajouter_action_recuperer_fichier( - $tenter_unserialize($champ['valeur']), + formidable_deserialize($champ['valeur']), $champ['nom'], $formulaires_saisies[$id_formulaire], $id_formulaire, @@ -151,6 +152,8 @@ function affiche_resume_reponse($id_formulaires_reponse, $id_formulaire = null, static $modeles_resume = array(); static $saisies_form = array(); + include_spip('formidable_fonctions'); + if (is_null($id_formulaire)) { $id_formulaire = sql_getfetsel( 'id_formulaire', @@ -161,9 +164,9 @@ function affiche_resume_reponse($id_formulaires_reponse, $id_formulaire = null, if (is_null($modele_resume) and !isset($modeles_resume[$id_formulaire])) { $row = sql_fetsel('saisies, traitements', 'spip_formulaires', 'id_formulaire='.intval($id_formulaire)); - $saisies = unserialize($row['saisies']); + $saisies = formidable_deserialize($row['saisies']); $saisies_form[$id_formulaire] = $saisies; - $traitements = unserialize($row['traitements']); + $traitements = formidable_deserialize($row['traitements']); if (isset($traitements['enregistrement']['resume_reponse'])) { $modeles_resume[$id_formulaire] = $traitements['enregistrement']['resume_reponse']; } else { @@ -288,3 +291,38 @@ function formidable_afficher_statut_si_different_de($statut,$not_in = array()) { return ''; } + +/** + * Tente de déserialiser un texte + * + * Si le paramètre est un tableau, retourne le tableau, + * Si c'est une chaîne, tente de la désérialiser + * - d'abord depuis du JSON + * - puis depuis de la serialsation par défaut + * Si échec, retourne la chaîne + * retourne la chaîne. + * + * @filtre + * + * @param string|array $texte + * Le texte (possiblement sérializé) ou un tableau + * @return array|string + * Tableau, texte désérializé ou texte +**/ +function formidable_deserialize($texte) { + // Cas 1. Deja tableau + if (is_array($texte)) { + return $texte; + } + // Cas 2. Tableau serializé en json + $tmp = json_decode($texte, true); + if (is_array($tmp)) { + return $tmp; + } + // Cas 3. Tableau serializé en PHP, si jamais ca echout on renvoie le texte + $tmp = @unserialize($texte); + if (is_array($tmp)) { + return $tmp; + } + return $texte; +} diff --git a/formidable_pipelines.php b/formidable_pipelines.php index e27756a70d787143eb3e8c455a34ac998d1f46db..89cd170e3d453c2c76eb990b6174000b9ca6e082 100644 --- a/formidable_pipelines.php +++ b/formidable_pipelines.php @@ -362,12 +362,13 @@ function formidable_crayons_verifier($flux) { ['spip_formulaires_reponses_champs AS c', 'spip_formulaires_reponses AS r', 'spip_formulaires AS f'], ["id_formulaires_reponses_champ = $id", 'r.id_formulaires_reponse = c.id_formulaires_reponse', 'f.id_formulaire = r.id_formulaire'] ); - $saisies = unserialize($data['saisies']); + include_spip('formidable_fonctions'); + $saisies = formidable_deserialize($data['saisies']); $saisie = saisies_chercher($saisies, $data['nom']); if (saisies_saisie_est_tabulaire($saisie)) { $atrouver = 'content_'.$flux['args']['wid'].'_valeur'; $valeur = saisies_request($atrouver); - $flux['data']['normaliser']['valeur'] = serialize($valeur); + $flux['data']['normaliser']['valeur'] = formidable_serialize($valeur); } saisies_set_request($data['nom'], $valeur); $erreur = saisies_verifier(array($saisie), false); diff --git a/formulaires/editer_formulaire_champs.php b/formulaires/editer_formulaire_champs.php index 26ff718ebda55bf8a8abb1fd0be2b4f307f7a8ea..c63d90bd6f65d3fdbba613cd52e553d2eaae191c 100644 --- a/formulaires/editer_formulaire_champs.php +++ b/formulaires/editer_formulaire_champs.php @@ -9,19 +9,20 @@ function formulaires_editer_formulaire_champs_charger($id_formulaire) { $id_formulaire = intval($id_formulaire); $contexte = array(); $contexte['id_formulaire'] = $id_formulaire; + include_spip('formidable_fonctions'); // On teste si le formulaire existe if ($id_formulaire and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire) and autoriser('editer', 'formulaire', $id_formulaire) ) { - $saisies = unserialize($formulaire['saisies']); + $saisies = formidable_deserialize($formulaire['saisies']); // Est-ce qu'on restaure une révision ? if ($id_version = _request('id_version')) { include_spip('inc/revisions'); $old = recuperer_version($id_formulaire, 'formulaire', $id_version); - $saisies = unserialize($old['saisies']); + $saisies = formidable_deserialize($old['saisies']); } if (!is_array($saisies)) { $saisies = array(); @@ -157,7 +158,7 @@ function formulaires_editer_formulaire_champs_charger($id_formulaire) { function formulaires_editer_formulaire_champs_verifier($id_formulaire) { include_spip('inc/saisies'); $erreurs = array(); - + include_spip('formidable_fonctions'); // Si c'est pas une confirmation ni une annulation, ni un revert if (!_request('enregistrer_confirmation') and !($annulation = _request('annulation')) @@ -182,7 +183,7 @@ function formulaires_editer_formulaire_champs_verifier($id_formulaire) { // Attention à s'assurer que tout les elements du tableau soit bien soit des tableaux, soit un string // En effet, le md5 du formulaire_initial est calculé à partir de ce qui est passé au squelette // Or dès qu'une valeur est passée à un squelette, elle est changé en string, à cause du mode de compilation (?) - $saisies_anciennes = unserialize($saisies_anciennes); + $saisies_anciennes = formidable_deserialize($saisies_anciennes); $saisies_anciennes_str = $saisies_anciennes; array_walk_recursive($saisies_anciennes_str, 'formidable_array_walk_recursive_strval'); $md5_saisies_anciennes = md5(serialize($saisies_anciennes_str)); @@ -225,8 +226,10 @@ function formulaires_editer_formulaire_champs_verifier($id_formulaire) { function formulaires_editer_formulaire_champs_traiter($id_formulaire) { include_spip('inc/saisies'); + include_spip('inc/formidable'); $retours = array(); $id_formulaire = intval($id_formulaire); + include_spip('formidable_fonctions'); if (_request('revert')) { session_set("constructeur_formulaire_formidable_$id_formulaire"); @@ -238,7 +241,7 @@ function formulaires_editer_formulaire_champs_traiter($id_formulaire) { $saisies_nouvelles = session_get("constructeur_formulaire_formidable_$id_formulaire"); // On récupère les anciennes saisies - $saisies_anciennes = unserialize(sql_getfetsel( + $saisies_anciennes = formidable_deserialize(sql_getfetsel( 'saisies', 'spip_formulaires', 'id_formulaire = '.$id_formulaire @@ -246,7 +249,7 @@ function formulaires_editer_formulaire_champs_traiter($id_formulaire) { // On envoie les nouvelles dans la table include_spip('action/editer_objet'); - $err = objet_modifier('formulaire', $id_formulaire, array('saisies' => serialize(saisies_identifier($saisies_nouvelles)))); + $err = objet_modifier('formulaire', $id_formulaire, array('saisies' => formidable_serialize(saisies_identifier($saisies_nouvelles)))); // Si c'est bon on appelle d'éventuelles fonctions d'update des traitements // On reinitialise aussi les sessions @@ -255,7 +258,7 @@ function formulaires_editer_formulaire_champs_traiter($id_formulaire) { session_set("constructeur_formulaire_formidable_$id_formulaire"); session_set("constructeur_formulaire_formidable_$id_formulaire".'_md5_formulaire_initial'); // On va chercher les traitements - $traitements = unserialize(sql_getfetsel( + $traitements = formidable_deserialize(sql_getfetsel( 'traitements', 'spip_formulaires', 'id_formulaire = '.$id_formulaire diff --git a/formulaires/editer_formulaire_traitements.php b/formulaires/editer_formulaire_traitements.php index 638a10e8f755dfa68945b3edc4a32460ec98808b..2729205d0626a8c9827d3d52f98e39475543b1b3 100644 --- a/formulaires/editer_formulaire_traitements.php +++ b/formulaires/editer_formulaire_traitements.php @@ -11,19 +11,20 @@ include_spip('inc/formidable_fichiers'); function formulaires_editer_formulaire_traitements_charger($id_formulaire) { $contexte = array(); $id_formulaire = intval($id_formulaire); + include_spip('formidable_fonctions'); // On teste si le formulaire existe if ($id_formulaire and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire) and autoriser('editer', 'formulaire', $id_formulaire) ) { - $traitements = unserialize($formulaire['traitements']); + $traitements = formidable_deserialize($formulaire['traitements']); if ($id_version = _request('id_version')) { include_spip('inc/revisions'); $old = recuperer_version($id_formulaire, 'formulaire', $id_version); - $traitements = unserialize($old['traitements']); + $traitements = formidable_deserialize($old['traitements']); } - $saisies = unserialize($formulaire['saisies']); + $saisies = formidable_deserialize($formulaire['saisies']); if (!is_array($traitements)) { $traitements = array(); } @@ -108,6 +109,7 @@ function formulaires_editer_formulaire_traitements_verifier($id_formulaire) { function formulaires_editer_formulaire_traitements_traiter($id_formulaire) { $retours = array(); $id_formulaire = intval($id_formulaire); + include_spip('inc/formidable'); // On récupère tout le tableau des traitements $traitements = _request('traitements'); @@ -127,7 +129,7 @@ function formulaires_editer_formulaire_traitements_traiter($id_formulaire) { } // Et on l'enregistre tel quel include_spip('action/editer_objet'); - $err = objet_modifier('formulaire', $id_formulaire, array('traitements' => serialize($traitements))); + $err = objet_modifier('formulaire', $id_formulaire, array('traitements' => formidable_serialize($traitements))); // On va sur la page de visualisation quand c'est fini if (!$err) { diff --git a/formulaires/exporter_formulaire_analyse.php b/formulaires/exporter_formulaire_analyse.php index b2146d92255d05784643ebcac9f36bc8872b7b5e..164c51733ae7025847229e3d21b6fdb1e3e0b14d 100644 --- a/formulaires/exporter_formulaire_analyse.php +++ b/formulaires/exporter_formulaire_analyse.php @@ -40,6 +40,7 @@ function formulaires_exporter_formulaire_analyse_traiter($id_formulaire = 0) { */ function action_exporter_analyse_reponses($id_formulaire, $delim = ',') { // on ne fait des choses seulements si le formulaire existe et qu'il a des enregistrements + include_spip('formidable_fonctions'); $ok = false; if ($id_formulaire > 0 and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire) @@ -50,10 +51,10 @@ function action_exporter_analyse_reponses($id_formulaire, $delim = ',') { include_spip('inc/filtres'); $reponses_completes = array(); - $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false); + $saisies = saisies_lister_par_nom(formidable_deserialize($formulaire['saisies']), false); // exclure les champs non analysés - $traitement = unserialize($formulaire['traitements']); + $traitement = formidable_deserialize($formulaire['traitements']); foreach (explode('|', $traitement['enregistrement']['analyse_exclure_champs']) as $exclure) { unset($saisies[$exclure]); } @@ -69,9 +70,7 @@ function action_exporter_analyse_reponses($id_formulaire, $delim = ',') { $valeurs = array(); while ($r = sql_fetch($res)) { - $valeurs[$r['nom']][] = is_array(unserialize($r['valeur'])) - ? unserialize($r['valeur']) - : $r['valeur']; + $valeurs[$r['nom']][] = formidable_deserialize($r['valeur']); } foreach ($saisies as $nom => $saisie) { @@ -80,9 +79,7 @@ function action_exporter_analyse_reponses($id_formulaire, $delim = ',') { 'spip_formulaires_reponses_champs', 'id_formulaires_reponse = '.intval($reponse['id_formulaires_reponse']).' and nom = '.sql_quote($nom) ); - if (is_array(unserialize($valeur))) { - $valeur = unserialize($valeur); - } + $valeur = formidable_deserialize($valeur); $reponse_complete[] = formidable_analyser_saisie($saisie, $valeurs, 0, true); } diff --git a/formulaires/exporter_formulaire_reponses.php b/formulaires/exporter_formulaire_reponses.php index cc1e5271b39be970e21fa291fb55c21e86b025d7..549c93204091ff2fcbf2f05febc2b5894fb70e16 100644 --- a/formulaires/exporter_formulaire_reponses.php +++ b/formulaires/exporter_formulaire_reponses.php @@ -12,10 +12,11 @@ include_spip('inc/config'); function formulaires_exporter_formulaire_reponses_charger($id_formulaire = 0) { $contexte = array(); $contexte['id_formulaire'] = intval($id_formulaire); + include_spip('formidable_fonctions'); // Vérifier si le formulaire dispose de champs "fichiers", pour proposer de ne pas les joindre à l'export $saisies = sql_getfetsel('saisies','spip_formulaires','id_formulaire = '.intval($id_formulaire)); - $saisies_par_type = saisies_lister_par_type(unserialize($saisies), false); + $saisies_par_type = saisies_lister_par_type(formidable_deserialize($saisies), false); if(isset($saisies_par_type['fichiers'])){ $contexte['fichiers'] = true; } @@ -139,6 +140,7 @@ function preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses, include_spip('inc/saisies'); include_spip('facteur_fonctions'); include_spip('inc/filtres'); + include_spip('formidable_fonctions'); $id_formulaire = $formulaire['id_formulaire']; $reponses_completes = array(); @@ -159,7 +161,7 @@ function preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses, $titres[] = _T('formidable:reponse_statut'); } - $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false); + $saisies = saisies_lister_par_nom(formidable_deserialize($formulaire['saisies']), false); foreach ($saisies as $nom => $saisie) { if ($saisie['saisie'] != 'explication') { // on exporte tous les champs sauf explications $options = $saisie['options']; @@ -213,7 +215,7 @@ function preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses, unset($_reponses_valeurs); // Ensuite tous les champs - $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/'); + include_spip('formidable_fonctions'); // On parcourt chaque réponse foreach ($reponses as $i => $reponse) { @@ -244,7 +246,7 @@ function preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses, // Saisie de type fichier ? if (!$ignorer_fichiers && $saisie['saisie'] == 'fichiers') { - $_valeurs = $tenter_unserialize($valeurs[$nom]); + $_valeurs = formidable_deserialize($valeurs[$nom]); //tester s'il y a des saisies parmi les fichiers if (is_array($_valeurs) and $_valeurs) { $chemin = _DIR_FICHIERS_FORMIDABLE . 'formulaire_' . $id_formulaire . '/reponse_' . $reponse['id_formulaires_reponse']; @@ -296,15 +298,13 @@ function preparer_formulaire_reponses($formulaire, $reponses, $statut_reponses, */ function formidable_generer_valeur_texte_saisie($valeur, $saisie, $cle_ou_valeur = 'valeur') { static $resultats = array(); - static $tenter_unserialize = null; - if (is_null($tenter_unserialize)) { - $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/'); - } + include_spip('formidable_fonctions'); + $hash = ($saisie['saisie'] . ':' . serialize($saisie['options']) . ':' . $valeur); if (!isset($resultats[$hash])) { - $valeur = $tenter_unserialize($valeur); + $valeur = formidable_deserialize($valeur); // Il faut éviter de passer par là … ça prend du temps… $resultats[$hash] = facteur_mail_html2text( recuperer_fond( diff --git a/formulaires/formidable.php b/formulaires/formidable.php index bf60bd212f1edca9c78d920827b1e5a1c8660fb2..4da4439f7662b4dafcf4719cbf5d720593329cf9 100644 --- a/formulaires/formidable.php +++ b/formulaires/formidable.php @@ -61,12 +61,12 @@ function formidable_id_formulaire($id) { **/ function formulaires_formidable_saisies_dist($id, $valeurs = array(), $id_formulaires_reponse = false) { $saisies = array(); - + include_spip('formidable_fonctions'); if ( $id_formulaire = formidable_id_formulaire($id) and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire)) ) { - $saisies = unserialize($formulaire['saisies']); + $saisies = formidable_deserialize($formulaire['saisies']); // Si on est en train de réafficher les valeurs postées, // ne pas afficher les saisies hidden @@ -107,6 +107,7 @@ function formulaires_formidable_saisies_dist($id, $valeurs = array(), $id_formul **/ function formulaires_formidable_charger_dist($id, $valeurs = array(), $options_appel = [], $deprecated_url_redirect = false, $deprecated_forcer_modif = false) { $contexte = array(); + include_spip('formidable_fonctions'); // Retrocompatiblité if (!is_array($options_appel)) { @@ -133,7 +134,7 @@ function formulaires_formidable_charger_dist($id, $valeurs = array(), $options_a // Est-ce que la personne a le droit de répondre ? if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire' => $formulaire))) { - $traitements = unserialize($formulaire['traitements']); + $traitements = formidable_deserialize($formulaire['traitements']); $contexte['mechantrobot'] = ''; @@ -204,7 +205,7 @@ function formulaires_formidable_charger_dist($id, $valeurs = array(), $options_a $contexte['formidable_afficher_apres'] = $formulaire['apres']; // Si le formulaire via d'être posté, ne pas preremplir le nouveau formulaire avec les valeurs postées if ($formulaire['apres'] == 'formulaire' and _request('formidable_traiter_ok')) { - foreach (saisies_lister_par_nom(unserialize($formulaire['saisies'])) as $nom => $valeur) { + foreach (saisies_lister_par_nom(formidable_deserialize($formulaire['saisies'])) as $nom => $valeur) { set_request($nom, null); } set_request('cvtupload_etapes_files', null); @@ -328,15 +329,17 @@ function formulaires_formidable_verifier_etape_dist($etape, $id, $valeurs = arra */ 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; + include_spip('formidable_fonctions'); if ( $id_formulaire = formidable_id_formulaire($id) and $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire)) - and $traitements = unserialize($formulaire['traitements']) + and $traitements = formidable_deserialize($formulaire['traitements']) and is_array($traitements) ) { + $saisies = formidable_deserialize($formulaire['saisies']); + // Pour chaque traitement choisi, on cherche s'il propose une fonction de vérification propre à ses besoins foreach ($traitements as $type_traitement => $options) { if ($verifier_traitement = charger_fonction('verifier', "traiter/$type_traitement", true)) { @@ -344,6 +347,8 @@ function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $o array( 'formulaire' => $formulaire, 'options' => $options, + 'traitements' => $traitements, + 'saisies' => $saisies, 'id_formulaire' => $formulaire['id_formulaire'], 'valeurs' => $valeurs, 'id_formulaires_reponse' => $id_formulaires_reponse, @@ -392,6 +397,7 @@ function formulaires_formidable_verifier_traitements($id, $valeurs = array(), $o **/ function formulaires_formidable_traiter_dist($id, $valeurs = [], $options_appel = [], $deprecated_url_redirect = false, $deprecated_forcer_modif = false) { $retours = array(); + include_spip('formidable_fonctions'); // Retrocompatiblité if (!is_array($options_appel)) { @@ -417,8 +423,8 @@ function formulaires_formidable_traiter_dist($id, $valeurs = [], $options_appel } $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . $id_formulaire); - $saisies = unserialize($formulaire['saisies']); - $traitements = unserialize($formulaire['traitements']); + $saisies = formidable_deserialize($formulaire['saisies']); + $traitements = formidable_deserialize($formulaire['traitements']); // On met à null les (sous-)saisies masquées par afficher_si formidable_saisies_afficher_si_masquees_set_request_null(); @@ -502,6 +508,8 @@ function formulaires_formidable_traiter_dist($id, $valeurs = [], $options_appel 'formulaire' => $formulaire, 'options' => $options, 'options_appel' => $options_appel, + 'saisies' => $saisies, + 'traitements' => $traitements, 'id_formulaire' => $id_formulaire, 'valeurs' => $valeurs, 'id_formulaires_reponse' => $id_formulaires_reponse, @@ -659,6 +667,7 @@ function formulaires_formidable_traiter_dist($id, $valeurs = [], $options_appel * Tableau des champs de type fichier **/ function formulaires_formidable_fichiers($id, $valeurs = array(), $id_formulaires_reponse = false) { + include_spip('formidable_fonctions'); // On peut donner soit un id soit un identifiant if (!$id_formulaire = formidable_id_formulaire($id)) { return array(); @@ -666,7 +675,7 @@ function formulaires_formidable_fichiers($id, $valeurs = array(), $id_formulaire // On cherche les saisies du formulaire if ($saisies = sql_getfetsel('saisies', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) { - $saisies = unserialize($saisies); + $saisies = formidable_deserialize($saisies); include_spip('inc/saisies_lister'); $saisies_fichiers = array_keys(saisies_lister_avec_type($saisies, 'fichiers')); return $saisies_fichiers; @@ -687,13 +696,14 @@ function formulaires_formidable_fichiers($id, $valeurs = array(), $id_formulaire * **/ function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) { + include_spip('formidable_fonctions'); if ($id_formulaires_reponse == false) { $ok = true; return $contexte; } // On prépare des infos si jamais on a des champs fichiers - $saisies = unserialize($contexte['_formidable']['saisies']); + $saisies = formidable_deserialize($contexte['_formidable']['saisies']); $saisies_fichiers = saisies_lister_avec_type($saisies, 'fichiers');// les saisies de type fichier $fichiers = array(); $id_formulaire = $contexte['_formidable']['id_formulaire']; @@ -708,7 +718,7 @@ function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_rep // On remplit le contexte avec les résultats précédents foreach ($champs as $champ) { if (array_key_exists($champ['nom'], $saisies_fichiers)) { - $valeur= unserialize($champ['valeur']); + $valeur= formidable_deserialize($champ['valeur']); $nom = $champ['nom']; $fichiers[$nom] = array(); $chemin = _DIR_FICHIERS_FORMIDABLE @@ -722,7 +732,7 @@ function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_rep } } } else { - $test_array = filtre_tenter_unserialize_dist($champ['valeur']); + $test_array = formidable_deserialize($champ['valeur']); $contexte[$champ['nom']] = is_array($test_array) ? $test_array : $champ['valeur']; } } diff --git a/genie/formidable_effacer_enregistrements.php b/genie/formidable_effacer_enregistrements.php index 4adc61c67f0191f3df4bca53e64162685be95155..7d8a7d455db85aba948d84d02707ee19406979d4 100644 --- a/genie/formidable_effacer_enregistrements.php +++ b/genie/formidable_effacer_enregistrements.php @@ -6,13 +6,15 @@ if (!defined('_ECRIRE_INC_VERSION')) { } include_spip('inc/formidable_fichiers'); + /** * Effacer régulièrement les enregistrements obsolètes **/ function genie_formidable_effacer_enregistrements($t) { $res = sql_select('id_formulaire,traitements', 'spip_formulaires'); + include_spip('formidable_fonctions'); while ($result = sql_fetch($res)) { - $traitements = unserialize($result['traitements']); + $traitements = formidable_deserialize($result['traitements']); $id_formulaire = $result['id_formulaire']; if (isset($traitements['enregistrement']['effacement']) and $traitements['enregistrement']['effacement'] == 'on' diff --git a/http/collectionjson/inc-formulaire.html b/http/collectionjson/inc-formulaire.html index 58e222d9a547572cc5c9ca1acbb25b459adb4b9d..e08bc07c5907d7409f08bfc26aed58e2fe335132 100644 --- a/http/collectionjson/inc-formulaire.html +++ b/http/collectionjson/inc-formulaire.html @@ -26,8 +26,8 @@ [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,titre, value,#TITRE, prompt,<:info_titre:>})]})]})] [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,descriptif, value,#DESCRIPTIF, prompt,<:info_descriptif:>})], #DESCRIPTIF})]})] [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,message_retour, value,[(#MESSAGE_RETOUR|propre)], prompt,<:formidable:editer_message_ok:>})], #MESSAGE_RETOUR})]})] - [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,saisies, array,[(#SAISIES|unserialize)], prompt,<:formidable:champs:>})], #SAISIES})]})] - [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,traitements, array,[(#TRAITEMENTS|unserialize)], prompt,<:formidable:voir_traitements:>})], #TRAITEMENTS})]})] + [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,saisies, array,[(#SAISIES|formidable_deserialize)], prompt,<:formidable:champs:>})], #SAISIES})]})] + [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,traitements, array,[(#TRAITEMENTS|formidable_deserialize)], prompt,<:formidable:voir_traitements:>})], #TRAITEMENTS})]})] ] [(#REM) Des champs au contenu BRUT qui peut être modifié ] diff --git a/inc/formidable.php b/inc/formidable.php index ac51f5519b8333ba8fa5eedfa82597c26b92020f..7cda26054864b1794e84aed5b8907fd8b066e367 100644 --- a/inc/formidable.php +++ b/inc/formidable.php @@ -391,29 +391,6 @@ function analyser_saisie($saisie) { } -/** - * Tente de déserialiser un texte - * - * Si le paramètre est un tableau, retourne le tableau, - * Si c'est une chaîne, tente de la désérialiser, sinon - * retourne la chaîne. - * - * @filtre - * - * @param string|array $texte - * Le texte (possiblement sérializé) ou un tableau - * @return array|string - * Tableau, texte désérializé ou texte -**/ -function filtre_tenter_unserialize_dist($texte) { - if (is_array($texte)) { - return $texte; - } - if ($tmp = @unserialize($texte)) { - return $tmp; - } - return $texte; -} /** @@ -709,3 +686,15 @@ function formidable_array_walk_recursive_strval(&$value, $key) { $value = strval($value); } } + + +/** + * Sérialize un tableau, pour stockage en base. + * On sérialize en json qui est plus robuse que la serialization PHP (pb #99) + * + * @param array Le tableau + * @return string +**/ +function formidable_serialize(array $tab):string { + return json_encode($tab); +} diff --git a/modeles/formulaire_aide_memoire.html b/modeles/formulaire_aide_memoire.html index 627578d4c4f8af549510b4e8e91e3cb67c017f61..34a577bdee7b1a25391e159752c6a78eb9d77c67 100644 --- a/modeles/formulaire_aide_memoire.html +++ b/modeles/formulaire_aide_memoire.html @@ -10,7 +10,7 @@ <dd><:formidable:editer_message_ok:></dd> </dl> [(#ENV{source}|!={sessions}|oui) - #SET{saisies,#SAISIES*|unserialize} + #SET{saisies,#SAISIES*|formidable_deserialize} ] </BOUCLE_formulaire> <BOUCLE_session(CONDITION) {si #GET{source}|=={session}}> diff --git a/modeles/formulaire_analyse.html b/modeles/formulaire_analyse.html index ca28fdf67dd5ae0d995403c890b9ab866caaf0d5..1dd85fee38fa71bda69a74b02e3c3ea0b6b98d61 100644 --- a/modeles/formulaire_analyse.html +++ b/modeles/formulaire_analyse.html @@ -1,12 +1,12 @@ <BOUCLE_formulaire(FORMULAIRES){id_formulaire}> -#SET{exclure_champs,#TRAITEMENTS|unserialize|table_valeur{enregistrement}|table_valeur{analyse_exclure_champs}|explode{|}} +#SET{exclure_champs,#TRAITEMENTS|formidable_deserialize|table_valeur{enregistrement}|table_valeur{analyse_exclure_champs}|explode{|}} <div class='formidable_analyse'> [(#REM) On fait un tableau qui contient toutes les réponses, classées par champ, sauf pour les champs qui sont à ne pas prendre en compte ] #SET{valeurs,#ARRAY} #SET{reponses_total,0} <BOUCLE_reponses(FORMULAIRES_REPONSES){id_formulaire}> <BOUCLE_champs(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}{nom ?= #ENV{nom}}{!nom IN #GET{exclure_champs}}> -#SET_MERGE{liste_valeurs, #GET{valeurs}|table_valeur{#NOM}|sinon{#ARRAY}, #ARRAY{0,#VALEUR|tenter_unserialize}} +#SET_MERGE{liste_valeurs, #GET{valeurs}|table_valeur{#NOM}|sinon{#ARRAY}, #ARRAY{0,#VALEUR|formidable_deserialize}} #SET_MERGE{valeurs, #ARRAY{#NOM,#GET{liste_valeurs}}} </BOUCLE_champs> </BOUCLE_reponses> @@ -18,7 +18,7 @@ <strong class='nombre_reponse'><:formidable:reponse_aucune:></strong> <//B_reponses> -<BOUCLE_saisies(DATA){source tableau, #SAISIES|unserialize|saisies_lister_par_nom}> +<BOUCLE_saisies(DATA){source tableau, #SAISIES|formidable_deserialize|saisies_lister_par_nom}> [(#VAL{saisie}|array_key_exists{#VALEUR}|oui) [(#CLE|=={#ENV{nom,#CLE}}|oui) [(#CLE|in_array{#GET{exclure_champs}}|non) diff --git a/modeles/formulaires_reponse.html b/modeles/formulaires_reponse.html index 494af6eef6c6cd020b36154cf860cee5319d3dae..c8b583954b703bf134736469c9f94919013972e0 100644 --- a/modeles/formulaires_reponse.html +++ b/modeles/formulaires_reponse.html @@ -1,11 +1,11 @@ <BOUCLE_reponse(FORMULAIRES_REPONSES){tout}{id_formulaires_reponse}> <BOUCLE_formulaire(FORMULAIRES){tout}{id_formulaire}> -#SET{saisies,#SAISIES|unserialize} +#SET{saisies,#SAISIES|formidable_deserialize} </BOUCLE_formulaire> #SET{valeurs,#ARRAY} <BOUCLE_champs(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}> -#SET_MERGE{valeurs,#ARRAY{#NOM,#VALEUR|tenter_unserialize|formidable_ajouter_action_recuperer_fichier{#NOM,#GET{saisies},#ID_FORMULAIRE,#ID_FORMULAIRES_REPONSE}} +#SET_MERGE{valeurs,#ARRAY{#NOM,#VALEUR|formidable_deserialize|formidable_ajouter_action_recuperer_fichier{#NOM,#GET{saisies},#ID_FORMULAIRE,#ID_FORMULAIRES_REPONSE}} </BOUCLE_champs> #VOIR_SAISIES{#GET{saisies}, #GET{valeurs}} diff --git a/prive/squelettes/contenu/formulaire.html b/prive/squelettes/contenu/formulaire.html index 7493d064a97a189a3f145fde1c7a4d49c6961a96..20557596a4879cd63a008a09b15c196971e53541 100644 --- a/prive/squelettes/contenu/formulaire.html +++ b/prive/squelettes/contenu/formulaire.html @@ -22,7 +22,7 @@ |concat{<:formidable:traitements_actives:>},'sobre traitements mini'})] <B_traitements> <ul class='spip'> - <BOUCLE_traitements(DATA){source tableau, #TRAITEMENTS|unserialize|sinon{#ARRAY}}> + <BOUCLE_traitements(DATA){source tableau, #TRAITEMENTS|formidable_deserialize|sinon{#ARRAY}}> <li>[(#GET{traitements_disponibles}|table_valeur{#CLE}|table_valeur{titre})]</li> </BOUCLE_traitements> </ul> diff --git a/traiter/email.php b/traiter/email.php index e2c052c2fef4c915248ba195ca5c8206357038eb..80753f88f6f091b3bf1c1634e6e7c6f4a34a0170 100644 --- a/traiter/email.php +++ b/traiter/email.php @@ -31,9 +31,9 @@ function traiter_email_dist($args, $retours) { $id_formulaire = $args['id_formulaire']; $formulaire = $args['formulaire']; $options = $args['options']; - $saisies = unserialize($formulaire['saisies']); + $saisies = $args['saisies']; $saisies_fond_notification = $saisies; - $traitements = unserialize($formulaire['traitements']); + $traitements = $args['traitements']; $champs = saisies_lister_champs($saisies); $destinataires = array(); $taille_fichiers = 0; //taille des fichiers en email diff --git a/traiter/enregistrement.php b/traiter/enregistrement.php index 5067b284c007d141833452bfab2d69d79bce7803..ae2f65bcdadc74a02bcfc602eaf9d66e284a58f4 100644 --- a/traiter/enregistrement.php +++ b/traiter/enregistrement.php @@ -8,12 +8,12 @@ include_spip('inc/formidable_fichiers'); function traiter_enregistrement_dist($args, $retours) { include_spip('inc/formidable'); include_spip('base/abstract_sql'); + include_spip('inc/formidable'); $retours['fichiers'] = array(); // on va stocker des infos sur les fichiers, pour les prochains traitement $options = $args['options']; $formulaire = $args['formulaire']; $id_formulaire = $args['id_formulaire']; - $saisies = unserialize($formulaire['saisies']); - $saisies = saisies_lister_par_nom($saisies); + $saisies = saisies_lister_par_nom($args['saisies']); $variable_php = ''; // La personne a-t-elle un compte ? $id_auteur = isset($GLOBALS['visiteur_session']) ? (isset($GLOBALS['visiteur_session']['id_auteur']) ? @@ -124,7 +124,7 @@ function traiter_enregistrement_dist($args, $retours) { $insertions[] = array( 'id_formulaires_reponse' => $id_formulaires_reponse, 'nom' => $nom, - 'valeur' => is_array($valeur) ? serialize($valeur) : $valeur + 'valeur' => is_array($valeur) ? formidable_serialize($valeur) : $valeur ); $retours['fichiers'][$nom] = $valeur; } @@ -136,7 +136,7 @@ function traiter_enregistrement_dist($args, $retours) { $insertions[] = array( 'id_formulaires_reponse' => $id_formulaires_reponse, 'nom' => $nom, - 'valeur' => is_array($valeur) ? serialize($valeur) : $valeur + 'valeur' => is_array($valeur) ? formidable_serialize($valeur) : $valeur ); } }