diff --git a/formulaires/formidable.php b/formulaires/formidable.php index d9c998213fd1acec89608a25c542db797408f1e0..49598f3483e646bb3a1dc2b5b46bed22d025a90d 100644 --- a/formulaires/formidable.php +++ b/formulaires/formidable.php @@ -1,220 +1,233 @@ <?php /** - * Gestion de l'affichage et traitement d'un formulaire Formidable - * - * @package SPIP\Formidable\Formulaires - **/ +* Gestion de l'affichage et traitement d'un formulaire Formidable +* +* @package SPIP\Formidable\Formulaires +**/ // Sécurité if (!defined('_ECRIRE_INC_VERSION')) { - return; +return; } include_spip('inc/formidable'); include_spip('inc/saisies'); include_spip('base/abstract_sql'); include_spip('inc/autoriser'); +include_spip('plugins/installer'); function formidable_id_formulaire($id) { - // on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi - // meme si entre temps on perds la base - static $id_formulaires = array(); - if (isset($id_formulaires[$id])) { - return $id_formulaires[$id]; - } +// on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi +// meme si entre temps on perds la base +static $id_formulaires = array(); +if (isset($id_formulaires[$id])) { + return $id_formulaires[$id]; +} - if (is_numeric($id)) { - $where = 'id_formulaire = ' . intval($id); - } elseif (is_string($id)) { - $where = 'identifiant = ' . sql_quote($id); - } else { - return 0; - } +if (is_numeric($id)) { + $where = 'id_formulaire = ' . intval($id); +} elseif (is_string($id)) { + $where = 'identifiant = ' . sql_quote($id); +} else { + return 0; +} - $id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where)); +$id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where)); - if ($id_formulaire - and !test_espace_prive() - and !objet_test_si_publie('formulaire', $id_formulaire)) { - return $id_formulaires[$id] = 0; - } +if ($id_formulaire + and !test_espace_prive() + and !objet_test_si_publie('formulaire', $id_formulaire)) { + return $id_formulaires[$id] = 0; +} - return $id_formulaires[$id] = $id_formulaire; +return $id_formulaires[$id] = $id_formulaire; } /** - * Chargement du formulaire CVT de Formidable. - * - * Genere le formulaire dont l'identifiant (numerique ou texte est indique) - * - * @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 - * @param int|bool $id_formulaires_reponse - * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique - * - * @return array - * Contexte envoyé au squelette HTML du formulaire. - **/ +* Chargement du formulaire CVT de Formidable. +* +* Genere le formulaire dont l'identifiant (numerique ou texte est indique) +* +* @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 +* @param int|bool $id_formulaires_reponse +* Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique +* +* @return array +* Contexte envoyé au squelette HTML du formulaire. +**/ function formulaires_formidable_charger($id, $valeurs = array(), $id_formulaires_reponse = false) { - $contexte = array(); +$contexte = array(); - // On peut donner soit un id soit un identifiant - if (!$id_formulaire = formidable_id_formulaire($id)) { - return; - } +// On peut donner soit un id soit un identifiant +if (!$id_formulaire = formidable_id_formulaire($id)) { + return; +} - // On cherche si le formulaire existe - if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) { - // On ajoute un point d'entrée avec les infos de ce formulaire - // pour d'eventuels plugins qui en ont l'utilité - $contexte['_formidable'] = $formulaire; - - // Classes CSS - $contexte['_css'] = $formulaire['css']; - - // Est-ce que la personne a le droit de répondre ? - if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire' => $formulaire))) { - $saisies = unserialize($formulaire['saisies']); - $traitements = unserialize($formulaire['traitements']); - - // Si on est en train de réafficher les valeurs postées, - // ne pas afficher les saisies hidden - if ($formulaire['apres'] == 'valeurs' - and _request('formidable_afficher_apres') == 'valeurs' - ) { - foreach ($saisies as $k => $saisie) { - if (isset($saisie['saisie']) - and $saisie['saisie'] == 'hidden' - ) { - unset($saisies[$k]); - } +// On cherche si le formulaire existe +if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) { + // On ajoute un point d'entrée avec les infos de ce formulaire + // pour d'eventuels plugins qui en ont l'utilité + $contexte['_formidable'] = $formulaire; + + // Classes CSS + $contexte['_css'] = $formulaire['css']; + + // Est-ce que la personne a le droit de répondre ? + if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire' => $formulaire))) { + $saisies = unserialize($formulaire['saisies']); + $traitements = unserialize($formulaire['traitements']); + + // Si on est en train de réafficher les valeurs postées, + // ne pas afficher les saisies hidden + if ($formulaire['apres'] == 'valeurs' + and _request('formidable_afficher_apres') == 'valeurs' + ) { + foreach ($saisies as $k => $saisie) { + if (isset($saisie['saisie']) + and $saisie['saisie'] == 'hidden' + ) { + unset($saisies[$k]); } } + } - // On déclare les champs avec les valeurs par défaut - $contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte); - $contexte['mechantrobot'] = ''; - // On ajoute le formulaire complet - $contexte['_saisies'] = $saisies; - - $contexte['id'] = $formulaire['id_formulaire']; - $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="' . $contexte['id'] . '"/>'; - - // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit - if ($valeurs) { - // Si c'est une chaine on essaye de la parser - if (is_string($valeurs)) { - $liste = explode(',', $valeurs); - $liste = array_map('trim', $liste); - $valeurs = array(); - foreach ($liste as $i => $cle_ou_valeur) { - if ($i%2 == 0) { - $valeurs[$liste[$i]] = $liste[$i+1]; - } + // On déclare les champs avec les valeurs par défaut + $contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte); + $contexte['mechantrobot'] = ''; + // On ajoute le formulaire complet + $contexte['_saisies'] = $saisies; + + $contexte['id'] = $formulaire['id_formulaire']; + $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="' . $contexte['id'] . '"/>'; + + // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit + if ($valeurs) { + // Si c'est une chaine on essaye de la parser + if (is_string($valeurs)) { + $liste = explode(',', $valeurs); + $liste = array_map('trim', $liste); + $valeurs = array(); + foreach ($liste as $i => $cle_ou_valeur) { + if ($i%2 == 0) { + $valeurs[$liste[$i]] = $liste[$i+1]; } } + } - // Si on a un tableau, - // alors on écrase avec les valeurs données depuis l'appel - if ($valeurs and is_array($valeurs)) { - $contexte = array_merge($contexte, $valeurs); - } + // Si on a un tableau, + // alors on écrase avec les valeurs données depuis l'appel + if ($valeurs and is_array($valeurs)) { + $contexte = array_merge($contexte, $valeurs); } + } - // 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); - } + // 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 { - $contexte['editable'] = false; - // le formulaire a déjà été répondu. - // peut être faut il afficher les statistiques des réponses - if ($formulaire['apres']=='stats') { - // Nous sommes face à un sondage auquel on a déjà répondu ! - // On remplace complètement l'affichage du formulaire - // par un affichage du résultat de sondage ! - $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array( - 'id_formulaire' => $formulaire['id_formulaire'], - )); - } else { - $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu'); + // 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); } } } else { $contexte['editable'] = false; - $contexte['message_erreur'] = _T('formidable:erreur_inexistant'); - } - if (!isset($contexte['_hidden'])) { - $contexte['_hidden'] = ''; + // le formulaire a déjà été répondu. + // peut être faut il afficher les statistiques des réponses + if ($formulaire['apres']=='stats') { + // Nous sommes face à un sondage auquel on a déjà répondu ! + // On remplace complètement l'affichage du formulaire + // par un affichage du résultat de sondage ! + $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array( + 'id_formulaire' => $formulaire['id_formulaire'], + )); + } else { + $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu'); + } } - $contexte['_hidden'] .= "\n" . '<input type="hidden" name="formidable_afficher_apres' /*.$formulaire['id_formulaire']*/ . '" value="' . $formulaire['apres'] . '"/>'; // marche pas +} else { + $contexte['editable'] = false; + $contexte['message_erreur'] = _T('formidable:erreur_inexistant'); +} +if (!isset($contexte['_hidden'])) { + $contexte['_hidden'] = ''; +} +$contexte['_hidden'] .= "\n" . '<input type="hidden" name="formidable_afficher_apres' /*.$formulaire['id_formulaire']*/ . '" value="' . $formulaire['apres'] . '"/>'; // marche pas - $contexte['formidable_afficher_apres'] = $formulaire['apres']; +$contexte['formidable_afficher_apres'] = $formulaire['apres']; - return $contexte; +return $contexte; } /** - * Vérification du formulaire CVT de Formidable. - * - * Pour chaque champ posté, effectue les vérifications demandées par - * les saisies et retourne éventuellement les erreurs de saisie. - * - * @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 - * @param int|bool $id_formulaires_reponse - * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique - * - * @return array - * Tableau des erreurs - **/ +* Vérification du formulaire CVT de Formidable. +* +* Pour chaque champ posté, effectue les vérifications demandées par +* les saisies et retourne éventuellement les erreurs de saisie. +* +* @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 +* @param int|bool $id_formulaires_reponse +* Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique +* +* @return array +* Tableau des erreurs +**/ function formulaires_formidable_verifier($id, $valeurs = array(), $id_formulaires_reponse = false) { - $erreurs = array(); +$erreurs = array(); + +// On peut donner soit un id soit un identifiant +if (!$id_formulaire = formidable_id_formulaire($id)) { + $erreurs['message_erreur'] = _T('formidable:erreur_base'); +} else { + // Sale bête ! + if (_request('mechantrobot')!='') { + $erreurs['hahahaha'] = 'hahahaha'; + return $erreurs; + } - // On peut donner soit un id soit un identifiant - if (!$id_formulaire = formidable_id_formulaire($id)) { - $erreurs['message_erreur'] = _T('formidable:erreur_base'); - } else { - // Sale bête ! - if (_request('mechantrobot')!='') { - $erreurs['hahahaha'] = 'hahahaha'; - return $erreurs; - } + $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire)); + $saisies = unserialize($formulaire['saisies']); - $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire)); - $saisies = unserialize($formulaire['saisies']); + $erreurs_par_fichier = array(); + $erreurs = saisies_verifier($saisies,true,$erreurs_par_fichier); - $erreurs = saisies_verifier($saisies); + // On supprime de $_FILES les fichiers envoyés qui ne passent pas le test de vérification + + //$infos_plugins = charger_fonction('infos_plugins','plugins'); + $plugins_actifs = liste_plugin_actifs(); + if (isset($plugins_actifs['CVTUPLOAD'])) { + include_spip('inc/cvtupload'); + foreach ($erreurs as $champ => $erreur) { + cvtupload_nettoyer_files_selon_erreurs($champ, $erreurs_par_fichier[$champ]); + } + } // Si on a pas déjà une erreur sur le champ unicite, on lance une verification if ($formulaire['unicite'] != '') {