[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / plugins-dist / petitions / action / editer_signature.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14
15 // http://code.spip.net/@action_editer_signature_dist
16 function action_editer_signature_dist($arg=null) {
17
18 if (is_null($arg)){
19 $securiser_action = charger_fonction('securiser_action', 'inc');
20 $arg = $securiser_action();
21 }
22
23 // si id_signature n'est pas un nombre, c'est une creation
24 // mais on verifie qu'on a toutes les donnees qu'il faut.
25 if (!$id_signature = intval($arg)) {
26 $id_petition = _request('id_petition');
27 if (!($id_petition))
28 return array(0,'');
29 $id_signature = signature_inserer($id_petition);
30 }
31
32 // Enregistre l'envoi dans la BD
33 if ($id_signature > 0)
34 $err = signature_modifier($id_signature);
35
36 return array($id_signature,$err);
37 }
38
39 /**
40 * Mettre a jour une signature existante
41 *
42 * @param int $id_signature
43 * @param array $set
44 * @return string
45 */
46 function signature_modifier($id_signature, $set=null) {
47 $err = '';
48
49 include_spip('inc/modifier');
50 $c = collecter_requests(
51 // white list
52 array(
53 "nom_email","ad_email",
54 "nom_site","url_site","message","statut"
55 ),
56 // black list
57 array('statut','id_petition','date_time'),
58 // donnees eventuellement fournies
59 $set
60 );
61
62 if ($err = objet_modifier_champs('signature', $id_signature,
63 array(
64 'nonvide' => array('nom_email' => _T('info_sans_titre'))
65 ),
66 $c))
67 return $err;
68
69 // Modification de statut
70 $c = collecter_requests(array('statut','id_petition','date_time'),array(),$set);
71 $err .= signature_instituer($id_signature, $c);
72
73 return $err;
74 }
75
76 /**
77 * Inserer une signature en base
78 * @param int $id_petition
79 * @return int
80 */
81 function signature_inserer($id_petition) {
82
83 // Si $id_petition vaut 0 ou n'est pas definie, echouer
84 if (!$id_petition = intval($id_petition))
85 return 0;
86
87 $champs = array(
88 'id_petition' => $id_petition,
89 'statut' => 'prepa',
90 'date_time' => date('Y-m-d H:i:s'));
91
92 // Envoyer aux plugins
93 $champs = pipeline('pre_insertion',
94 array(
95 'args' => array(
96 'table' => 'spip_signatures',
97 ),
98 'data' => $champs
99 )
100 );
101
102 $id_signature = sql_insertq("spip_signatures", $champs);
103
104 pipeline('post_insertion',
105 array(
106 'args' => array(
107 'table' => 'spip_signatures',
108 'id_objet' => $id_signature
109 ),
110 'data' => $champs
111 )
112 );
113
114 return $id_signature;
115 }
116
117
118 // $c est un array ('statut', 'id_petition' = changement de petition)
119 // il n'est pas autoriser de deplacer une signature
120 // http://code.spip.net/@signature_instituer
121 function signature_instituer($id_signature, $c, $calcul_rub=true) {
122
123 include_spip('inc/autoriser');
124 include_spip('inc/modifier');
125
126 $row = sql_fetsel("S.statut, S.date_time, P.id_article", "spip_signatures AS S JOIN spip_petitions AS P ON S.id_petition=P.id_petition", "S.id_signature=".intval($id_signature));
127 $statut_ancien = $statut = $row['statut'];
128 $date_ancienne = $date = $row['date_time'];
129 $champs = array();
130
131 $d = isset($c['date_time'])?$c['date_time']:null;
132 $s = isset($c['statut'])?$c['statut']:$statut;
133
134 // cf autorisations dans inc/signature_instituer
135 if ($s != $statut OR ($d AND $d != $date)) {
136 $statut = $champs['statut'] = $s;
137
138 // En cas de publication, fixer la date a "maintenant"
139 // sauf si $c commande autre chose
140 // ou si l'signature est deja date dans le futur
141 // En cas de proposition d'un signature (mais pas depublication), idem
142 if ($champs['statut'] == 'publie') {
143 if ($d)
144 $champs['date_time'] = $date = $d;
145 else
146 $champs['date_time'] = $date = date('Y-m-d H:i:s');
147 }
148 // on peut redater une signature qu'on relance
149 elseif($d)
150 $champs['date_time'] = $date = $d;
151 }
152
153 // Envoyer aux plugins
154 $champs = pipeline('pre_edition',
155 array(
156 'args' => array(
157 'table' => 'spip_signatures',
158 'id_objet' => $id_signature,
159 'action'=>'instituer',
160 'statut_ancien' => $statut_ancien,
161 ),
162 'data' => $champs
163 )
164 );
165
166 if (!count($champs)) return;
167
168 // Envoyer les modifs.
169 sql_updateq('spip_signatures',$champs,'id_signature='.intval($id_signature));
170
171 // Invalider les caches
172 include_spip('inc/invalideur');
173 suivre_invalideur("id='signature/$id_signature'");
174 suivre_invalideur("id='article/".$row['id_article']."'");
175
176 // Pipeline
177 pipeline('post_edition',
178 array(
179 'args' => array(
180 'table' => 'spip_signatures',
181 'id_objet' => $id_signature,
182 'action'=>'instituer',
183 'statut_ancien' => $statut_ancien,
184 ),
185 'data' => $champs
186 )
187 );
188
189 // Notifications
190 if ($notifications = charger_fonction('notifications', 'inc')) {
191 $notifications('instituersignature', $id_signature,
192 array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
193 );
194 }
195
196 return ''; // pas d'erreur
197 }
198
199
200 /**
201 * Pour eviter le recours a un verrou (qui bloque l'acces a la base),
202 * on commence par inserer systematiquement la signature
203 * puis on demande toutes celles ayant la propriete devant etre unique
204 * (mail ou site). S'il y en a plus qu'une on les retire sauf la premiere
205 * En cas d'acces concurrents il y aura des requetes de retraits d'elements
206 * deja detruits. Bizarre ? C'est mieux que de bloquer!
207 *
208 * http://code.spip.net/@signature_entrop
209 *
210 * @param string $where
211 * @return array
212 */
213 function signature_entrop($where)
214 {
215 $entrop = array();
216 $where .= " AND statut='publie'";
217 $res = sql_select('id_signature', 'spip_signatures', $where,'',"date_time desc");
218 $n = sql_count($res);
219 if ($n>1) {
220 while($r=sql_fetch($res))
221 $entrop[]=$r['id_signature'];
222 // garder la premiere signature
223 array_shift($entrop);
224 }
225 sql_free($res);
226
227 if (count($entrop)){
228 sql_delete('spip_signatures', sql_in('id_signature', $entrop));
229 }
230
231 return $entrop;
232 }
233
234 // obsolete
235 function revision_signature($id_signature, $c=false) {
236 return signature_modifier($id_signature,$c);
237 }
238
239 ?>