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

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

coquille de regexp

File size: 6.3 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/**
12 * Normaliser le nom d'une liste de diffusion
13 *
14 * @param string $liste
15 * @param string $category
16 * @return string
17 */
18function mailsubscribers_normaliser_nom_liste($liste='', $category="newsletter"){
19        $category = strtolower(trim(preg_replace(",\W,","",$category)));
20
21        if (!$liste)
22                return "$category::$category"; // valeur fixe en cas de reantrance
23
24        if (strpos($liste,"::")!==false){
25                $liste = explode("::",$liste);
26                return mailsubscribers_normaliser_nom_liste($liste[1],$liste[0]);
27        }
28        include_spip("inc/charsets");
29        $liste = translitteration($liste);
30        $liste = strtolower($liste);
31
32        $liste = trim(preg_replace(",[^\w-],","",$liste));
33        $liste = "$category::$liste";
34        return $liste;
35}
36
37function mailsubscribers_obfusquer_email($email){
38        return md5($email)."@example.org";
39}
40
41function mailsubscribers_test_email_obfusque($email){
42        return preg_match(",^[a-f0-9]+@example\.org$,",$email);
43}
44
45/**
46 * Informer un subscriber : ici juste l'url unsubscribe a calculer
47 * @param array $infos
48 * @return array mixed
49 */
50function mailsubscribers_informe_subscriber($infos){
51        $infos['listes'] = explode(',',$infos['listes']);
52        $infos['listes'] = array_map('mailsubscribers_filtre_liste',$infos['listes']);
53        $infos['listes'] = array_filter($infos['listes']);
54
55        $infos['url_unsubscribe'] = mailsubscriber_url_unsubscribe($infos['email'],$infos['jeton']);
56        unset($infos['jeton']);
57        return $infos;
58}
59
60/**
61 * Filtrer une liste a partir de sa category
62 * @param $liste
63 * @param string $category
64 * @return string
65 *   chaine vide si la liste n'est pas dans la category
66 *   nom de la liste sans le prefix de la category si ok
67 */
68function mailsubscribers_filtre_liste($liste,$category="newsletter"){
69        if (strncmp($liste,"$category::",$l=strlen("$category::"))==0){
70                return substr($liste,$l);
71        }
72        return '';
73}
74
75/**
76 * Renvoi les listes de diffusion disponibles avec leur status
77 * (open,close,?)
78 *
79 * @param array $options
80 *   category : filtrer les listes par category (dans ce cas la categorie est enlevee de l'id)
81 *   status : filtrer les listes sur le status
82 * @return array
83 *   listes
84 */
85function mailsubscribers_listes($options = array()){
86        $filtrer_status = $filtrer_category = false;
87        if (isset($options['status']))
88                $filtrer_status = $options['status'];
89        if (isset($options['category']))
90                $filtrer_category = $options['category'];
91
92        $listes = array();
93
94        // d'abord les listes connues en config
95        if (!function_exists('lire_config'))
96                include_spip('inc/config');
97        if ($known_lists = lire_config("mailsubscribers/lists",array())
98                AND is_array($known_lists)
99                AND count($known_lists)){
100
101                foreach ($known_lists as $kl){
102                        $id = $kl['id'];
103                        if (!$filtrer_category OR $id=mailsubscribers_filtre_liste($id,$filtrer_category)){
104                                $status = ($kl['status']=='open'?'open':'close');
105                                if (!$filtrer_status OR $filtrer_status==$status) {
106                                        $listes[$id] = array(
107                                                'id' => $id,
108                                                'titre' => $kl['titre'],
109                                                'status' => $status
110                                        );
111                                }
112                        }
113                }
114        }
115
116        // puis trouver toutes les listes qui existent en base et non connues en config
117        // pas la peine si on a demande de filtrer les listes open ou close
118        if ($filtrer_status!=='?') {
119                $rows = sql_allfetsel("DISTINCT listes","spip_mailsubscribers","statut!=".sql_quote('poubelle'));
120                foreach ($rows as $row){
121                        $ll = explode(",",$row['listes']);
122                        foreach($ll as $l){
123                                if ($id=$l
124                                        AND (
125                                                !$filtrer_category OR $id=mailsubscribers_filtre_liste($l,$filtrer_category)
126                                        )){
127                                        if (!isset($listes[$id]))
128                                                $listes[$id] = array('id'=>$id,'titre'=>$id,'status'=>'?');
129                                }
130                        }
131                }
132        }
133
134        return $listes;
135}
136
137/**
138 * Renomme un identifiant de liste dans la liste des abonnés
139 *
140 * @note
141 *   Si le nouveau nom est déjà un nom de liste existante, le renommage
142 *   est tout de même effectué, sans doublonner si l'abonné y est déjà inscrit.
143 *
144 * @param string $liste_ancienne
145 *   Identifiant de liste à renommer (exemple newsletter::1-truc)
146 * @param string $liste_nouvelle
147 *   Nouvel identifiant de la liste (exemple newsletter::infolettre)
148 * @return bool
149 *   True si l'opération a été réalisée.
150**/
151function mailsubscribers_renommer_identifiant_liste($liste_ancienne, $liste_nouvelle) {
152        spip_log("Renommer la liste '$liste_ancienne' en '$liste_nouvelle'", "mailsubscribers");
153
154        while ($subscribers = sql_allfetsel(
155                'id_mailsubscriber, listes',
156                'spip_mailsubscribers',
157                "listes REGEXP '(^|,)$liste_ancienne($|,)'",
158                "","","0,50"))
159        {
160                if (!$subscribers) break;
161
162                include_spip('action/editer_objet');
163                $liste_nouvelle = trim($liste_nouvelle);
164
165                foreach ($subscribers as $s) {
166                        $listes = explode(',', $s['listes']);
167                        $key = array_search($liste_ancienne, $listes);
168                        if ($key !== false) { // sait on jamais
169                                // si le nouveau nom existe déjà, pas la peine de le dupliquer !
170                                if (false === array_search($liste_nouvelle, $listes)) {
171                                        $listes[$key] = $liste_nouvelle;
172                                } else {
173                                        unset($listes[$key]);
174                                }
175                                $listes = implode(',', $listes);
176                                objet_modifier("mailsubscriber", $s['id_mailsubscriber'], array('listes' => $listes));
177                        }
178                }
179        }
180        return true;
181}
182
183
184/**
185 * Supprime un identifiant de liste dans la liste des abonnés
186 *
187 * Si un abonné n'est alors plus abonné à aucune liste,
188 * on le met à la poubelle !
189 *
190 * @param string $liste
191 *   Identifiant de liste à supprimer (exemple newsletter::infolettre)
192 * @return bool
193 *   True si l'opération a été réalisée.
194**/
195function mailsubscribers_supprimer_identifiant_liste($liste) {
196        spip_log("Supprimer la liste '$liste'", "mailsubscribers");
197        $GLOBALS['notification_instituermailsubscriber_status'] = false; // pas de notification ici
198
199        while ($subscribers = sql_allfetsel(
200                'id_mailsubscriber, listes',
201                'spip_mailsubscribers',
202                "listes REGEXP '(^|,)$liste($|,)'",
203                "","","0,50"))
204        {
205                if (!$subscribers) break;
206
207                include_spip('action/editer_objet');
208
209                foreach ($subscribers as $s) {
210                        $listes = explode(',', $s['listes']);
211                        $key = array_search($liste, $listes);
212                        if ($key !== false) { // sait on jamais
213                                unset($listes[$key]);
214                        }
215                        if (count($listes)) {
216                                $listes = implode(',', $listes);
217                                objet_modifier("mailsubscriber", $s['id_mailsubscriber'], array('listes' => $listes));
218                        } else {
219                                objet_modifier("mailsubscriber", $s['id_mailsubscriber'], array('listes' => '', 'statut' => 'poubelle'));
220                        }
221                }
222        }
223        return true;
224}
Note: See TracBrowser for help on using the repository browser.