source: spip-zone/_core_/plugins/petitions/action/editer_signature.php @ 48262

Last change on this file since 48262 was 48262, checked in by cedric@…, 10 years ago

#2091 : en cas de signatures doublon (email ou site), s'assurer que l'on en garde un (la requete de suppression reprenait le where initial, provoquant la suppression de toutes les signatures avec le meme email ou site)

File size: 6.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
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
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15// http://doc.spip.org/@action_editer_signature_dist
16function 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 */
46function 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        return modifier_contenu('signature', $id_signature,
63                array(
64                        'nonvide' => array('nom_email' => _T('info_sans_titre'))
65                ),
66                $c);
67
68        // Modification de statut
69        $c = collecter_requests(array('statut','id_petition','date_time'),array(),$set);
70        $err .= signature_instituer($id_signature, $c);
71
72        return $err;
73}
74
75/**
76 * Inserer une signature en base
77 * @param int $id_petition
78 * @return int
79 */
80function signature_inserer($id_petition) {
81
82        // Si $id_petition vaut 0 ou n'est pas definie, echouer
83        if (!$id_petition = intval($id_petition))
84                return 0;
85
86        $champs = array(
87                'id_petition' => $id_petition,
88                'statut' =>  'prepa',
89                'date_time' => date('Y-m-d H:i:s'));
90
91        // Envoyer aux plugins
92        $champs = pipeline('pre_insertion',
93                array(
94                        'args' => array(
95                                'table' => 'spip_signatures',
96                        ),
97                        'data' => $champs
98                )
99        );
100
101        $id_signature = sql_insertq("spip_signatures", $champs);
102
103        pipeline('post_insertion',
104                array(
105                        'args' => array(
106                                'table' => 'spip_signatures',
107                                'id_objet' => $id_signature
108                        ),
109                        'data' => $champs
110                )
111        );
112
113        return $id_signature;
114}
115
116
117// $c est un array ('statut', 'id_petition' = changement de petition)
118// il n'est pas autoriser de deplacer une signature
119// http://doc.spip.org/@signature_instituer
120function signature_instituer($id_signature, $c, $calcul_rub=true) {
121
122        include_spip('inc/autoriser');
123        include_spip('inc/modifier');
124
125        $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));
126        $statut_ancien = $statut = $row['statut'];
127        $date_ancienne = $date = $row['date_time'];
128        $champs = array();
129
130        $d = isset($c['date_time'])?$c['date_time']:null;
131        $s = isset($c['statut'])?$c['statut']:$statut;
132
133        // cf autorisations dans inc/signature_instituer
134        if ($s != $statut OR ($d AND $d != $date)) {
135                $statut = $champs['statut'] = $s;
136
137                // En cas de publication, fixer la date a "maintenant"
138                // sauf si $c commande autre chose
139                // ou si l'signature est deja date dans le futur
140                // En cas de proposition d'un signature (mais pas depublication), idem
141                if ($champs['statut'] == 'publie') {
142                        if ($d)
143                                $champs['date_time'] = $date = $d;
144                        else
145                                $champs['date_time'] = $date = date('Y-m-d H:i:s');
146                }
147        }
148
149        // Envoyer aux plugins
150        $champs = pipeline('pre_edition',
151                array(
152                        'args' => array(
153                                'table' => 'spip_signatures',
154                                'id_objet' => $id_signature,
155                                'action'=>'instituer',
156                                'statut_ancien' => $statut_ancien,
157                        ),
158                        'data' => $champs
159                )
160        );
161
162        if (!count($champs)) return;
163
164        // Envoyer les modifs.
165        sql_updateq('spip_signatures',$champs,'id_signature='.intval($id_signature));
166
167        // Invalider les caches
168        include_spip('inc/invalideur');
169        suivre_invalideur("id='signature/$id_signature'");
170        suivre_invalideur("id='article/".$row['id_article']."'");
171
172        // Pipeline
173        pipeline('post_edition',
174                array(
175                        'args' => array(
176                                'table' => 'spip_signatures',
177                                'id_objet' => $id_signature,
178                                'action'=>'instituer',
179                                'statut_ancien' => $statut_ancien,
180                        ),
181                        'data' => $champs
182                )
183        );
184
185        // Notifications
186        if ($notifications = charger_fonction('notifications', 'inc')) {
187                $notifications('instituersignature', $id_signature,
188                        array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
189                );
190        }
191
192        return ''; // pas d'erreur
193}
194
195
196/**
197 * Pour eviter le recours a un verrou (qui bloque l'acces a la base),
198 * on commence par inserer systematiquement la signature
199 * puis on demande toutes celles ayant la propriete devant etre unique
200 * (mail ou site). S'il y en a plus qu'une on les retire sauf la premiere
201 * En cas d'acces concurrents il y aura des requetes de retraits d'elements
202 * deja detruits. Bizarre ?  C'est mieux que de bloquer!
203 *
204 * http://doc.spip.org/@signature_entrop
205 *
206 * @param string $where
207 * @return array
208 */
209function signature_entrop($where)
210{
211        $entrop = array();
212        $where .= " AND statut='publie'";
213        $res = sql_select('id_signature', 'spip_signatures', $where,'',"date_time desc");
214        $n = sql_count($res);
215        if ($n>1) {
216                while($r=sql_fetch($res))
217                        $entrop[]=$r['id_signature'];
218                // garder la premiere signature
219                array_shift($entrop);
220        }
221        sql_free($res);
222
223        if (count($entrop)){
224                sql_delete('spip_signatures', sql_in('id_signature', $entrop));
225        }
226
227        return $entrop;
228}
229
230// obsolete
231function revision_signature($id_signature, $c=false) {
232        return signature_modifier($id_signature,$c);
233}
234
235?>
Note: See TracBrowser for help on using the repository browser.