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