source: spip-zone/_plugins_/formidable/trunk/formulaires/formidable.php @ 115257

Last change on this file since 115257 was 115257, checked in by maieul@…, 2 years ago

Les valeurs en POST sont envoyés par défaut dans les #ENV, et du coup se
retrouvent dans #GENERER_SAISIES.
Conséquence: lorsqu'on envoie le formulaire à nouveau après le post, les
champs sont préremplis. Ce qui ne correspond pas du tout au comportement
attendu "Le formulaire, à nouveau", et pas "le formulaire, à nouveau,
prérempli". Ceci pourrait expliquer du reste pourquoi des gens envoie
plusieurs fois le même formulaire.
On vide donc les _requests de saisies après l'application de l'ensemble
des traitements.

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