[CSS] +fix page header and title color
[lhc/web/www.git] / www / plugins / formidable / 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')) {
11 return;
12 }
13
14 include_spip('inc/formidable');
15 include_spip('inc/formidable_fichiers');
16 include_spip('inc/saisies');
17 include_spip('base/abstract_sql');
18 include_spip('inc/autoriser');
19 include_spip('plugins/installer');
20
21 function formidable_id_formulaire($id) {
22 // on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi
23 // meme si entre temps on perds la base
24 static $id_formulaires = array();
25 if (isset($id_formulaires[$id])) {
26 return $id_formulaires[$id];
27 }
28
29 if (is_numeric($id)) {
30 $where = 'id_formulaire = ' . intval($id);
31 } elseif (is_string($id)) {
32 $where = 'identifiant = ' . sql_quote($id);
33 } else {
34 return 0;
35 }
36
37 $id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where));
38
39 if ($id_formulaire
40 and !test_espace_prive()
41 and !objet_test_si_publie('formulaire', $id_formulaire)) {
42 return $id_formulaires[$id] = 0;
43 }
44
45 return $id_formulaires[$id] = $id_formulaire;
46 }
47
48 /**
49 * Chargement du formulaire CVT de Formidable.
50 *
51 * Genere le formulaire dont l'identifiant (numerique ou texte est indique)
52 *
53 * @param int|string $id
54 * Identifiant numerique ou textuel du formulaire formidable
55 * @param array $valeurs
56 * Valeurs par défauts passées au contexte du formulaire
57 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
58 * @param int|bool $id_formulaires_reponse
59 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
60 *
61 * @return array
62 * Contexte envoyé au squelette HTML du formulaire.
63 **/
64 function formulaires_formidable_charger($id, $valeurs = array(), $id_formulaires_reponse = false) {
65 $contexte = array();
66
67 // On peut donner soit un id soit un identifiant
68 if (!$id_formulaire = formidable_id_formulaire($id)) {
69 return;
70 }
71
72 // On cherche si le formulaire existe
73 if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) {
74 // On ajoute un point d'entrée avec les infos de ce formulaire
75 // pour d'eventuels plugins qui en ont l'utilité
76 $contexte['_formidable'] = $formulaire;
77 // Classes CSS
78 $contexte['_css'] = $formulaire['css'];
79
80 // Est-ce que la personne a le droit de répondre ?
81 if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire' => $formulaire))) {
82 $saisies = unserialize($formulaire['saisies']);
83 $traitements = unserialize($formulaire['traitements']);
84
85 // Si on est en train de réafficher les valeurs postées,
86 // ne pas afficher les saisies hidden
87 if ($formulaire['apres'] == 'valeurs'
88 and _request('formidable_afficher_apres') == 'valeurs'
89 ) {
90 foreach ($saisies as $k => $saisie) {
91 if (isset($saisie['saisie'])
92 and $saisie['saisie'] == 'hidden'
93 ) {
94 unset($saisies[$k]);
95 }
96 }
97 }
98
99 // On déclare les champs avec les valeurs par défaut
100 $contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte);
101 $contexte['mechantrobot'] = '';
102 // On ajoute le formulaire complet
103 $contexte['_saisies'] = $saisies;
104
105 $contexte['id'] = $formulaire['id_formulaire'];
106 $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="' . $contexte['id'] . '"/>';
107
108 // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
109 if ($valeurs) {
110 // Si c'est une chaine on essaye de la parser
111 if (is_string($valeurs)) {
112 $liste = explode(',', $valeurs);
113 $liste = array_map('trim', $liste);
114 $valeurs = array();
115 foreach ($liste as $i => $cle_ou_valeur) {
116 if ($i%2 == 0) {
117 $valeurs[$liste[$i]] = $liste[$i+1];
118 }
119 }
120 }
121
122 // Si on a un tableau,
123 // alors on écrase avec les valeurs données depuis l'appel
124 if ($valeurs and is_array($valeurs)) {
125 $contexte = array_merge($contexte, $valeurs);
126 }
127 }
128
129 // Si on passe un identifiant de reponse, on edite cette reponse si elle existe
130 if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
131 $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
132 if ($ok == false) {
133 $contexte['editable'] = false;
134 $contexte['message_erreur'] = _T(
135 'formidable:traiter_enregistrement_erreur_edition_reponse_inexistante'
136 );
137 }
138 } else {
139 // calcul des paramètres d'anonymisation
140 $options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
141
142 $anonymisation = (isset($options['anonymiser']) && $options['anonymiser']==true)
143 ? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
144 : '';
145
146 // Si multiple = non mais que c'est modifiable, alors on va chercher
147 // la dernière réponse si elle existe
148 if ($options
149 and !$options['multiple']
150 and $options['modifiable']
151 and $reponses = formidable_verifier_reponse_formulaire(
152 $formulaire['id_formulaire'],
153 $options['identification'],
154 $anonymisation
155 )) {
156 $id_formulaires_reponse = array_pop($reponses);
157 $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
158 }
159 }
160 } else {
161 $contexte['editable'] = false;
162 // le formulaire a déjà été répondu.
163 // peut être faut il afficher les statistiques des réponses
164 if ($formulaire['apres']=='stats') {
165 // Nous sommes face à un sondage auquel on a déjà répondu !
166 // On remplace complètement l'affichage du formulaire
167 // par un affichage du résultat de sondage !
168 $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array(
169 'id_formulaire' => $formulaire['id_formulaire'],
170 ));
171 } else {
172 $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
173 $contexte['message_erreur_class'] = 'deja_repondu';
174 }
175 }
176 } else {
177 $contexte['editable'] = false;
178 $contexte['message_erreur'] = _T('formidable:erreur_inexistant');
179 }
180 if (!isset($contexte['_hidden'])) {
181 $contexte['_hidden'] = '';
182 }
183 $contexte['_hidden'] .= "\n" . '<input type="hidden" name="formidable_afficher_apres' /*.$formulaire['id_formulaire']*/ . '" value="' . $formulaire['apres'] . '"/>'; // marche pas
184
185 if ($precharger= _request('_formidable_cvtupload_precharger_fichiers')) {
186 $contexte['cvtupload_precharger_fichiers'] = $precharger;
187 }
188 $contexte['formidable_afficher_apres'] = $formulaire['apres'];
189
190 return $contexte;
191 }
192
193
194 /**
195 * Vérification du formulaire CVT de Formidable.
196 *
197 * Pour chaque champ posté, effectue les vérifications demandées par
198 * les saisies et retourne éventuellement les erreurs de saisie.
199 *
200 * @param int|string $id
201 * Identifiant numerique ou textuel du formulaire formidable
202 * @param array $valeurs
203 * Valeurs par défauts passées au contexte du formulaire
204 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
205 * @param int|bool $id_formulaires_reponse
206 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
207 *
208 * @return array
209 * Tableau des erreurs
210 **/
211 function formulaires_formidable_verifier($id, $valeurs = array(), $id_formulaires_reponse = false) {
212 $erreurs = array();
213 // On peut donner soit un id soit un identifiant
214 if (!$id_formulaire = formidable_id_formulaire($id)) {
215 $erreurs['message_erreur'] = _T('formidable:erreur_base');
216 } else {
217 // Sale bête !
218 if (_request('mechantrobot')!='') {
219 $erreurs['hahahaha'] = 'hahahaha';
220 return $erreurs;
221 }
222
223 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire));
224 $saisies = unserialize($formulaire['saisies']);
225
226 $erreurs_par_fichier = array();
227 $erreurs = saisies_verifier($saisies, true, $erreurs_par_fichier);
228
229 // On supprime de $_FILES les fichiers envoyés qui ne passent pas le test de vérification
230
231 //$infos_plugins = charger_fonction('infos_plugins','plugins');
232 $plugins_actifs = liste_plugin_actifs();
233 if (isset($plugins_actifs['CVTUPLOAD'])) {
234 include_spip('inc/cvtupload');
235 foreach ($erreurs as $champ => $erreur) {
236 if (isset($erreurs_par_fichier[$champ])) {
237 cvtupload_nettoyer_files_selon_erreurs($champ, $erreurs_par_fichier[$champ]);
238 }
239 }
240 }
241
242 // Si on a pas déjà une erreur sur le champ unicite, on lance une verification
243 if ($formulaire['unicite'] != '') {
244 if (!$erreurs[$formulaire['unicite']]) {
245 $reponses = sql_allfetsel(
246 'R.id_formulaire AS id',
247 'spip_formulaires_reponses AS R
248 LEFT JOIN spip_formulaires AS F
249 ON R.id_formulaire=F.id_formulaire
250 LEFT JOIN spip_formulaires_reponses_champs AS C
251 ON R.id_formulaires_reponse=C.id_formulaires_reponse',
252 'R.id_formulaire = ' . $id_formulaire . '
253 AND C.nom='.sql_quote($formulaire['unicite']).'
254 AND C.valeur='.sql_quote(_request($formulaire['unicite'])).'
255 AND R.statut = "publie"'
256 );
257 if (is_array($reponses) && count($reponses) > 0) {
258 $erreurs[$formulaire['unicite']] = $formulaire['message_erreur_unicite'] ?
259 _T($formulaire['message_erreur_unicite']) : _T('formidable:erreur_unicite');
260 }
261 }
262 }
263
264 if ($erreurs and !isset($erreurs['message_erreur'])) {
265 $erreurs['message_erreur'] = _T('formidable:erreur_generique');
266 }
267 }
268 return $erreurs;
269 }
270
271
272 /**
273 * Traitement du formulaire CVT de Formidable.
274 *
275 * Exécute les traitements qui sont indiqués dans la configuration des
276 * traitements de ce formulaire formidable.
277 *
278 * Une fois fait, gère le retour après traitements des saisies en fonction
279 * de ce qui a été configuré dans le formulaire, par exemple :
280 * - faire réafficher le formulaire,
281 * - faire afficher les saisies
282 * - rediriger sur une autre page...
283 *
284 * @param int|string $id
285 * Identifiant numerique ou textuel du formulaire formidable
286 * @param array $valeurs
287 * Valeurs par défauts passées au contexte du formulaire
288 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
289 * @param int|bool $id_formulaires_reponse
290 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
291 *
292 * @return array
293 * Tableau des erreurs
294 **/
295 function formulaires_formidable_traiter($id, $valeurs = array(), $id_formulaires_reponse = false) {
296 $retours = array();
297
298 // POST Mortem de securite : on log le $_POST pour ne pas le perdre si quelque chose se passe mal
299 include_spip('inc/json');
300 $post = json_encode(array('post' => $_POST, 'files' => $_FILES));
301 spip_log($post, 'formidable_post'._LOG_INFO_IMPORTANTE);
302
303 // On peut donner soit un id soit un identifiant
304 if (!$id_formulaire = formidable_id_formulaire($id)) {
305 return array('message_erreur'=>_T('formidable:erreur_base'));
306 }
307
308 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . $id_formulaire);
309 $traitements = unserialize($formulaire['traitements']);
310 $traitements = pipeline(
311 'formidable_traitements',
312 array(
313 'args'=>array('id_formulaire'=>$id_formulaire),
314 'data'=>$traitements
315 )
316 );
317 // selon le choix, le formulaire se remet en route à la fin ou non
318 $retours['editable'] = ($formulaire['apres']=='formulaire');
319 $retours['formidable_afficher_apres'] = $formulaire['apres'];
320 $retours['id_formulaire'] = $id_formulaire;
321
322 // Si on a une redirection valide
323 if (($formulaire['apres'] == 'redirige') and ($formulaire['url_redirect'] != '')) {
324 refuser_traiter_formulaire_ajax();
325 // traiter les raccourcis artX, brX
326 include_spip('inc/lien');
327 $url_redirect = typer_raccourci($formulaire['url_redirect']);
328 if (count($url_redirect) > 2) {
329 $url_redirect = $url_redirect[0] . $url_redirect[2];
330 } else {
331 $url_redirect = $formulaire['url_redirect']; // URL classique
332 }
333
334 $retours['redirect'] = $url_redirect;
335 }
336
337 // les traitements deja faits se notent ici
338 // pour etre sur de ne pas etre appeles 2 fois
339 // ainsi si un traitement A a besoin d'un traitement B,
340 // et que B n'est pas fait quand il est appele, il peut rendre la main sans rien faire au premier coup
341 // et sera rappele au second tour
342 $retours['traitements'] = array();
343 $erreur_texte = '';
344
345 // Si on a des traitements
346 if (is_array($traitements) and !empty($traitements)) {
347 $maxiter = 5;
348 do {
349 foreach ($traitements as $type_traitement => $options) {
350 // si traitement deja appele, ne pas le relancer
351 if (!isset($retours['traitements'][$type_traitement])) {
352 if ($appliquer_traitement = charger_fonction($type_traitement, 'traiter/', true)) {
353 $retours = $appliquer_traitement(
354 array(
355 'formulaire' => $formulaire,
356 'options' => $options,
357 'id_formulaire' => $id_formulaire,
358 'valeurs' => $valeurs,
359 'id_formulaires_reponse' => $id_formulaires_reponse,
360 ),
361 $retours
362 );
363 } else {
364 // traitement introuvable, ne pas retenter
365 $retours['traitements'][$type_traitement] = true;
366 }
367 }
368 }
369 } while (count($retours['traitements']) < count($traitements) and $maxiter--);
370 // si on ne peut pas traiter correctement, alerter le webmestre
371 if (count($retours['traitements']) < count($traitements)) {
372 $erreur_texte = "Impossible de traiter correctement le formulaire $id\n"
373 . 'Traitements attendus :'.implode(',', array_keys($traitements))."\n"
374 . 'Traitements realises :'.implode(',', array_keys($retours['traitements']))."\n";
375 }
376
377 // Si on a personnalisé le message de retour, c'est lui qui est affiché uniquement
378 if ($formulaire['message_retour']) {
379 $retours['message_ok'] = _T_ou_typo($formulaire['message_retour']);
380 }
381 } else {
382 $retours['message_erreur'] = _T('formidable:retour_aucun_traitement');
383 }
384 if (isset($retours['fichiers'])) {// traitement particuliers si fichiers
385 if ($erreurs_fichiers = formidable_produire_messages_erreurs_fichiers($retours['fichiers'])) {
386 // Inspecter les fichiers pour voir s'il y a des erreurs
387 // Avertir l'utilisateur
388 if (isset($retours['message_erreur'])) {
389 $retours['message_erreur'] .= '<br />'.$erreurs_fichiers['message_public'];
390 } else {
391 $retours['message_erreur'] = $erreurs_fichiers['message_public'];
392 }
393 // Avertir le webmestre
394 if (isset($retours['id_formulaires_reponse'])) {
395 $erreur_fichiers_sujet = '[ERREUR] Impossible de sauvegarder les fichiers de la réponse '.$retours['id_formulaires_reponse']." au formulaire $id";
396 } else {
397 $erreur_fichiers_sujet = "[ERREUR] Impossible de sauvegarder les fichiers de la réponse au formulaire $id";
398 }
399 $erreur_fichiers_texte = "Récupérez le plus rapidement possible les fichiers temporaires suivants\n";
400 $erreur_fichiers_texte .= $erreurs_fichiers['message_webmestre'];
401 $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
402 $envoyer_mail($GLOBALS['meta']['email_webmaster'], $erreur_fichiers_sujet, $erreur_fichiers_texte);
403 }
404 if ($formulaire['apres'] == 'valeurs') {
405 // Si on affiche après les valeurs des réponses, modifier _request pour les saisies de types fichiers
406 $vignette_par_defaut = charger_fonction('vignette', 'inc/');
407 foreach ($retours['fichiers'] as $saisie => $description) {
408 foreach ($description as $i => $desc) {
409 // ajouter la vignette et l'url
410 if (!isset($description[$i]['erreur'])) {
411 $description[$i]['vignette'] = $vignette_par_defaut($desc['extension'], false);
412 if (isset($retours['id_formulaires_reponse'])) {// si réponse enregistrée
413 $description[$i]['url'] = formidable_generer_url_action_recuperer_fichier($id_formulaire, $retours['id_formulaires_reponse'], $saisie, $desc['fichier']);
414 } elseif (isset($retours['timestamp'])) { // si réponse simplement envoyée par courriel
415 $description[$i]['url'] = formidable_generer_url_action_recuperer_fichier_email(
416 $saisie,
417 $desc['fichier'],
418 array('timestamp'=>$retours['timestamp'])
419 );
420 }
421 }
422 }
423 set_request($saisie, $description);
424 }
425 }
426 }
427 // Si on fait une redirection
428 // Et que l'on a enregistré le résultat
429 // Alors, passer l'id de la réponse à la page
430 if (isset($retours['id_formulaires_reponse']) AND isset($retours['redirect'])) {
431 $retours['redirect'] = parametre_url($retours['redirect'], 'id_formulaires_reponse', $retours['id_formulaires_reponse'], '&');
432 }
433 // lorsqu'on affichera à nouveau le html,
434 // dire à cvt-upload de ne pas générer le html pour les résultats des saisies fichiers
435 if ($formulaire['apres']=='formulaire' and isset($retours['fichiers'])) {
436 $formidable_cvtupload_precharger_fichiers = array();
437 set_request('_fichiers', null);
438 set_request('_cvtupload_precharger_fichiers_forcer', true);
439 foreach ($retours['fichiers'] as $champ => $valeur) {
440 $i = -1;
441 foreach ($valeur as $id => $info) {
442 $i++;
443 if (isset($info['fichier'])) {
444 $nom_fichier = $info['fichier'];
445 } else {
446 $nom_fichier = $info['nom'];
447 }
448 if (isset($retours['id_formulaires_reponse'])) {
449 $chemin_fichier = _DIR_FICHIERS_FORMIDABLE
450 .'formulaire_'.$retours['id_formulaire']
451 .'/reponse_'.$retours['id_formulaires_reponse']
452 .'/'.$champ
453 .'/'.$nom_fichier;
454 $formidable_cvtupload_precharger_fichiers[$champ][$i]['url'] = formidable_generer_url_action_recuperer_fichier($retours['id_formulaire'], $retours['id_formulaires_reponse'], $champ, $nom_fichier);
455 $formidable_cvtupload_precharger_fichiers[$champ][$i]['chemin'] = $chemin_fichier;
456 } elseif (isset($retours['timestamp'])) {
457 $chemin_fichier = _DIR_FICHIERS_FORMIDABLE
458 .'timestamp/'
459 .$retours['timestamp'].'/'
460 .$champ.'/'
461 .$nom_fichier;
462 $formidable_cvtupload_precharger_fichiers[$champ][$i]['chemin'] = $chemin_fichier;
463 $formidable_cvtupload_precharger_fichiers[$champ][$i]['url'] = formidable_generer_url_action_recuperer_fichier_email(
464 $champ,
465 $nom_fichier,
466 array('timestamp'=>$retours['timestamp'])
467 );
468 }
469 }
470 }
471 set_request('_formidable_cvtupload_precharger_fichiers', $formidable_cvtupload_precharger_fichiers);
472 }
473 // si aucun traitement, alerter le webmestre pour ne pas perdre les donnees
474 if (!$erreur_texte and !count($retours['traitements'])) {
475 $erreur_texte = "Aucun traitement pour le formulaire $id\n";
476 }
477 if ($erreur_texte) {
478 $erreur_sujet = "[ERREUR] Traitement Formulaire $id";
479 // dumper la saisie pour ne pas la perdre
480 $erreur_texte .= "\n".var_export($_REQUEST, true)."\n".var_export($_FILES, true);
481 $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
482 $envoyer_mail($GLOBALS['meta']['email_webmaster'], $erreur_sujet, $erreur_texte);
483 }
484 unset($retours['traitements']);
485 return $retours;
486 }
487
488 /**
489 * Déclare à cvtupload les champs fichiers du formulaire
490 *
491 * @param int|string $id
492 * Identifiant numerique ou textuel du formulaire formidable
493 * @param array $valeurs
494 * Valeurs par défauts passées au contexte du formulaire
495 * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
496 * @param int|bool $id_formulaires_reponse
497 * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
498 *
499 * @return array
500 * Tableau des champs de type fichier
501 **/
502 function formulaires_formidable_fichiers($id, $valeurs = array(), $id_formulaires_reponse = false) {
503 // On peut donner soit un id soit un identifiant
504 if (!$id_formulaire = formidable_id_formulaire($id)) {
505 return array();
506 }
507
508 // On cherche les saisies du formulaire
509 if ($saisies = sql_getfetsel('saisies', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) {
510 $saisies = unserialize($saisies);
511 include_spip('inc/saisies_lister');
512 $saisies_fichiers = array_keys(saisies_lister_avec_type($saisies, 'fichiers'));
513 return $saisies_fichiers;
514 }
515 }
516 /**
517 * Ajoute dans le contexte les elements
518 * donnés par une reponse de formulaire indiquée
519 *
520 * @param array $contexte
521 * Contexte pour le squelette HTML du formulaire
522 * @param int $id_formulaires_reponse
523 * Identifiant de réponse
524 * @param bool $ok
525 * La reponse existe bien ?
526 * @return array $contexte
527 * Contexte complète des nouvelles informations
528 *
529 **/
530 function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) {
531
532 // On prépare des infos si jamais on a des champs fichiers
533 $saisies_fichiers = saisies_lister_avec_type($contexte['_saisies'], 'fichiers');// les saisies de type fichier
534 $fichiers = array();
535 $id_formulaire = $contexte['_formidable']['id_formulaire'];
536
537 // On va chercher tous les champs
538 $champs = sql_allfetsel(
539 'nom, valeur',
540 'spip_formulaires_reponses_champs',
541 'id_formulaires_reponse = ' . $id_formulaires_reponse
542 );
543 $ok = count($champs) ? true : false;
544 // On remplit le contexte avec les résultats précédents
545 foreach ($champs as $champ) {
546 if (array_key_exists($champ['nom'], $saisies_fichiers)) {
547 $valeur= unserialize($champ['valeur']);
548 $nom = $champ['nom'];
549 $fichiers[$nom] = array();
550 $chemin = _DIR_FICHIERS_FORMIDABLE
551 ."formulaire_$id_formulaire/reponse_$id_formulaires_reponse/"
552 ."$nom/";
553 foreach ($valeur as $f => $fichier) {
554 $fichiers[$nom][$f]= array();
555 $param = serialize(array(
556 'formulaire' => $id_formulaire,
557 'reponse' => $id_formulaires_reponse,
558 'fichier' => $fichier['nom'],
559 'saisie' => $champ['nom']
560 ));
561 $fichiers[$nom][$f]['url'] = formidable_generer_url_action_recuperer_fichier($id_formulaire, $id_formulaires_reponse, $champ['nom'], $fichier['nom']);
562 $fichiers[$nom][$f]['chemin'] = $chemin.$fichier['nom'];
563 }
564 } else {
565 $test_array = filtre_tenter_unserialize_dist($champ['valeur']);
566 $contexte[$champ['nom']] = is_array($test_array) ? $test_array : $champ['valeur'];
567 }
568 }
569 if ($fichiers != array()) {//s'il y a des fichiers dans les réponses
570 $contexte['cvtupload_precharger_fichiers'] = $fichiers;
571 }
572 return $contexte;
573 }
574
575 /**
576 * Produire un message d'erreur concaténant les messages d'erreurs
577 * par fichier.
578 * Fournir également une forme pour l'envoyer par webmestre
579 * @param array $fichiers
580 * le tableau des fichiers qui a été remplie par formidable_deplacer_fichiers_produire_vue_saisie()
581 * @return array ('message_public' => 'message', 'message_webmestre' => 'message'
582 **/
583 function formidable_produire_messages_erreurs_fichiers($fichiers) {
584 $message_public = '';
585 $message_webmestre = '';
586 foreach ($fichiers as $champ => $description_champ) {
587 foreach ($description_champ as $n => $description) {
588 if (isset($description['erreur'])) {
589 $message_public .= $description['erreur']."\n";
590 $message_webmestre .= "Pour le champ $champ[$n]:\n"
591 . '- Le fichier temporaire : '.$description['tmp_name']."\n"
592 . '- Ayant pour véritable nom : '.$description['nom']." \n";
593 }
594 }
595 }
596 if ($message_public !='') {
597 return array('message_public'=>$message_public, 'message_webmestre'=>$message_webmestre);
598 } else {
599 return '';
600 }
601 }