source: spip-zone/_plugins_/mailsubscribers/trunk/formulaires/importer_mailsubscribers.php @ 90444

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

trim sur l'email avant l'import pour eviter les doublons (bennyb)

File size: 9.6 KB
Line 
1<?php
2/**
3 * Plugin mailsubscribers
4 * (c) 2012 C�dric Morin
5 * Licence GNU/GPL v3
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return;
9include_spip('inc/session');
10include_spip('inc/mailsubscribers');
11
12/**
13 * Declarer les champs postes et y integrer les valeurs par defaut
14 */
15function formulaires_importer_mailsubscribers_charger_dist(){
16        $valeurs = array(
17                'file_import' => '',
18                'valid_subscribers' => '',
19                'listes_import_subscribers' => '',
20                'desactiver_notif' => '',
21                'vider_table' => '',
22        );
23
24        $valeurs['_listes_dispo'] = mailsubscribers_listes();
25        return $valeurs;
26}
27
28/**
29 * Verifier les champs postes et signaler d'eventuelles erreurs
30 */
31function formulaires_importer_mailsubscribers_verifier_dist(){
32        $erreurs = array();
33        if (_request('go')){
34                $filename=session_get('importer_mailsubscribers::filename');
35        }
36        else {
37                $files = importer_mailsubscribers_file();
38                if (is_string($files)) // erreur
39                        $erreurs['file_import'] = $files;
40                else {
41                        $files = reset($files);
42                        $filename = _DIR_TMP.basename($files['tmp_name']);
43                        move_uploaded_file($files['tmp_name'], $filename);
44                        session_set('importer_mailsubscribers::filename',$filename);
45                }
46        }
47
48        if (!$filename){
49                $erreurs['file_import'] = _T('info_obligatoire');
50        }
51        elseif (!_request('go')){
52                $importer_csv = charger_fonction("importer_csv","inc");
53                $test = importer_mailsubscribers_data($filename);
54                $head = array_keys(reset($test));
55
56                $erreurs['test'] = "";
57                if (in_array("statut",$head) AND in_array("listes",$head)){
58                        $erreurs['test'] .= "<p class='notice'>"._T('mailsubscriber:texte_avertissement_import')."</p>";
59                }
60                $erreurs['test'] .= "|{{".implode("}}|{{",$head)."}}|\n";
61                $nbmax = 10;
62                $count = count($test);
63                while ($row = array_shift($test) AND $nbmax--){
64                        $erreurs['test'].="|".implode("|",$row)."|\n";
65                }
66                $erreurs['test'] .= "\n";
67                $erreurs['test'] .= "<p class='explication'>{{".singulier_ou_pluriel($count,'mailsubscriber:info_1_adresse_a_importer','mailsubscriber:info_nb_adresses_a_importer')."}}</p>";
68
69                if (!in_array("statut",$head)){
70                        $erreurs['demander_statut'] = ' ';
71                }
72                if (!in_array("listes",$head)){
73                        $erreurs['demander_listes'] = ' ';
74                }
75        }
76
77        return $erreurs;
78}
79
80/**
81 * Traiter les champs postes
82 */
83function formulaires_importer_mailsubscribers_traiter_dist(){
84        refuser_traiter_formulaire_ajax();// pour recharger toute la page
85
86        if (_request('desactiver_notif'))
87                $GLOBALS['notification_instituermailsubscriber_status'] = false; // pas de notification pour cet import
88        if (_request('vider_table') AND autoriser('detruire')){
89                include_spip('base/abstract_sql');
90                sql_delete("spip_mailsubscribers");
91        }
92
93        $res = array('editable'=>true);
94        $options = array();
95        if (_request('valid_subscribers'))
96                $options['statut'] = 'valide';
97        if ($l = _request('listes_import_subscribers'))
98                $options['listes'] = $l;
99        $r = importer_mailsubscribers_importe(session_get('importer_mailsubscribers::filename'), $options);
100
101        $message =
102                sinon(
103                        singulier_ou_pluriel($r['count'],'mailsubscriber:info_1_mailsubscriber','mailsubscriber:info_nb_mailsubscribers'),
104                        _T('mailsubscriber:info_aucun_mailsubscriber')
105                );
106        if (count($r['erreurs'])){
107                $message .= "<p>Erreurs : <br />".implode("<br />",$r['erreurs'])."</p>";
108                $res['message_erreur'] = $message;
109        }
110        else {
111                $res['message_ok'] = $message;
112        }
113
114
115        return $res;
116}
117
118
119function importer_mailsubscribers_file(){
120        static $files = array();
121        // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif
122        // lorsqu'on est appelle au traitement
123
124        if (count($files))
125                return $files;
126
127        $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
128        $files = array();
129        if (is_array($post)){
130                include_spip('action/ajouter_documents');
131                include_spip('inc/joindre_document');
132
133          foreach ($post as $file) {
134                if (is_array($file['name'])){
135                        while (count($file['name'])){
136                                        $test=array(
137                                                'error'=>array_shift($file['error']),
138                                                'name'=>array_shift($file['name']),
139                                                'tmp_name'=>array_shift($file['tmp_name']),
140                                                'type'=>array_shift($file['type']),
141                                                );
142                                        if (!($test['error'] == 4)){
143                                                if (is_string($err = joindre_upload_error($test['error'])))
144                                                        return $err; // un erreur upload
145                                                if (!is_array(verifier_upload_autorise($test['name'])))
146                                                        return _T('medias:erreur_upload_type_interdit',array('nom'=>$test['name']));
147                                                $files[]=$test;
148                                        }
149                        }
150                }
151                else {
152                        //UPLOAD_ERR_NO_FILE
153                                if (!($file['error'] == 4)){
154                                        if (is_string($err = joindre_upload_error($file['error'])))
155                                                return $err; // un erreur upload
156                                        if (!is_array(verifier_upload_autorise($file['name'])))
157                                                return _T('medias:erreur_upload_type_interdit',array('nom'=>$file['name']));
158                                        $files[]=$file;
159                                }
160                }
161                }
162                if (!count($files))
163                        return _T('medias:erreur_indiquez_un_fichier');
164        }
165        return $files;
166}
167
168function importer_mailsubscribers_data($filename){
169
170        $header = true;
171        $importer_csv = charger_fonction("importer_csv","inc");
172
173        // lire la premiere ligne et voir si elle contient 'email' pour decider si entete ou non
174        if ($handle = @fopen($filename, "r")){
175                $line = fgets($handle, 4096);
176                if (!$line OR stripos($line,'email')===false)
177                        $header = false;
178                @fclose($handle);
179        }
180
181        $data_raw = $importer_csv($filename,$header,",",'"',null);
182        // verifier qu'on a pas affaire a un fichier avec des fins de lignes Windows mal interpretes
183        // corrige le cas du fichier texte 1 colonne, c'est mieux que rien
184        if (count($data_raw)==1
185          AND count(reset($data_raw))==1){
186                $d = reset($data_raw);
187                $d = reset($d);
188                $d = explode("\r", $d);
189                $d = array_map('trim', $d);
190                $d = array_filter($d);
191                if (count($d)>1){
192                        $data_raw = array();
193                        foreach ($d as $v)
194                                $data_raw[] = array($v);
195                }
196        }
197        // colonner : si colonne email on prend toutes les colonnes
198        // sinon on ne prend que la premiere colonne, comme un email
199        $data = array();
200        while ($data_raw AND count($data_raw)){
201
202                $row = array_shift($data_raw);
203                $row = array_combine(array_map('strtolower',array_keys($row)),array_values($row));
204
205                $d = array();
206                if (isset($row['email']))
207                        $d['email'] = $row['email'];
208                else
209                        $d['email'] = reset($row);
210
211                foreach(array('nom','lang','listes','statut','date') as $k)
212                        if (isset($row[$k]))
213                                $d[$k] = $row[$k];
214
215                // Mailchimp
216                if (isset($row['prenom'])){
217                        $d['nom'] = trim($row['prenom'] . (isset($d['nom'])?" ".$d['nom']:""));
218                }
219                if (isset($row['confirm_time']) AND !isset($d['date'])){
220                        $d['date'] = $row['confirm_time'];
221                        if (!isset($d['statut']))
222                                $d['statut'] = 'valide';
223                }
224
225                $data[] = $d;
226        }
227
228        return $data;
229}
230
231/**
232 *
233 * @param string $filename
234 * @param array $options
235 *   statut
236 *   listes
237 * @return array
238 */
239function importer_mailsubscribers_importe($filename,$options=array()){
240        $res = array('count'=>0,'erreurs'=>array());
241
242        $data = importer_mailsubscribers_data($filename);
243        $newsletter_subscribe = charger_fonction('subscribe','newsletter');
244        include_spip('inc/filtres'); // email_valide
245        include_spip('action/editer_objet');
246        include_spip('inc/mailsubscribers');
247        set_request('id_auteur',''); // pas d'auteur associe a nos inscrits
248
249        foreach ($data as $d){
250                // strategie d'import en fonction de la qualite des donnees
251
252                // si pas de colonne email explicite, on prend la premiere colonne et on importe en mail si valide, tel quel
253                // mais graceful (sans forcer le reabonnement d'un desabonne)
254                $email = trim($d['email']);
255                if ($email AND email_valide($email) AND !mailsubscribers_test_email_obfusque($email)){
256                        $set = array();
257                        if (isset($d['nom'])) $set['nom'] = $d['nom'];
258                        if (isset($d['lang'])) $set['lang'] = $d['lang'];
259                        if (isset($d['listes'])) $set['listes'] = explode(',',$d['listes']);
260
261                        if (!isset($d['statut']) AND isset($options['statut']))
262                                $d['statut'] = $options['statut'];
263                        if (!isset($set['listes']) AND isset($options['listes']) AND is_array($options['listes']))
264                                $set['listes'] = $options['listes'];
265
266                        if (!isset($d['statut'])){
267                                $set['graceful']=true;
268                                $newsletter_subscribe($email,$set);
269                                spip_log("Importer $email ".var_export($set,true),"mailsubscribers");
270                                $res['count']++;
271                        }
272                        // si statut explicite, il faut importer a la main pour respecter le statut demande
273                        else {
274                                if (isset($set['listes'])) $set['listes'] = implode(',',$set['listes']);
275                                if (isset($d['date'])) $set['date'] = $d['date'];
276                                if ($row = sql_fetsel("id_mailsubscriber,listes","spip_mailsubscribers","email=".sql_quote($email)." OR email=".sql_quote(mailsubscribers_obfusquer_email($email)))
277                                  AND $id = $row["id_mailsubscriber"]){
278                                        $set['email'] = $email; // si mail obfusque
279                                        $set['statut'] = $d['statut'];
280                                        // si la liste vient des options on la merge avec l'existante
281                                        if (!isset($d['listes']) AND isset($set['listes']) AND $row['listes']){
282                                                $l = array_unique(array_merge(explode(",",$row['listes']),explode(",",$set['listes'])));
283                                                $set['listes'] = implode(",",$l);
284                                        }
285                                        objet_modifier("mailsubscriber",$id,$set);
286                                        $res['count']++;
287                                }
288                                else {
289                                        $set['email'] = $email;
290                                        if ($id = objet_inserer("mailsubscriber",0,$set)) {
291                                                // on garde tous les champs car objet_inserer n'a pas forcement fait le boulot (depend de http://core.spip.org/projects/spip/repository/revisions/20021)
292                                                $set['statut'] = $d['statut'];
293                                                objet_modifier("mailsubscriber",$id,$set);
294                                                $res['count']++;
295                                        }
296                                        else {
297                                                $res['erreurs'][] = "erreur import \"<tt>$email</tt>\"";
298                                        }
299                                }
300                        }
301                }
302                else {
303                        // ne pas produire une erreur pour un email vide
304                        if ($email)
305                                $res['erreurs'][] = "email invalide \"<tt>$email</tt>\"";
306                }
307        }
308
309        // debloquer les flags edition
310        include_spip('inc/drapeau_edition');
311        debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
312        effacer_meta("newsletter_subscribers_count");
313
314
315        return $res;
316}
317?>
Note: See TracBrowser for help on using the repository browser.