source: spip-zone/_plugins_/mailsubscribers/trunk/inc/mailsubscribinglists.php @ 112727

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

Correction de r112420 qui ne marchait pas le update avec clause sub select etant refuse dans ce cas

File size: 7.1 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        // on est oblige de faire des series de allfetsel/update car on ne peut pas faire un update avec ne sous requete comme celle la
27        $n = 0;
28        while ($in_subscribers_valides = sql_allfetsel(
29                "DISTINCT id_mailsubscriber",
30                "spip_mailsubscriptions",
31                "statut!=" . sql_quote('refuse') . ' AND actualise_segments=0 AND id_segment=0 AND id_mailsubscribinglist=' . intval($id_mailsubscribinglist), '', '', '0,10000')){
32                $in_subscribers_valides = array_column($in_subscribers_valides, 'id_mailsubscriber');
33                sql_updateq('spip_mailsubscriptions', array('actualise_segments' => 1), 'id_segment=0 AND id_mailsubscribinglist=' . intval($id_mailsubscribinglist) . " AND " . sql_in('id_mailsubscriber', $in_subscribers_valides));
34                spip_log("actualise_segments=1 sur liste $id_mailsubscribinglist et " . count($in_subscribers_valides) . ' inscrits', 'mailsubscribers');
35                $n += count($in_subscribers_valides);
36        }
37        spip_log("actualise_segments=1 sur liste $id_mailsubscribinglist et TOTAL $n inscrits", 'mailsubscribers');
38}
39
40/**
41 * Mettre a jour tous les segments de toutes les listes d'un subscriber
42 * @param $id_mailsubscriber
43 * @param bool|array $force
44 *   true ou liste de $id_mailsubscribinglist sur lesquels on veut forcer la mise a jour
45 */
46function mailsubscribers_actualise_segments($id_mailsubscriber, $force = false){
47
48        $ids = sql_allfetsel('id_mailsubscribinglist','spip_mailsubscriptions','id_segment=0 AND id_mailsubscriber='.intval($id_mailsubscriber));
49        $ids = array_map('reset', $ids);
50        // supprimer les segments morts sur d'autres id_mailsubscribinglist
51        sql_delete('spip_mailsubscriptions', 'id_mailsubscriber='.intval($id_mailsubscriber).' AND id_segment>0 AND '.sql_in('id_mailsubscribinglist',$ids,'NOT'));
52        foreach ($ids as $id_mailsubscribinglist){
53                $force_this = (is_array($force) ? in_array($id_mailsubscribinglist, $force) : $force);
54                mailsubscribers_actualise_mailsubscribinglist_segments($id_mailsubscriber, $id_mailsubscribinglist, $force_this);
55        }
56       
57}
58
59/**
60 * Mettre a jour tous les segment d'une liste d'un subscriber
61 * @param $id_mailsubscriber
62 * @param $id_mailsubscribinglist
63 * @param bool $force
64 */
65function mailsubscribers_actualise_mailsubscribinglist_segments($id_mailsubscriber, $id_mailsubscribinglist, $force = false){
66        static $segments = array();
67        static $update_segments;
68        if (!isset($segments[$id_mailsubscribinglist])) {
69                if ($segments[$id_mailsubscribinglist] = sql_getfetsel('segments','spip_mailsubscribinglists','id_mailsubscribinglist='.intval($id_mailsubscribinglist))){
70                        $segments[$id_mailsubscribinglist] = unserialize($segments[$id_mailsubscribinglist]);
71                }
72        }
73        if (is_null($update_segments)) {
74                if (isset($GLOBALS['meta']['mailsubscriptions_update_segments'])) {
75                        $update_segments = unserialize($GLOBALS['meta']['mailsubscriptions_update_segments']);
76                        if (!$update_segments){
77                                $update_segments = array();
78                        }
79                }
80        }
81
82        if ($segments[$id_mailsubscribinglist]){
83                $update_needed = array();
84                if (isset($update_segments[$id_mailsubscribinglist])) {
85                        $update_needed = &$update_segments[$id_mailsubscribinglist];
86                }
87                foreach ($segments[$id_mailsubscribinglist] as $id_segment=>$segment){
88                        if ($force
89                                or in_array($id_segment, $update_needed)
90                          or (isset($segment['auto_update']) and $segment['auto_update'])){
91                                mailsubscribers_actualise_segment($id_mailsubscriber, $id_mailsubscribinglist, $id_segment, $segments[$id_mailsubscribinglist]);
92                        }
93                }
94        }
95
96}
97
98/**
99 * Mettre a jour un segment d'une liste d'un subscriber
100 * @param $id_mailsubscriber
101 * @param $id_mailsubscribinglist
102 * @param $id_segment
103 * @param array $segments
104 */
105function mailsubscribers_actualise_segment($id_mailsubscriber, $id_mailsubscribinglist, $id_segment, $segments = null){
106        if (is_null($segments)) {
107                if ($segments = sql_getfetsel('segments','spip_mailsubscribinglists','id_mailsubscribinglist='.intval($id_mailsubscribinglist))){
108                        $segments = unserialize($segments);
109                }
110        }
111
112        if ($segments and isset($segments[$id_segment])){
113                $need = mailsubscribers_teste_segment($id_mailsubscriber,$segments[$id_segment]);
114                $where = 'id_mailsubscriber='.intval($id_mailsubscriber).' AND id_mailsubscribinglist='.intval($id_mailsubscribinglist).' AND id_segment=';
115                $is = sql_countsel('spip_mailsubscriptions', $where . intval($id_segment));
116                if ($is and !$need) {
117                        sql_delete('spip_mailsubscriptions', $where . intval($id_segment));
118                }
119                if ($need and !$is) {
120                        if ($sub = sql_fetsel('*','spip_mailsubscriptions', $where . intval(0))){
121                                $sub['id_segment'] = $id_segment;
122                                sql_insertq('spip_mailsubscriptions', $sub);
123                        }
124                }
125        }
126}
127
128/**
129 * Tester l'appartenance d'un subscriber a un segment
130 * @param $id_mailsubscriber
131 * @param $segment
132 * @return bool
133 */
134function mailsubscribers_teste_segment($id_mailsubscriber, $segment){
135        static $informations_liees = array();
136        static $declaration;
137        if (is_null($declaration)){
138                if (!function_exists('mailsubscriber_declarer_informations_liees')) {
139                        include_spip('inc/mailsubscribers');
140                }
141                $declaration = mailsubscriber_declarer_informations_liees();
142        }
143       
144        if (!$declaration) return false;
145
146        if (!isset($informations_liees[$id_mailsubscriber])) {
147                $email = sql_getfetsel('email','spip_mailsubscribers','id_mailsubscriber='.intval($id_mailsubscriber));
148                $informations_liees[$id_mailsubscriber] = mailsubscriber_recuperer_informations_liees($id_mailsubscriber, $email);
149        }
150        $infos = &$informations_liees[$id_mailsubscriber];
151
152        foreach($segment as $k=>$v){
153                if (strncmp($k,'filtre_',7)==0 and strlen($v)){
154                        $filtre_k = substr($k,7);
155                        if (!isset($infos[$filtre_k])){
156                                return false;
157                        }
158                        // si le filtre contient plusieurs valeurs, il suffit qu'on en ait une pour etre dans le segment (c'est un OU)
159                        if (strpos($v,',') !== false){
160                                $v = explode(',', $v);
161                                if (is_array($infos[$filtre_k])){
162                                        if (!array_intersect($v,$infos[$filtre_k])){
163                                                return false;
164                                        }
165                                }
166                                else {
167                                        if (!in_array($infos[$filtre_k],$v)){
168                                                return false;
169                                        }
170                                }
171                        }
172                        // si le filtre contient 1 valeur, il faut qu'elle soit dans les infos du subscriber
173                        else {
174                                if (is_array($infos[$filtre_k])){
175                                        if (!in_array($v,$infos[$filtre_k])){
176                                                return false;
177                                        }
178                                }
179                                else {
180                                        if ($infos[$filtre_k]!=$v){
181                                                return false;
182                                        }
183                                }
184                        }
185                }
186        }
187
188        return true;
189
190}
Note: See TracBrowser for help on using the repository browser.