source: spip-zone/_plugins_/mailsubscribers/trunk/newsletter/unsubscribe.php @ 100418

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

bugfix synchro des listes : quand on retire un abonnement par synchro, on l'enleve de la base plutot que de le garder en refuse, car ce n'est pas un desabonnement
sinon il n'est plus reabonne lorsqu'il reapparait dans la synchro du fait de l'option graceful

File size: 5.4 KB
Line 
1<?php
2/**
3 * Plugin mailsubscribers
4 * (c) 2012 Cédric Morin
5 * Licence GNU/GPL v3
6 *
7 */
8
9if (!defined('_ECRIRE_INC_VERSION')) return;
10
11include_spip("action/editer_objet");
12include_spip('inc/mailsubscribers');
13include_spip('inc/config');
14include_spip('inc/autoriser');
15
16/**
17 * Desinscrire un subscriber par son email
18 * si une ou plusieurs listes precisees, le subscriber est desinscrit de ces seules listes
19 * si il n'en reste aucune, le statut du subscriber est suspendu
20 *
21 * si aucune liste precisee, le subscriber est desinscrit de toutes les listes
22 *
23 * @param $email
24 *   champ obligatoire
25 * @param array $options
26 *   listes : array
27 *   notify : bool
28 * @return bool
29 *   true si inscrit, false sinon
30 */
31function newsletter_unsubscribe_dist($email, $options = array()) {
32        static $dejala = false;
33        if ($dejala) {return false;}
34
35        // chercher si un tel email est deja en base
36        $row = sql_fetsel('*', 'spip_mailsubscribers', 'email=' . sql_quote($email));
37        if ($row) {
38
39                $set = array();
40                $trace_optin = '';
41                $notify = array();
42
43                $where = array();
44                $where[] = 'id_mailsubscriber=' . intval($row['id_mailsubscriber']);
45
46                if (isset($options['listes'])
47                        AND is_array($options['listes'])
48                ) {
49                        $listes = array_map('mailsubscribers_normaliser_nom_liste', $options['listes']);
50                        $ids = sql_allfetsel('id_mailsubscribinglist', 'spip_mailsubscribinglists', sql_in('identifiant', $listes));
51                        $ids = array_map('reset', $ids);
52                        $where[] = sql_in('id_mailsubscribinglist', $ids);
53                }
54
55                // les inscriptions pas deja en refusees pour la trace
56                $pas_encore = sql_allfetsel('id_mailsubscribinglist,statut', 'spip_mailsubscriptions', 'statut!=' . sql_quote('refuse') . ' AND id_segment=0 AND ' . implode(' AND ', $where));
57
58                // on met a jour les inscriptions pour les listes demandees (ou pour toutes les listes en cours)
59                // l'option remove est utilisee pour la synchro des listes : un abonnement retire lors de la synchro n'est pas conserve en refuse (car ce n'est pas une desinscription)
60                if (isset($options['remove']) and $options['remove']){
61                        sql_delete('spip_mailsubscriptions', $where);
62                }
63                else {
64                        sql_updateq('spip_mailsubscriptions', array('statut' => 'refuse'), $where);
65                }
66                $GLOBALS['mailsubscribers_recompte_inscrits'] = true;
67
68                if ($pas_encore) {
69                        $changes = sql_allfetsel('id_mailsubscribinglist', 'spip_mailsubscriptions', 'statut=' . sql_quote('refuse') . ' AND id_segment=0 AND ' . implode(' AND ', $where));
70                        $changes = array_map('reset', $changes);
71                        $changes_identifiants = array();
72                        foreach ($pas_encore as $sub_prev){
73                                if (in_array($sub_prev['id_mailsubscribinglist'], $changes)){
74                                        $identifiant = sql_getfetsel('identifiant', 'spip_mailsubscribinglists', 'id_mailsubscribinglist='.intval($sub_prev['id_mailsubscribinglist']));
75                                        $changes_identifiants[] = $identifiant;
76                                        $notify[] = array(
77                                                'identifiant' => $identifiant,
78                                                'id_mailsubscribinglist' => $sub_prev['id_mailsubscribinglist'],
79                                                'statut' => 'refuse',
80                                                'statut_ancien' => $sub_prev['statut'],
81                                        );
82                                }
83                        }
84                        if ($changes_identifiants) {
85                                $trace_optin .= '[' . implode(',', $changes_identifiants) . ':' . _T('mailsubscriber:info_statut_refuse') . '] ';
86                        }
87                }
88
89                // on regarde les inscriptions en cours : si aucune prop ou valide, l'abonne passe en refuse, mail obfusque
90                $encore = sql_countsel('spip_mailsubscriptions', 'id_mailsubscriber=' . intval($row['id_mailsubscriber']) . ' AND ' . sql_in('statut', array('prop', 'valide')));
91                if (!$encore) {
92                        if (!in_array($row['statut'], array('refuse', 'poubelle'))) {
93                                $set['statut'] = "refuse";
94                        }
95                        // pris en charge par pipeline + cron
96                        //$set['email'] = mailsubscribers_obfusquer_email($email);
97                }
98                if ($trace_optin) {
99                        $set['optin'] = mailsubscribers_trace_optin($trace_optin,
100                                sql_getfetsel('optin', 'spip_mailsubscribers', 'id_mailsubscriber=' . intval($row['id_mailsubscriber'])));
101                }
102
103                if (count($set)) {
104                        $dejala = true; // ne pas accepter la reentrance de validation des inscriptions quand on valide l'inscrit
105                        autoriser_exception("modifier", "mailsubscriber", $row['id_mailsubscriber']);
106                        autoriser_exception("instituer", "mailsubscriber", $row['id_mailsubscriber']);
107                        autoriser_exception("superinstituer", "mailsubscriber", $row['id_mailsubscriber']);
108                        // d'abord le statut pour notifier avec le bon mail, sauf si notify=false en option
109                        if (isset($set['statut'])
110                                AND (!isset($options['notify']) OR $options['notify'])
111                        ) {
112                                objet_modifier("mailsubscriber", $row['id_mailsubscriber'], array('statut' => $set['statut']));
113                                unset($set['statut']);
114                        }
115                        // ensuite l'email ou autre si besoin
116                        if (count($set)) {
117                                objet_modifier("mailsubscriber", $row['id_mailsubscriber'], $set);
118                        }
119                        autoriser_exception("modifier", "mailsubscriber", $row['id_mailsubscriber'], false);
120                        autoriser_exception("instituer", "mailsubscriber", $row['id_mailsubscriber'], false);
121                        autoriser_exception("superinstituer", "mailsubscriber", $row['id_mailsubscriber'], false);
122                        $dejala = false;
123
124                        // actualiser les segments en auto_update
125                        include_spip('inc/mailsubscribinglists');
126                        mailsubscribers_actualise_segments($row['id_mailsubscriber']);
127                }
128
129                if ($notify and (!isset($options['notify']) or $options['notify'])){
130                        $notifications = charger_fonction('notifications','inc');
131                        foreach ($notify as $option){
132                                $notifications('instituermailsubscription',$row['id_mailsubscriber'],$option);
133                        }
134                }
135
136        }
137
138        return true;
139}
Note: See TracBrowser for help on using the repository browser.