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('inc/mailsubscribers'); |
---|
12 | include_spip('mailsubscribers_fonctions'); |
---|
13 | |
---|
14 | /** |
---|
15 | * Renvoi les inscrits a une ou plusieurs listes |
---|
16 | * si plusieurs listes sont demandee, c'est un OU qui s'applique (renvoie les inscrits a au moins une des listes) |
---|
17 | * |
---|
18 | * @param array $listes |
---|
19 | * listes de diffusion. 'newsletter' si non precise |
---|
20 | * @param array $options |
---|
21 | * count : si true renvoyer le nombre de resultats au lieu de la liste (perf issue, permet de tronconner) |
---|
22 | * limit : ne recuperer qu'un sous ensemble des inscrits "10,20" pour recuperer 20 resultats a partir du 10e (idem SQL) |
---|
23 | * @return int|array |
---|
24 | * liste d'utilisateurs, chacun decrit par un array dans le meme format que newsletter/subscriber |
---|
25 | */ |
---|
26 | function newsletter_subscribers_dist($listes = array(),$options = array()){ |
---|
27 | static $count = null; |
---|
28 | |
---|
29 | $select = "email,nom,listes,lang,'on' AS status,jeton"; |
---|
30 | $where = array('statut='.sql_quote('valide')); |
---|
31 | $limit = ""; |
---|
32 | |
---|
33 | // si pas de liste precisee : liste newsletter par defaut (newsletter::newsletter) |
---|
34 | if (!$listes OR !is_array($listes)){ |
---|
35 | $listes = array(mailsubscribers_normaliser_nom_liste()); |
---|
36 | } |
---|
37 | |
---|
38 | // si simple comptage d'une seule liste, faisons plus rapidement pour eviter les regexp sur une grosse base |
---|
39 | // on en profite pour tout compter pour ne le faire qu'une fois |
---|
40 | if (isset($options['count']) AND $options['count'] AND count($listes)==1){ |
---|
41 | if (is_null($count) |
---|
42 | AND !_request('var_mode') |
---|
43 | AND isset($GLOBALS['meta']['newsletter_subscribers_count']) |
---|
44 | AND $c = unserialize($GLOBALS['meta']['newsletter_subscribers_count'])){ |
---|
45 | // si beaucoup d'inscrits on utilise le cache, |
---|
46 | // sinon on fait un calcul peu couteux pour eviter les bugs, notamment au demarrage |
---|
47 | if (array_sum($c)>10000){ |
---|
48 | $count = $c; |
---|
49 | } |
---|
50 | } |
---|
51 | if (is_null($count)){ |
---|
52 | $rows = sql_allfetsel("listes,count(id_mailsubscriber) as n","spip_mailsubscribers",$where,"listes"); |
---|
53 | foreach($rows as $row){ |
---|
54 | $ls = explode(",",$row["listes"]); |
---|
55 | $ls = array_filter($ls); |
---|
56 | $ls = array_unique($ls); |
---|
57 | foreach($ls as $l){ |
---|
58 | if (!isset($count[$l])) $count[$l] = 0; |
---|
59 | $count[$l] += $row['n']; |
---|
60 | } |
---|
61 | } |
---|
62 | // si beaucoup d'inscrits on met en cache |
---|
63 | if (array_sum($count)>10000){ |
---|
64 | ecrire_meta("newsletter_subscribers_count",serialize($count)); |
---|
65 | } |
---|
66 | } |
---|
67 | $liste = mailsubscribers_normaliser_nom_liste(reset($listes)); |
---|
68 | return (isset($count[$liste])?$count[$liste]:0); |
---|
69 | } |
---|
70 | |
---|
71 | $sous_where = array(); |
---|
72 | foreach ($listes as $l){ |
---|
73 | $l = mailsubscribers_normaliser_nom_liste($l); |
---|
74 | $sous_where[] = "listes REGEXP ".sql_quote('(,|^)'.$l.'(,|$)'); |
---|
75 | } |
---|
76 | if (count($sous_where)){ |
---|
77 | $sous_where = "(".implode(" OR ",$sous_where).")"; |
---|
78 | $where[] = $sous_where; |
---|
79 | } |
---|
80 | |
---|
81 | // si simple comptage de plusieurs listes, on arrive ici |
---|
82 | if (isset($options['count']) AND $options['count']) |
---|
83 | return sql_countsel("spip_mailsubscribers",$where); |
---|
84 | |
---|
85 | if (isset($options['limit']) AND $options['limit']) |
---|
86 | $limit = $options['limit']; |
---|
87 | |
---|
88 | // selection, par date |
---|
89 | // ca permet ainsi que les derniers inscrits (en cours de diffusion) se retrouvent dans le dernier lot |
---|
90 | // et premier inscrits, premiers servis |
---|
91 | $rows = sql_allfetsel($select,"spip_mailsubscribers",$where,"","date",$limit); |
---|
92 | $rows = array_map('mailsubscribers_informe_subscriber',$rows); |
---|
93 | |
---|
94 | return $rows; |
---|
95 | } |
---|