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