1 | <?php |
---|
2 | /** |
---|
3 | * Plugin mailsubscribers |
---|
4 | * (c) 2012 Cédric Morin |
---|
5 | * Licence GNU/GPL v3 |
---|
6 | * |
---|
7 | */ |
---|
8 | |
---|
9 | if (!defined('_ECRIRE_INC_VERSION')) return; |
---|
10 | |
---|
11 | include_spip("action/editer_objet"); |
---|
12 | include_spip('inc/mailsubscribers'); |
---|
13 | include_spip('inc/config'); |
---|
14 | include_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 | */ |
---|
31 | function 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 | } |
---|