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

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

optimisations rapidite : eviter de recalculer N fois les informations liees d'un subscriber si on actualise les N segments d'une meme liste

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