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

Last change on this file was 113294, checked in by spip.franck@…, 2 months ago

Il parait que le futur c'est maintenant :-D

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