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

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

ne pointer en mise a jour des segments que les subscribers qui ont au moins un segment valide sur cette liste de diffusion

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                        // on unsubscribe bien tous les segments
65                        sql_updateq('spip_mailsubscriptions', array('statut' => 'refuse'), $where);
66                }
67                $GLOBALS['mailsubscribers_recompte_inscrits'] = true;
68
69                if ($pas_encore) {
70                        $changes = sql_allfetsel('id_mailsubscribinglist', 'spip_mailsubscriptions', 'statut=' . sql_quote('refuse') . ' AND id_segment=0 AND ' . implode(' AND ', $where));
71                        $changes = array_map('reset', $changes);
72                        $changes_identifiants = array();
73                        foreach ($pas_encore as $sub_prev){
74                                if (in_array($sub_prev['id_mailsubscribinglist'], $changes)){
75                                        $identifiant = sql_getfetsel('identifiant', 'spip_mailsubscribinglists', 'id_mailsubscribinglist='.intval($sub_prev['id_mailsubscribinglist']));
76                                        $changes_identifiants[] = $identifiant;
77                                        $notify[] = array(
78                                                'identifiant' => $identifiant,
79                                                'id_mailsubscribinglist' => $sub_prev['id_mailsubscribinglist'],
80                                                'statut' => 'refuse',
81                                                'statut_ancien' => $sub_prev['statut'],
82                                        );
83                                }
84                        }
85                        if ($changes_identifiants) {
86                                $trace_optin .= '[' . implode(',', $changes_identifiants) . ':' . _T('mailsubscriber:info_statut_refuse') . '] ';
87                        }
88                }
89
90                // on regarde les inscriptions en cours : si aucune prop ou valide, l'abonne passe en refuse, mail obfusque
91                $encore = sql_countsel('spip_mailsubscriptions', 'id_mailsubscriber=' . intval($row['id_mailsubscriber']) . ' AND ' . sql_in('statut', array('prop', 'valide')));
92                if (!$encore) {
93                        if (!in_array($row['statut'], array('refuse', 'poubelle'))) {
94                                $set['statut'] = "refuse";
95                        }
96                        // pris en charge par pipeline + cron
97                        //$set['email'] = mailsubscribers_obfusquer_email($email);
98                }
99                if ($trace_optin) {
100                        $set['optin'] = mailsubscribers_trace_optin($trace_optin,
101                                sql_getfetsel('optin', 'spip_mailsubscribers', 'id_mailsubscriber=' . intval($row['id_mailsubscriber'])));
102                }
103
104                if (count($set)) {
105                        $dejala = true; // ne pas accepter la reentrance de validation des inscriptions quand on valide l'inscrit
106                        autoriser_exception("modifier", "mailsubscriber", $row['id_mailsubscriber']);
107                        autoriser_exception("instituer", "mailsubscriber", $row['id_mailsubscriber']);
108                        autoriser_exception("superinstituer", "mailsubscriber", $row['id_mailsubscriber']);
109                        // d'abord le statut pour notifier avec le bon mail, sauf si notify=false en option
110                        if (isset($set['statut'])
111                                AND (!isset($options['notify']) OR $options['notify'])
112                        ) {
113                                objet_modifier("mailsubscriber", $row['id_mailsubscriber'], array('statut' => $set['statut']));
114                                unset($set['statut']);
115                        }
116                        // ensuite l'email ou autre si besoin
117                        if (count($set)) {
118                                objet_modifier("mailsubscriber", $row['id_mailsubscriber'], $set);
119                        }
120                        autoriser_exception("modifier", "mailsubscriber", $row['id_mailsubscriber'], false);
121                        autoriser_exception("instituer", "mailsubscriber", $row['id_mailsubscriber'], false);
122                        autoriser_exception("superinstituer", "mailsubscriber", $row['id_mailsubscriber'], false);
123                        $dejala = false;
124
125                        // actualiser les segments en auto_update
126                        include_spip('inc/mailsubscribinglists');
127                        mailsubscribers_actualise_segments($row['id_mailsubscriber']);
128                }
129
130                if ($notify and (!isset($options['notify']) or $options['notify'])){
131                        $notifications = charger_fonction('notifications','inc');
132                        foreach ($notify as $option){
133                                $notifications('instituermailsubscription',$row['id_mailsubscriber'],$option);
134                        }
135                }
136
137        }
138
139        return true;
140}
Note: See TracBrowser for help on using the repository browser.