source: spip-zone/_plugins_/mailsubscribers/trunk/inc/mailsubscribinglists.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: 6.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
11
12function mailsubscribers_start_update_mailsubscribinglist_segment($id_mailsubscribinglist, $id_segment){
13        $update = array();
14        if (isset($GLOBALS['meta']['mailsubscriptions_update_segments'])) {
15          $update = unserialize($GLOBALS['meta']['mailsubscriptions_update_segments']);
16                if (!$update) $update = array();
17        }
18        if (!isset($update[$id_mailsubscribinglist])) $update[$id_mailsubscribinglist] = array();
19        $update[$id_mailsubscribinglist][] = $id_segment;
20        $update[$id_mailsubscribinglist] = array_unique($update[$id_mailsubscribinglist]);
21        $update[$id_mailsubscribinglist] = array_filter($update[$id_mailsubscribinglist]);
22        ecrire_meta('mailsubscriptions_update_segments', serialize($update));
23
24        // placer le pointeur sur les subscriptions pour le genie
25        // uniquement sur les subscribers qui ont au moins un des segments valide (sinon si tout refuse il n'y aura rien a faire)
26        $in_subscribers_valides = sql_get_select("DISTINCT zz.id_mailsubscriber", "spip_mailsubscriptions as zz", "zz.statut!=".sql_quote('refuse') . ' AND zz.id_mailsubscribinglist='.intval($id_mailsubscribinglist));
27        sql_updateq('spip_mailsubscriptions', array('actualise_segments' => 1), 'id_segment=0 AND id_mailsubscribinglist=' . intval($id_mailsubscribinglist) . " AND id_mailsubscriber IN ($in_subscribers_valides)");
28}
29
30/**
31 * Mettre a jour tous les segments de toutes les listes d'un subscriber
32 * @param $id_mailsubscriber
33 * @param bool $force
34 */
35function mailsubscribers_actualise_segments($id_mailsubscriber, $force = false){
36
37        $ids = sql_allfetsel('id_mailsubscribinglist','spip_mailsubscriptions','id_segment=0 AND id_mailsubscriber='.intval($id_mailsubscriber));
38        $ids = array_map('reset', $ids);
39        // supprimer les segments morts sur d'autres id_mailsubscribinglist
40        sql_delete('spip_mailsubscriptions', 'id_mailsubscriber='.intval($id_mailsubscriber).' AND id_segment>0 AND '.sql_in('id_mailsubscribinglist',$ids,'NOT'));
41        foreach ($ids as $id_mailsubscribinglist){
42                mailsubscribers_actualise_mailsubscribinglist_segments($id_mailsubscriber, $id_mailsubscribinglist, $force);
43        }
44       
45}
46
47/**
48 * Mettre a jour tous les segment d'une liste d'un subscriber
49 * @param $id_mailsubscriber
50 * @param $id_mailsubscribinglist
51 * @param bool $force
52 */
53function mailsubscribers_actualise_mailsubscribinglist_segments($id_mailsubscriber, $id_mailsubscribinglist, $force = false){
54        static $segments = array();
55        static $update_segments;
56        if (!isset($segments[$id_mailsubscribinglist])) {
57                if ($segments[$id_mailsubscribinglist] = sql_getfetsel('segments','spip_mailsubscribinglists','id_mailsubscribinglist='.intval($id_mailsubscribinglist))){
58                        $segments[$id_mailsubscribinglist] = unserialize($segments[$id_mailsubscribinglist]);
59                }
60        }
61        if (is_null($update_segments)) {
62                if (isset($GLOBALS['meta']['mailsubscriptions_update_segments'])) {
63                        $update_segments = unserialize($GLOBALS['meta']['mailsubscriptions_update_segments']);
64                        if (!$update_segments){
65                                $update_segments = array();
66                        }
67                }
68        }
69
70        if ($segments[$id_mailsubscribinglist]){
71                $update_needed = array();
72                if (isset($update_segments[$id_mailsubscribinglist])) {
73                        $update_needed = &$update_segments[$id_mailsubscribinglist];
74                }
75                foreach ($segments[$id_mailsubscribinglist] as $id_segment=>$segment){
76                        if ($force
77                                or in_array($id_segment, $update_needed)
78                          or (isset($segment['auto_update']) and $segment['auto_update'])){
79                                mailsubscribers_actualise_segment($id_mailsubscriber, $id_mailsubscribinglist, $id_segment, $segments[$id_mailsubscribinglist]);
80                        }
81                }
82        }
83
84}
85
86/**
87 * Mettre a jour un segment d'une liste d'un subscriber
88 * @param $id_mailsubscriber
89 * @param $id_mailsubscribinglist
90 * @param $id_segment
91 * @param array $segments
92 */
93function mailsubscribers_actualise_segment($id_mailsubscriber, $id_mailsubscribinglist, $id_segment, $segments = null){
94        if (is_null($segments)) {
95                if ($segments = sql_getfetsel('segments','spip_mailsubscribinglists','id_mailsubscribinglist='.intval($id_mailsubscribinglist))){
96                        $segments = unserialize($segments);
97                }
98        }
99
100        if ($segments and isset($segments[$id_segment])){
101                $need = mailsubscribers_teste_segment($id_mailsubscriber,$segments[$id_segment]);
102                $where = 'id_mailsubscriber='.intval($id_mailsubscriber).' AND id_mailsubscribinglist='.intval($id_mailsubscribinglist).' AND id_segment=';
103                $is = sql_countsel('spip_mailsubscriptions', $where . intval($id_segment));
104                if ($is and !$need) {
105                        sql_delete('spip_mailsubscriptions', $where . intval($id_segment));
106                }
107                if ($need and !$is) {
108                        if ($sub = sql_fetsel('*','spip_mailsubscriptions', $where . intval(0))){
109                                $sub['id_segment'] = $id_segment;
110                                sql_insertq('spip_mailsubscriptions', $sub);
111                        }
112                }
113        }
114}
115
116/**
117 * Tester l'appartenance d'un subscriber a un segment
118 * @param $id_mailsubscriber
119 * @param $segment
120 * @return bool
121 */
122function mailsubscribers_teste_segment($id_mailsubscriber, $segment){
123        static $informations_liees = array();
124        static $declaration;
125        if (is_null($declaration)){
126                if (!function_exists('mailsubscriber_declarer_informations_liees')) {
127                        include_spip('inc/mailsubscribers');
128                }
129                $declaration = mailsubscriber_declarer_informations_liees();
130        }
131       
132        if (!$declaration) return false;
133
134        if (!isset($informations_liees[$id_mailsubscriber])) {
135                $email = sql_getfetsel('email','spip_mailsubscribers','id_mailsubscriber='.intval($id_mailsubscriber));
136                $informations_liees[$id_mailsubscriber] = mailsubscriber_recuperer_informations_liees($id_mailsubscriber, $email);
137        }
138        $infos = &$informations_liees[$id_mailsubscriber];
139
140        foreach($segment as $k=>$v){
141                if (strncmp($k,'filtre_',7)==0 and strlen($v)){
142                        $filtre_k = substr($k,7);
143                        if (!isset($infos[$filtre_k])){
144                                return false;
145                        }
146                        // si le filtre contient plusieurs valeurs, il suffit qu'on en ait une pour etre dans le segment (c'est un OU)
147                        if (strpos($v,',') !== false){
148                                $v = explode(',', $v);
149                                if (is_array($infos[$filtre_k])){
150                                        if (!array_intersect($v,$infos[$filtre_k])){
151                                                return false;
152                                        }
153                                }
154                                else {
155                                        if (!in_array($infos[$filtre_k],$v)){
156                                                return false;
157                                        }
158                                }
159                        }
160                        // si le filtre contient 1 valeur, il faut qu'elle soit dans les infos du subscriber
161                        else {
162                                if (is_array($infos[$filtre_k])){
163                                        if (!in_array($v,$infos[$filtre_k])){
164                                                return false;
165                                        }
166                                }
167                                else {
168                                        if ($infos[$filtre_k]!=$v){
169                                                return false;
170                                        }
171                                }
172                        }
173                }
174        }
175
176        return true;
177
178}
Note: See TracBrowser for help on using the repository browser.