4 * Gestion de l'affichage et traitement d'un formulaire Formidable
6 * @package SPIP\Formidable\Formulaires
10 if (!defined("_ECRIRE_INC_VERSION")) return;
12 include_spip('inc/formidable');
13 include_spip('inc/saisies');
14 include_spip('base/abstract_sql');
15 include_spip('inc/autoriser');
18 * Chargement du formulaire CVT de Formidable.
20 * Genere le formulaire dont l'identifiant (numerique ou texte est indique)
22 * @param int|string $id_formulaire
23 * Identifiant numerique ou textuel du formulaire formidable
24 * @param array $valeurs
25 * Valeurs par défauts passées au contexte du formulaire
26 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
27 * @param int|bool $id_formulaires_reponse
28 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
31 * Contexte envoyé au squelette HTML du formulaire.
33 function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
36 // On peut donner soit un id soit un identifiant
37 if (intval($id_formulaire) > 0)
38 $where = 'id_formulaire = '.intval($id_formulaire);
39 elseif (is_string($id_formulaire))
40 $where = 'identifiant = '.sql_quote($id_formulaire);
44 // On cherche si le formulaire existe
45 if ($formulaire = sql_fetsel('*', 'spip_formulaires', $where)) {
46 // on ajoute un point d'entrée avec les infos de ce formulaire
47 // pour d'eventuels plugins qui en ont l'utilité
48 $contexte +
= array('_formidable' => $formulaire);
49 // Est-ce que la personne a le droit de répondre ?
50 if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire'=>$formulaire))){
51 $saisies = unserialize($formulaire['saisies']);
52 $traitements = unserialize($formulaire['traitements']);
53 // On déclare les champs
54 $contexte +
= array_fill_keys(saisies_lister_champs($saisies), '');
55 $contexte['mechantrobot'] = '';
56 // On ajoute le formulaire complet
57 $contexte['_saisies'] = $saisies;
59 $contexte['id'] = $formulaire['id_formulaire'];
60 $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="'.$contexte['id'].'"/>';
62 // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
64 // Si c'est une chaine on essaye de la parser
65 if (is_string($valeurs)){
66 $liste = explode(',', $valeurs);
67 $liste = array_map('trim', $liste);
69 foreach ($liste as $i=>$cle_ou_valeur){
71 $valeurs[$liste[$i]] = $liste[$i+
1];
75 // On regarde si maintenant on a un tableau
76 if ($valeurs and is_array($valeurs)){
77 $contexte = array_merge($contexte, $valeurs);
81 // Si on passe un identifiant de reponse, on edite cette reponse si elle existe
82 if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
83 $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
85 // On ajoute un hidden pour dire que c'est une modif
86 $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>';
88 $contexte['editable'] = false;
89 $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
93 // calcul des paramètres d'anonymisation
94 $anonymisation = (isset($options['anonymiser']) && $options['anonymiser'] == true)
95 ?
isset($options['anonymiser_variable']) ?
$options['anonymiser_variable'] : ''
98 // Si multiple = non mais que c'est modifiable, alors on va chercher
99 // la dernière réponse si elle existe
100 if ($options = $traitements['enregistrement']
101 and !$options['multiple']
102 and $options['modifiable']
103 and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation)
105 $id_formulaires_reponse = array_pop($reponses);
106 $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
108 // On ajoute un hidden pour dire que c'est une modif
109 $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>';
115 $contexte['editable'] = false;
116 // le formulaire a déjà été répondu.
117 // peut être faut il afficher les statistiques des réponses
118 if ($formulaire['apres'] == 'stats') {
119 // Nous sommes face à un sondage auquel on a déjà répondu !
120 // On remplace complètement l'affichage du formulaire
121 // par un affichage du résultat de sondage !
122 $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array(
123 'id_formulaire' => $formulaire['id_formulaire'],
126 $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
131 $contexte['editable'] = false;
132 $contexte['message_erreur'] = _T('formidable:erreur_inexistant');
134 if (!isset($contexte['_hidden'])) {
135 $contexte['_hidden'] = '';
137 $contexte['_hidden'] .= "\n".'<input type="hidden" name="formidable_afficher_apres'/*.$formulaire['id_formulaire']*/.'" value="'.$formulaire['apres'].'"/>';// marche pas
139 $contexte['formidable_afficher_apres']=$formulaire['apres'];
146 * Vérification du formulaire CVT de Formidable.
148 * Pour chaque champ posté, effectue les vérifications demandées par
149 * les saisies et retourne éventuellement les erreurs de saisie.
151 * @param int|string $id_formulaire
152 * Identifiant numerique ou textuel du formulaire formidable
153 * @param array $valeurs
154 * Valeurs par défauts passées au contexte du formulaire
155 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
156 * @param int|bool $id_formulaires_reponse
157 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
160 * Tableau des erreurs
162 function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
166 if (_request('mechantrobot') != ''){
167 $erreurs['hahahaha'] = 'hahahaha';
171 $id_formulaire = intval(_request('id_formulaire'));
172 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
173 $saisies = unserialize($formulaire['saisies']);
175 $erreurs = saisies_verifier($saisies);
177 if ($erreurs and !isset($erreurs['message_erreur']))
178 $erreurs['message_erreur'] = _T('formidable:erreur_generique');
185 * Traitement du formulaire CVT de Formidable.
187 * Exécute les traitements qui sont indiqués dans la configuration des
188 * traitements de ce formulaire formidable.
190 * Une fois fait, gère le retour après traitements des saisies en fonction
191 * de ce qui a été configuré dans le formulaire, par exemple :
192 * - faire réafficher le formulaire,
193 * - faire afficher les saisies
194 * - rediriger sur une autre page...
196 * @param int|string $id_formulaire
197 * Identifiant numerique ou textuel du formulaire formidable
198 * @param array $valeurs
199 * Valeurs par défauts passées au contexte du formulaire
200 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
201 * @param int|bool $id_formulaires_reponse
202 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
205 * Tableau des erreurs
207 function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
210 $id_formulaire = intval(_request('id_formulaire'));
211 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
212 $traitements = unserialize($formulaire['traitements']);
214 // selon le choix, le formulaire se remet en route à la fin ou non
215 $retours['editable'] = ($formulaire['apres']=='formulaire');
216 $retours['formidable_afficher_apres'] = $formulaire['apres'];
218 // Si on a une redirection valide
219 if (($formulaire['apres']== "redirige") AND ($formulaire['url_redirect']!="")) {
220 refuser_traiter_formulaire_ajax();
221 // traiter les raccourcis artX, brX
222 include_spip("inc/lien");
223 $url_redirect = typer_raccourci($formulaire['url_redirect']);
224 if (count($url_redirect)>2) {
225 $url_redirect = $url_redirect[0].$url_redirect[2];
227 $url_redirect = $formulaire['url_redirect']; // URL classique
230 $retours['redirect'] = $url_redirect;
233 // Si on a des traitements
234 if (is_array($traitements) and !empty($traitements)) {
235 foreach($traitements as $type_traitement=>$options){
236 if ($appliquer_traitement = charger_fonction($type_traitement, 'traiter/', true)) {
237 $retours = $appliquer_traitement(
239 'formulaire' => $formulaire,
240 'options' => $options
247 // Si on a personnalisé le message de retour, c'est lui qui est affiché uniquement
248 if ($formulaire['message_retour']) {
249 $retours['message_ok'] = _T_ou_typo($formulaire['message_retour']);
253 $retours['message_ok'] = _T('formidable:retour_aucun_traitement');
261 * Ajoute dans le contexte les elements
262 * donnés par une reponse de formulaire indiquée
264 * @param array $contexte
265 * Contexte pour le squelette HTML du formulaire
266 * @param int $id_formulaires_reponse
267 * Identifiant de réponse
269 * La reponse existe bien ?
270 * @return array $contexte
271 * Contexte complète des nouvelles informations
274 function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) {
275 // On va chercher tous les champs
276 $champs = sql_allfetsel(
278 'spip_formulaires_reponses_champs',
279 'id_formulaires_reponse = '.$id_formulaires_reponse
281 $ok = count($champs) ?
true : false;
283 // On remplit le contexte avec
284 foreach ($champs as $champ){
285 $test_array = unserialize($champ['valeur']);
286 $contexte[$champ['nom']] = is_array($test_array) ?
$test_array : $champ['valeur'];