[PLUGINS] +set de base
[lhc/web/www.git] / www / plugins / formidable_1_0 / formulaires / formidable.php
1 <?php
2
3 /**
4 * Gestion de l'affichage et traitement d'un formulaire Formidable
5 *
6 * @package SPIP\Formidable\Formulaires
7 **/
8
9 // Sécurité
10 if (!defined("_ECRIRE_INC_VERSION")) return;
11
12 include_spip('inc/formidable');
13 include_spip('inc/saisies');
14 include_spip('base/abstract_sql');
15 include_spip('inc/autoriser');
16
17 /**
18 * Chargement du formulaire CVT de Formidable.
19 *
20 * Genere le formulaire dont l'identifiant (numerique ou texte est indique)
21 *
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
29 *
30 * @return array
31 * Contexte envoyé au squelette HTML du formulaire.
32 **/
33 function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
34 $contexte = array();
35
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);
41 else
42 return;
43
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;
58
59 $contexte['id'] = $formulaire['id_formulaire'];
60 $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="'.$contexte['id'].'"/>';
61
62 // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
63 if ($valeurs){
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);
68 $valeurs = array();
69 foreach ($liste as $i=>$cle_ou_valeur){
70 if ($i % 2 == 0)
71 $valeurs[$liste[$i]] = $liste[$i+1];
72 }
73 }
74
75 // On regarde si maintenant on a un tableau
76 if ($valeurs and is_array($valeurs)){
77 $contexte = array_merge($contexte, $valeurs);
78 }
79 }
80
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);
84 if ($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.'"/>';
87 } else {
88 $contexte['editable'] = false;
89 $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
90 }
91 } else {
92
93 // calcul des paramètres d'anonymisation
94 $anonymisation = (isset($options['anonymiser']) && $options['anonymiser'] == true)
95 ? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
96 : '';
97
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)
104 ){
105 $id_formulaires_reponse = array_pop($reponses);
106 $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
107
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.'"/>';
110 }
111
112 }
113 }
114 else{
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'],
124 ));
125 } else {
126 $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
127 }
128 }
129 }
130 else{
131 $contexte['editable'] = false;
132 $contexte['message_erreur'] = _T('formidable:erreur_inexistant');
133 }
134 if (!isset($contexte['_hidden'])) {
135 $contexte['_hidden'] = '';
136 }
137 $contexte['_hidden'] .= "\n".'<input type="hidden" name="formidable_afficher_apres'/*.$formulaire['id_formulaire']*/.'" value="'.$formulaire['apres'].'"/>';// marche pas
138
139 $contexte['formidable_afficher_apres']=$formulaire['apres'];
140
141 return $contexte;
142 }
143
144
145 /**
146 * Vérification du formulaire CVT de Formidable.
147 *
148 * Pour chaque champ posté, effectue les vérifications demandées par
149 * les saisies et retourne éventuellement les erreurs de saisie.
150 *
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
158 *
159 * @return array
160 * Tableau des erreurs
161 **/
162 function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
163 $erreurs = array();
164
165 // Sale bête !
166 if (_request('mechantrobot') != ''){
167 $erreurs['hahahaha'] = 'hahahaha';
168 return $erreurs;
169 }
170
171 $id_formulaire = intval(_request('id_formulaire'));
172 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
173 $saisies = unserialize($formulaire['saisies']);
174
175 $erreurs = saisies_verifier($saisies);
176
177 if ($erreurs and !isset($erreurs['message_erreur']))
178 $erreurs['message_erreur'] = _T('formidable:erreur_generique');
179
180 return $erreurs;
181 }
182
183
184 /**
185 * Traitement du formulaire CVT de Formidable.
186 *
187 * Exécute les traitements qui sont indiqués dans la configuration des
188 * traitements de ce formulaire formidable.
189 *
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...
195 *
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
203 *
204 * @return array
205 * Tableau des erreurs
206 **/
207 function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){
208 $retours = array();
209
210 $id_formulaire = intval(_request('id_formulaire'));
211 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire);
212 $traitements = unserialize($formulaire['traitements']);
213
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'];
217
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];
226 } else {
227 $url_redirect = $formulaire['url_redirect']; // URL classique
228 }
229
230 $retours['redirect'] = $url_redirect;
231 }
232
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(
238 array(
239 'formulaire' => $formulaire,
240 'options' => $options
241 ),
242 $retours
243 );
244 }
245 }
246
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']);
250 }
251 }
252 else{
253 $retours['message_ok'] = _T('formidable:retour_aucun_traitement');
254 }
255
256 return $retours;
257 }
258
259
260 /**
261 * Ajoute dans le contexte les elements
262 * donnés par une reponse de formulaire indiquée
263 *
264 * @param array $contexte
265 * Contexte pour le squelette HTML du formulaire
266 * @param int $id_formulaires_reponse
267 * Identifiant de réponse
268 * @param bool $ok
269 * La reponse existe bien ?
270 * @return array $contexte
271 * Contexte complète des nouvelles informations
272 *
273 **/
274 function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) {
275 // On va chercher tous les champs
276 $champs = sql_allfetsel(
277 'nom, valeur',
278 'spip_formulaires_reponses_champs',
279 'id_formulaires_reponse = '.$id_formulaires_reponse
280 );
281 $ok = count($champs) ? true : false;
282
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'];
287 }
288
289 return $contexte;
290 }
291
292 ?>