source: spip-zone/_plugins_/mailsubscribers/trunk/mailsubscribers_pipelines.php

Last change on this file was 117637, checked in by cedric@…, 8 weeks ago

nettoyer les inscriptions incoherentes via un upgrade et le genie optimiser

File size: 13.3 KB
Line 
1<?php
2/**
3 * Plugin mailsubscribers
4 * (c) 2012 Cédric Morin
5 * Licence GNU/GPL v3
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12function mailsubscribers_taches_generales_cron($taches) {
13        // a peu pres tous les jours mais en se decalant un peu
14        $taches['mailsubscribers_synchro_lists'] = 23 * 3600;
15        if (isset($GLOBALS['meta']['mailsubscriptions_update_segments'])){
16                $taches['mailsubscribers_update_segments'] = 90;
17        }
18
19        return $taches;
20}
21
22/**
23 * Ajouter un jeton unique sur chaque inscrit (sert aux signatures d'action)
24 *
25 * @param $flux
26 * @return mixed
27 */
28function mailsubscribers_pre_insertion($flux) {
29        if ($flux['args']['table'] == 'spip_mailsubscribers'
30                AND !isset($flux['data']['jeton'])
31        ) {
32                include_spip("inc/acces");
33                $flux['data']['jeton'] = creer_uniqid();
34                include_spip("inc/mailsubscribers");
35                if (!isset($flux['data']['email'])) {
36                        include_spip("inc/acces");
37                        $flux['data']['email'] = creer_uniqid(); // eviter l'eventuel echec unicite sur email vide
38                }
39        }
40
41        return $flux;
42}
43
44/**
45 * Quand le statut de l'abonnement est change, tracer par qui (date, ip, #id si auteur loge, nom/email si en session)
46 * Permet d'opposer l'optin d'un internaute a son abonnement
47 * (et a contrario de tracer que l'abonnement n'a pas ete fait par lui si c'est le cas...)
48 *
49 * @param $flux
50 * @return mixed
51 */
52function mailsubscribers_pre_edition($flux) {
53        if ($flux['args']['table'] == 'spip_mailsubscribers'
54                AND $id_mailsubscriber = $flux['args']['id_objet']
55        ) {
56
57                if ($flux['args']['action'] == 'instituer'
58                        AND $statut_ancien = $flux['args']['statut_ancien']
59                        AND isset($flux['data']['statut'])
60                        AND $statut = $flux['data']['statut']
61                        AND $statut != $statut_ancien
62                ) {
63
64                        include_spip('inc/mailsubscribers');
65                        $email = sql_getfetsel('email', 'spip_mailsubscribers', "id_mailsubscriber=" . intval($id_mailsubscriber));
66                        // on ne peut jamais passer en prepa, c'est un statut reserve a la creation
67                        if ($statut == 'prepa' and !autoriser('superinstituer', 'mailsubscriber', $id_mailsubscriber)) {
68                                unset($flux['data']['statut']);
69                        }
70                        // on ne peut jamais passer en prop, c'est un statut intermediaire automatique
71                        if ($statut == 'prop' and !autoriser('superinstituer', 'mailsubscriber', $id_mailsubscriber)) {
72                                unset($flux['data']['statut']);
73                        }
74                        // on ne peut jamais passer en valide que si on etait en prop
75                        if ($statut == 'valide' and $statut_ancien !== 'prop' and !autoriser('superinstituer', 'mailsubscriber',
76                                        $id_mailsubscriber)
77                        ) {
78                                unset($flux['data']['statut']);
79                        } // un subscriber avec email obfusque ne peut que passer en poubelle ou refuse
80                        elseif (mailsubscribers_test_email_obfusque($email) and !in_array($statut, array('poubelle', 'refuse'))) {
81                                unset($flux['data']['statut']);
82                        }
83                }
84        }
85
86
87        // changement de mail d'un auteur : faire suivre son inscription si l'adresse email est unique dans les auteurs
88        if ($flux['args']['table'] == 'spip_auteurs'
89                AND $id_auteur = $flux['args']['id_objet']
90                AND isset($flux['data']['email'])
91                AND $flux['data']['email']
92        ) {
93
94                $old_email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
95                if ($old_email
96                        AND !sql_countsel('spip_auteurs',
97                                'email=' . sql_quote($old_email) . ' AND id_auteur<>' . intval($id_auteur) . ' AND statut<>' . sql_quote('5poubelle'))
98                ) {
99                        include_spip('action/editer_objet');
100                        include_spip('inc/mailsubscribers');
101                        if ($id_mailsubscriber = sql_getfetsel('id_mailsubscriber', 'spip_mailsubscribers',
102                                'email=' . sql_quote($old_email))
103                        ) {
104                                objet_modifier('mailsubscriber', $id_mailsubscriber, array('email' => $flux['data']['email']));
105                        }
106                        if ($id_mailsubscriber = sql_getfetsel('id_mailsubscriber', 'spip_mailsubscribers',
107                                'email=' . sql_quote(mailsubscribers_obfusquer_email($old_email)))
108                        ) {
109                                objet_modifier('mailsubscriber', $id_mailsubscriber,
110                                        array('email' => mailsubscribers_obfusquer_email($flux['data']['email'])));
111                        }
112                }
113        }
114
115        return $flux;
116}
117
118/**
119 * Quand le statut de l'abonnement est change, tracer par qui (date, ip, #id si auteur loge, nom/email si en session)
120 * Permet d'opposer l'optin d'un internaute a son abonnement
121 * (et a contrario de tracer que l'abonnement n'a pas ete fait par lui si c'est le cas...)
122 *
123 * @param $flux
124 * @return mixed
125 */
126function mailsubscribers_post_edition($flux) {
127        if (
128                isset($flux['args']['table'])
129                AND $flux['args']['table'] == 'spip_mailsubscribers'
130                AND $id_mailsubscriber = $flux['args']['id_objet']
131        ) {
132
133                if ($flux['args']['action'] == 'instituer'
134                        AND $statut_ancien = $flux['args']['statut_ancien']
135                        AND isset($flux['data']['statut'])
136                        AND $statut = $flux['data']['statut']
137                        AND $statut != $statut_ancien
138                ) {
139
140                        include_spip('inc/mailsubscribers');
141                        $email = sql_getfetsel('email', 'spip_mailsubscribers', "id_mailsubscriber=" . intval($id_mailsubscriber));
142                        if (!mailsubscribers_test_email_obfusque($email)) {
143
144                                if ($statut == 'valide') {
145                                        $subscriber = charger_fonction('subscriber', 'newsletter');
146                                        $infos = $subscriber($email);
147                                        $add = array();
148                                        foreach ($infos['subscriptions'] as $sub) {
149                                                if ($sub['status'] == 'pending') {
150                                                        $add[] = $sub['id'];
151                                                }
152                                        }
153                                        if ($add) {
154                                                $subscribe = charger_fonction('subscribe', 'newsletter');
155                                                $subscribe($email, array('listes' => $add, 'force' => true, 'notify' => false));
156                                        }
157                                }
158
159                                if (in_array($statut, array('refuse', 'poubelle'))) {
160                                        $unsubscribe = charger_fonction('unsubscribe', 'newsletter');
161                                        $unsubscribe($email, array('notify' => false));
162
163                                        $id_job = job_queue_add('mailsubscribers_obfusquer_mailsubscriber', "Obfusquer email #$id_mailsubscriber",
164                                                array($id_mailsubscriber), 'inc/mailsubscribers', false, time() + 300);
165                                        job_queue_link($id_job, array('objet' => 'mailsubscriber', 'id_objet' => $id_mailsubscriber));
166                                }
167                        }
168                }
169
170        }
171
172        return $flux;
173}
174
175
176/**
177 * Optimiser la base de donnee en supprimant :
178 * -> les inscriptions non confirmees
179 * -> les inscriptions et les listes a la poubelle
180 *
181 * @param array $flux
182 * @return array
183 */
184function mailsubscribers_optimiser_base_disparus($flux) {
185        $n = &$flux['data'];
186
187        $mydate = $flux['args']['date'];  // deja passe dans sql_quote !
188
189        # passer en poubelle les inscriptions en attente jamais confirmees (ce sont des bots)
190        sql_updateq("spip_mailsubscribers", array("statut" => "poubelle", 'date' => date('Y-m-d H:i:s')),
191                "statut=" . sql_quote('prepa') . " AND date < " . $mydate);
192
193        # supprimer les inscrits a la poubelle
194        sql_delete("spip_mailsubscribers", "statut=" . sql_quote('poubelle') . " AND date < " . $mydate);
195
196        # supprimer les listes a la poubelle
197        sql_delete("spip_mailsubscribinglists", "statut=" . sql_quote('poubelle') . " AND date < " . $mydate. " AND maj < " . $mydate);
198
199
200        # supprimer les inscriptions dont le subscriber n'existe plus
201        $res = sql_select("S.id_mailsubscriber AS id",
202                "spip_mailsubscriptions AS S
203                        LEFT JOIN spip_mailsubscribers AS M
204                          ON M.id_mailsubscriber=S.id_mailsubscriber",
205                "M.id_mailsubscriber IS NULL");
206        $n += optimiser_sansref('spip_mailsubscriptions', 'id_mailsubscriber', $res);
207
208        # supprimer les inscriptions dont la liste n'existe plus
209        $res = sql_select("S.id_mailsubscribinglist AS id",
210                "spip_mailsubscriptions AS S
211                        LEFT JOIN spip_mailsubscribinglists AS L
212                          ON L.id_mailsubscribinglist=S.id_mailsubscribinglist",
213                "L.id_mailsubscribinglist IS NULL");
214        $n += optimiser_sansref('spip_mailsubscriptions', 'id_mailsubscribinglist', $res);
215
216
217        # reliquat d'inscriptions incoherentes
218        // on utilise le critere su.statut=refuse qui est plus rapide que email like '%@example.org'
219        $old_sub = sql_allfetsel('su.id_mailsubscriber,su.email', 'spip_mailsubscribers AS su JOIN spip_mailsubscriptions as si on su.id_mailsubscriber=si.id_mailsubscriber','su.statut=' . sql_quote('refuse') . ' AND si.id_segment=0 AND si.statut=' . sql_quote('valide'), 'su.id_mailsubscriber','','0,50');
220        if ($old_sub) {
221                $unsubscribe = charger_fonction('unsubscribe', 'newsletter');
222                foreach ($old_sub as $sub) {
223                        // si mail obfusque, on desinscrit de tout
224                        if (mailsubscribers_test_email_obfusque($sub['email'])) {
225                                $unsubscribe($sub['email'], array('notify' => false));
226                        }
227                        // sinon on retablit le statut=valide sur le mailsubscriber
228                        else {
229                                sql_updateq('spip_mailsubscribers', array('statut' => 'valide'), 'id_mailsubscriber='.intval($sub['id_mailsubscriber']));
230                        }
231                }
232        }
233
234        return $flux;
235
236}
237
238/**
239 * Ajout de la coche d'optin sur le formulaire inscription
240 *
241 * @param array $flux
242 * @return array
243 */
244function mailsubscribers_formulaire_charger($flux) {
245        if (in_array($flux['args']['form'], array("inscription", "forum"))) {
246                // ici on ne lit pas la config pour aller plus vite (pas grave si on a ajoute le champ sans l'utiliser)
247                $flux['data']['mailsubscriber_optin'] = '';
248        }
249
250        return $flux;
251}
252
253/**
254 * Ajout de la coche d'optin sur le formulaire inscription et forum
255 *
256 * @param array $flux
257 * @return array
258 */
259function mailsubscribers_formulaire_fond($flux) {
260        if ($flux['args']['form'] == "inscription") {
261                include_spip('inc/config');
262                if (lire_config("mailsubscribers/proposer_signup_optin", 0)) {
263                        if (($p = strpos($flux['data'], "</ul>")) !== false) {
264                                $input = recuperer_fond("formulaires/inc-optin-subscribe", $flux['args']['contexte']);
265                                $flux['data'] = substr_replace($flux['data'], $input, $p, 0);
266                        }
267                }
268        }
269        if ($flux['args']['form'] == "forum") {
270                include_spip('inc/config');
271                if (lire_config("mailsubscribers/proposer_comment_optin", 0)) {
272                        $show = true;
273                        // si l'utilisateur est connu et deja abonne on propose pas la coche
274                        if ((isset($GLOBALS['visiteur_session']['email']) AND $email = $GLOBALS['visiteur_session']['email'])
275                                OR (isset($GLOBALS['visiteur_session']['session_email']) AND $email = $GLOBALS['visiteur_session']['session_email'])
276                        ) {
277                                $newsletter_subscriber = charger_fonction('subscriber', 'newsletter');
278                                $infos = $newsletter_subscriber($email);
279                                if ($infos AND $infos['status'] == "on") {
280                                        $show = false;
281                                }
282                        }
283
284                        if ($show AND ($p = strpos($flux['data'], "</ul>")) !== false) {
285                                $input = recuperer_fond("formulaires/inc-optin-subscribe", $flux['args']['contexte']);
286                                $flux['data'] = substr_replace($flux['data'], $input, $p, 0);
287                        }
288                }
289        }
290
291        return $flux;
292}
293
294/**
295 * Reinjecter mailsubscriber_optin dans la previsu forum si besoin
296 *
297 * @param $flux
298 * @return mixed
299 */
300function mailsubscribers_formulaire_verifier($flux) {
301        if ($flux['args']['form'] == "forum"
302                AND _request('mailsubscriber_optin')
303                AND isset($flux['data']['previsu'])
304        ) {
305
306                // reinjecter l'optin dans la previsu
307                if ($p = strpos($flux['data']['previsu'], "<input")) {
308                        $flux['data']['previsu'] = substr_replace($flux['data']['previsu'],
309                                "<input type='hidden' name='mailsubscriber_optin' value='oui' />", $p, 0);
310                }
311        }
312
313        return $flux;
314}
315
316/**
317 * Traitement de la coche d'optin sur le formulaire inscription et forum
318 *
319 * @param array $flux
320 * @return array
321 */
322function mailsubscribers_formulaire_traiter($flux) {
323        if ($flux['args']['form'] == "inscription"
324                AND _request('mailsubscriber_optin')
325                AND isset($flux['data']['id_auteur'])
326                AND $id_auteur = $flux['data']['id_auteur']
327        ) {
328                // si on a poste l'optin et auteur inscrit en base
329                // verifier quand meme que la config autorise cet optin, et que l'inscription s'est bien faite)
330                include_spip('inc/config');
331                if (lire_config("mailsubscribers/proposer_signup_optin", 0)) {
332                        $row = sql_fetsel('nom,email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
333                        if ($row) {
334                                // inscrire le nom et email
335                                $newsletter_subscribe = charger_fonction('subscribe', 'newsletter');
336                                $newsletter_subscribe($row['email'], array('nom' => $row['nom']));
337                        }
338                }
339        }
340        if ($flux['args']['form'] == "forum"
341                AND _request('mailsubscriber_optin')
342                AND (isset($GLOBALS['visiteur_session']['email']) OR isset($GLOBALS['visiteur_session']['session_email']))
343        ) {
344                // si on a poste l'optin et on a un email en session
345
346                // verifier quand meme que la config autorise cet optin, et que l'inscription s'est bien faite)
347                include_spip('inc/config');
348                if (lire_config("mailsubscribers/proposer_comment_optin", 0)) {
349                        $email = $nom = "";
350                        if (isset($GLOBALS['visiteur_session']['email'])) {
351                                $email = $GLOBALS['visiteur_session']['email'];
352                        } elseif (isset($GLOBALS['visiteur_session']['session_email'])) {
353                                $email = $GLOBALS['visiteur_session']['session_email'];
354                        }
355                        if (isset($GLOBALS['visiteur_session']['nom'])) {
356                                $nom = $GLOBALS['visiteur_session']['nom'];
357                        } elseif (isset($GLOBALS['visiteur_session']['session_nom'])) {
358                                $nom = $GLOBALS['visiteur_session']['session_nom'];
359                        }
360                        if ($email) {
361                                // inscrire le nom et email
362                                $newsletter_subscribe = charger_fonction('subscribe', 'newsletter');
363                                $newsletter_subscribe($email, array('nom' => $nom));
364                        }
365                }
366        }
367
368        return $flux;
369}
370
371/**
372 * Afficher les inscriptions d'un auteur (et pouvoir les modifier)
373 *
374 * @param $flux
375 * @return mixed
376 */
377function mailsubscribers_affiche_auteurs_interventions($flux) {
378        if ($id_auteur = $flux['args']['id_auteur']) {
379                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/auteur-subscription', array('id_auteur' => $id_auteur));
380        }
381
382        return $flux;
383}
384
385/**
386 * Proteger les formulaires subscriber/unsubscribe
387 *
388 * @param $formulaires
389 * @return array
390 */
391function mailsubscribers_nospam_lister_formulaires($formulaires) {
392        $formulaires[] = 'newsletter_subscribe';
393        $formulaires[] = 'newsletter_unsubscribe';
394
395        return $formulaires;
396}
Note: See TracBrowser for help on using the repository browser.