b68cd92917d4e8abfd929f5d388f99fed5b28684
[lhc/web/www.git] / www / plugins / formidable / traiter / enregistrement.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) {
5 return;
6 }
7 include_spip('inc/formidable_fichiers');
8 function traiter_enregistrement_dist($args, $retours) {
9 include_spip('inc/formidable');
10 include_spip('base/abstract_sql');
11 $retours['fichiers'] = array(); // on va stocker des infos sur les fichiers, pour les prochains traitement
12 $options = $args['options'];
13 $formulaire = $args['formulaire'];
14 $id_formulaire = $args['id_formulaire'];
15 $saisies = unserialize($formulaire['saisies']);
16 $saisies = saisies_lister_par_nom($saisies);
17
18 // La personne a-t-elle un compte ?
19 $id_auteur = isset($GLOBALS['visiteur_session']) ? (isset($GLOBALS['visiteur_session']['id_auteur']) ?
20 $GLOBALS['visiteur_session']['id_auteur'] : 0) : 0;
21
22 // traitement de l'anonymisation
23 if ($options['anonymiser'] == 'on') {
24 // mod de l'id_auteur
25 $variables_anonymisation =
26 $GLOBALS['formulaires']['variables_anonymisation'][$options['anonymiser_variable']];
27 $id = eval("return $variables_anonymisation;");
28 $id_auteur = formidable_scramble($id, $id_formulaire);
29 }
30
31 // On cherche le cookie et sinon on le crée
32 $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
33 if (isset($_COOKIE[$nom_cookie])) {
34 $cookie = $_COOKIE[$nom_cookie];
35 } else {
36 include_spip('inc/acces');
37 $cookie = creer_uniqid();
38 }
39
40 // On regarde si c'est une modif d'une réponse existante
41 $id_formulaires_reponse = $args['id_formulaires_reponse'];
42
43 // recherche d'éventuelles anciennes réponses
44 $reponses = formidable_verifier_reponse_formulaire(
45 $id_formulaire,
46 $options['identification'],
47 ($options['anonymiser'] == 'on')
48 ? $options['anonymiser_variable']
49 : false
50 );
51
52 // pas d'id_formulaires_reponse : on cherche une éventuelle réponse en base
53 if ($id_formulaires_reponse == false) {
54 $traitements_formulaire = unserialize($formulaire['traitements']);
55
56 if (isset($traitements_formulaire['enregistrement'])) {
57 $options = $traitements_formulaire['enregistrement'];
58
59 if (isset($options['multiple']) && $options['multiple'] == ''
60 && isset($options['modifiable']) && $options['modifiable'] == 'on'
61 && is_array($reponses) && count($reponses) > 0) {
62 $id_formulaires_reponse = max($reponses);
63 }
64 }
65 } else {
66 // vérifier que l'auteur est bien l'auteur de la réponse, si non, on invalide l'id_formulaires_reponse
67 if (in_array($id_formulaires_reponse, $reponses) == false) {
68 $id_formulaires_reponse = false;
69 }
70 }
71
72 // Si la moderation est a posteriori ou que la personne est un boss, on publie direct
73 if ($options['moderation'] == 'posteriori'
74 or autoriser(
75 'instituer',
76 'formulairesreponse',
77 $id_formulaires_reponse,
78 null,
79 array('id_formulaire' => $id_formulaire, 'nouveau_statut' => 'publie')
80 )) {
81 $statut='publie';
82 } else {
83 $statut = 'prop';
84 }
85
86 // Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse
87 if (!$id_formulaires_reponse) {
88 $id_formulaires_reponse = sql_insertq(
89 'spip_formulaires_reponses',
90 array(
91 'id_formulaire' => $id_formulaire,
92 'id_auteur' => $id_auteur,
93 'cookie' => $cookie,
94 'ip' => $args['options']['ip'] == 'on' ? $GLOBALS['ip'] : '',
95 'date' => 'NOW()',
96 'statut' => $statut
97 )
98 );
99 // Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables,
100 // il faut poser un cookie
101 if (!$options['multiple'] or $options['modifiable']) {
102 include_spip('inc/cookie');
103 // Expiration dans 30 jours
104 spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600);
105 }
106 } else { // si c'est une modif de réponse existante
107 // simple mise à jour du champ maj de la table spip_formulaires_reponses
108 sql_updateq(
109 'spip_formulaires_reponses',
110 array('maj' => 'NOW()'),
111 "id_formulaires_reponse = $id_formulaires_reponse"
112 );
113 //effacer les fichiers existant
114 formidable_effacer_fichiers_reponse($id_formulaire, $id_formulaires_reponse);
115 }
116
117 // Si l'id n'a pas été créé correctement alors erreur
118 if (!($id_formulaires_reponse > 0)) {
119 $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base');
120 } else {
121 // Sinon on continue à mettre à jour
122 $champs = array();
123 $insertions = array();
124 foreach ($saisies as $nom => $saisie) {
125 if ($saisie['saisie'] == 'fichiers') { // traiter à part le cas des saisies fichiers
126 $valeur = traiter_enregistrement_fichiers($saisie, $id_formulaire, $id_formulaires_reponse);
127 if (($valeur !== null)) {
128 $champs[] = $nom;
129 $insertions[] = array(
130 'id_formulaires_reponse' => $id_formulaires_reponse,
131 'nom' => $nom,
132 'valeur' => is_array($valeur) ? serialize($valeur) : $valeur
133 );
134 $retours['fichiers'][$nom] = $valeur;
135 }
136 }
137 if (($valeur = _request($nom)) !== null) {
138 // Pour le saisies différentes de fichiers,
139 // on ne prend que les champs qui ont effectivement été envoyés par le formulaire
140 $champs[] = $nom;
141 $insertions[] = array(
142 'id_formulaires_reponse' => $id_formulaires_reponse,
143 'nom' => $nom,
144 'valeur' => is_array($valeur) ? serialize($valeur) : $valeur
145 );
146 }
147 }
148
149 // S'il y a bien des choses à modifier
150 if ($champs) {
151 // On supprime d'abord les champs
152 sql_delete(
153 'spip_formulaires_reponses_champs',
154 array(
155 'id_formulaires_reponse = '.$id_formulaires_reponse,
156 sql_in('nom', $champs)
157 )
158 );
159
160 // Puis on insère les nouvelles valeurs
161 sql_insertq_multi(
162 'spip_formulaires_reponses_champs',
163 $insertions
164 );
165 }
166 if (!isset($retours['message_ok'])) {
167 $retours['message_ok'] = '';
168 }
169 $retours['message_ok'] .= "\n"._T('formidable:traiter_enregistrement_message_ok');
170 $retours['id_formulaires_reponse'] = $id_formulaires_reponse;
171 }
172
173 // noter qu'on a deja fait le boulot, pour ne pas risquer double appel
174 $retours['traitements']['enregistrement'] = true;
175 return $retours;
176 }
177
178 function traiter_enregistrement_update_dist($id_formulaire, $traitement, $saisies_anciennes, $saisies_nouvelles) {
179 include_spip('inc/saisies');
180 include_spip('base/abstract_sql');
181 $comparaison = saisies_comparer($saisies_anciennes, $saisies_nouvelles);
182
183 // Si des champs ont été supprimés, il faut supprimer les réponses à ces champs
184 if ($comparaison['supprimees']) {
185 // On récupère les réponses du formulaire
186 $reponses = sql_allfetsel(
187 'id_formulaires_reponse',
188 'spip_formulaires_reponses',
189 'id_formulaire = '.$id_formulaire
190 );
191 $reponses = array_map('reset', $reponses);
192 // Tous les noms de champs à supprimer
193 $noms = array_keys($comparaison['supprimees']);
194
195 // On supprime
196 sql_delete(
197 'spip_formulaires_reponses_champs',
198 array(
199 sql_in('id_formulaires_reponse', $reponses),
200 sql_in('nom', $noms)
201 )
202 );
203 // On efface les vieux fichiers
204 foreach ($noms as $nom) {
205 if ($comparaison['supprimees'][$nom]['saisie'] == 'fichiers') {
206 formidable_effacer_fichiers_champ($id_formulaire, $reponses, $nom);
207 }
208 }
209 }
210 }
211
212 /**
213 * Pour une saisie 'fichiers' particulière,
214 * déplace chaque fichier envoyé dans le dossier
215 * config/fichiers/formidable/formulaire_$id_formulaire/reponse_$id_formulaires_reponse.
216 * @param array $saisie la description de la saisie
217 * @param int $id_formulaire le formulaire
218 * @param int $id_formulaires_reponse
219 * return array|null un tableau organisé par fichier, contenant 'nom', 'extension','mime','taille'
220 **/
221 function traiter_enregistrement_fichiers($saisie, $id_formulaire, $id_formulaires_reponse) {
222 return formidable_deplacer_fichiers_produire_vue_saisie($saisie, array('id_formulaire' => $id_formulaire, 'id_formulaires_reponse' => $id_formulaires_reponse));
223 }