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

Last change on this file since 104337 was 104337, checked in by spip.franck@…, 4 years ago
File size: 12.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;
9
10include_spip('inc/session');
11include_spip('inc/mailsubscribers');
12
13/**
14 * Declarer les champs postes et y integrer les valeurs par defaut
15 */
16function formulaires_importer_mailsubscribers_charger_dist() {
17        $valeurs = array(
18                'file_import' => '',
19                'valid_subscribers' => 1,
20                'listes_import_subscribers' => '',
21                'desactiver_notif' => 1,
22                'vider_table' => '',
23        );
24
25        $valeurs['_listes_dispo'] = mailsubscribers_listes();
26
27        return $valeurs;
28}
29
30/**
31 * Verifier les champs postes et signaler d'eventuelles erreurs
32 */
33function formulaires_importer_mailsubscribers_verifier_dist() {
34        $erreurs = array();
35        $filename = '';
36        if (_request('go')) {
37                $filename = session_get('importer_mailsubscribers::tmpfilename');
38        } else {
39                $files = importer_mailsubscribers_file();
40                if (is_string($files)) // erreur
41                {
42                        $erreurs['file_import'] = $files;
43                } else {
44                        $files = reset($files);
45                        $filename = _DIR_TMP . basename($files['tmp_name']);
46                        move_uploaded_file($files['tmp_name'], $filename);
47                        session_set('importer_mailsubscribers::tmpfilename', $filename);
48                        session_set('importer_mailsubscribers::filename', $files['name']);
49                }
50        }
51
52        if (!$filename) {
53                $erreurs['file_import'] = _T('info_obligatoire');
54        } elseif (!_request('go')) {
55                $importer_csv = charger_fonction("importer_csv", "inc");
56                $test = importer_mailsubscribers_data($filename);
57                $head = array_keys(reset($test));
58
59                $erreurs['test'] = "\n";
60                if (in_array("statut", $head) AND in_array("listes", $head)) {
61                        $erreurs['test'] .= "<p class='notice'>" . _T('mailsubscriber:texte_avertissement_import') . "</p>\n\n";
62                }
63                $erreurs['test'] .= "|{{" . implode("}}|{{", $head) . "}}|\n";
64                $nbmax = 10;
65                $count = count($test);
66                while ($row = array_shift($test) AND $nbmax--) {
67                        $erreurs['test'] .= "|" . implode("|", $row) . "|\n";
68                }
69                $erreurs['test'] .= "\n\n";
70                $erreurs['test'] .= "<p class='explication'>{{" . singulier_ou_pluriel($count,
71                                'mailsubscriber:info_1_adresse_a_importer', 'mailsubscriber:info_nb_adresses_a_importer') . "}}</p>";
72
73                if (!in_array("statut", $head)) {
74                        $erreurs['demander_statut'] = ' ';
75                }
76                if (!in_array("listes", $head)) {
77                        $erreurs['demander_listes'] = ' ';
78                }
79                $erreurs['message_erreur'] = '';
80        }
81
82        return $erreurs;
83}
84
85/**
86 * Traiter les champs postes
87 */
88function formulaires_importer_mailsubscribers_traiter_dist() {
89        refuser_traiter_formulaire_ajax();// pour recharger toute la page
90
91        if (_request('vider_table') AND autoriser('detruire')) {
92                include_spip('base/abstract_sql');
93                sql_delete("spip_mailsubscribers");
94                sql_delete("spip_mailsubscriptions");
95        }
96
97        $res = array('editable' => true);
98        $options = array('listes' => array());
99        if (_request('valid_subscribers')) {
100                $options['statut'] = 'valide';
101        }
102        if ($l = _request('listes_import_subscribers')) {
103                $options['listes'] = $l;
104        }
105        // pas de notification pour cet import
106        if (_request('desactiver_notif')) {
107                $options['notify'] = false;
108        }
109
110        $filename = session_get('importer_mailsubscribers::tmpfilename');
111        // creer une liste de diffusion correspondant a cet import (automatique)
112        $set = array(
113                'titre' => basename(session_get('importer_mailsubscribers::filename')),
114                'identifiant' => 'import_'.substr(md5(session_get('importer_mailsubscribers::filename').$filename.date('Y-m-d H:i:s')),0,7).'_'.date('Ymd'),
115        );
116        include_spip('action/editer_objet');
117        $id_mailsubscribinglist = objet_inserer('mailsubscribinglist');
118        objet_modifier('mailsubscribinglist', $id_mailsubscribinglist, $set);
119        // et inscrire les emails a cette liste
120        $options['listes'][] = $set['identifiant'];
121
122        $r = importer_mailsubscribers_importe($filename, $options);
123
124        $message =
125                sinon(
126                        singulier_ou_pluriel($r['count'], 'mailsubscriber:info_1_mailsubscriber',
127                                'mailsubscriber:info_nb_mailsubscribers'),
128                        _T('mailsubscriber:info_aucun_mailsubscriber')
129                );
130        if (count($r['erreurs'])) {
131                $message .= "<p>Erreurs : <br />" . implode("<br />", $r['erreurs']) . "</p>";
132                $res['message_erreur'] = $message;
133        } else {
134                $res['message_ok'] = $message;
135        }
136
137
138        return $res;
139}
140
141
142function importer_mailsubscribers_file() {
143        static $files = array();
144        // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif
145        // lorsqu'on est appelle au traitement
146
147        if (count($files)) {
148                return $files;
149        }
150
151        $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
152        $files = array();
153        if (is_array($post)) {
154                include_spip('action/ajouter_documents');
155                include_spip('inc/joindre_document');
156
157                foreach ($post as $file) {
158                        if (is_array($file['name'])) {
159                                while (count($file['name'])) {
160                                        $test = array(
161                                                'error' => array_shift($file['error']),
162                                                'name' => array_shift($file['name']),
163                                                'tmp_name' => array_shift($file['tmp_name']),
164                                                'type' => array_shift($file['type']),
165                                        );
166                                        if (!($test['error'] == 4)) {
167                                                if (is_string($err = joindre_upload_error($test['error']))) {
168                                                        return $err;
169                                                } // un erreur upload
170                                                if (!is_array(verifier_upload_autorise($test['name']))) {
171                                                        return _T('medias:erreur_upload_type_interdit', array('nom' => $test['name']));
172                                                }
173                                                $files[] = $test;
174                                        }
175                                }
176                        } else {
177                                //UPLOAD_ERR_NO_FILE
178                                if (!($file['error'] == 4)) {
179                                        if (is_string($err = joindre_upload_error($file['error']))) {
180                                                return $err;
181                                        } // un erreur upload
182                                        if (!is_array(verifier_upload_autorise($file['name']))) {
183                                                return _T('medias:erreur_upload_type_interdit', array('nom' => $file['name']));
184                                        }
185                                        $files[] = $file;
186                                }
187                        }
188                }
189                if (!count($files)) {
190                        return _T('medias:erreur_indiquez_un_fichier');
191                }
192        }
193
194        return $files;
195}
196
197function importer_mailsubscribers_data($filename) {
198
199        $header = true;
200        $importer_csv = charger_fonction("importer_csv", "inc");
201
202        // lire la premiere ligne et voir si elle contient 'email' pour decider si entete ou non
203        if ($handle = @fopen($filename, "r")) {
204                $line = fgets($handle, 4096);
205                if (!$line OR stripos($line, 'email') === false) {
206                        $header = false;
207                }
208                @fclose($handle);
209        }
210
211        $data_raw = $importer_csv($filename, $header, ",", '"', null);
212        // verifier qu'on a pas affaire a un fichier avec des fins de lignes Windows mal interpretes
213        // corrige le cas du fichier texte 1 colonne, c'est mieux que rien
214        if (count($data_raw) == 1
215                AND count(reset($data_raw)) == 1
216        ) {
217                $d = reset($data_raw);
218                $d = reset($d);
219                $d = explode("\r", $d);
220                $d = array_map('trim', $d);
221                $d = array_filter($d);
222                if (count($d) > 1) {
223                        $data_raw = array();
224                        foreach ($d as $v) {
225                                $data_raw[] = array($v);
226                        }
227                }
228        }
229        // colonner : si colonne email on prend toutes les colonnes
230        // sinon on ne prend que la premiere colonne, comme un email
231        $data = array();
232        while ($data_raw AND count($data_raw)) {
233
234                $row = array_shift($data_raw);
235                $row = array_combine(array_map('strtolower', array_keys($row)), array_values($row));
236
237                $d = array();
238                if (isset($row['email'])) {
239                        $d['email'] = $row['email'];
240                } else {
241                        $d['email'] = reset($row);
242                }
243
244                foreach (array('nom', 'lang', 'listes', 'statut', 'date') as $k) {
245                        if (isset($row[$k])) {
246                                $d[$k] = $row[$k];
247                        }
248                }
249
250                // Mailchimp
251                if (isset($row['prenom'])) {
252                        $d['nom'] = trim($row['prenom'] . (isset($d['nom']) ? " " . $d['nom'] : ""));
253                }
254                if (isset($row['confirm_time']) AND !isset($d['date'])) {
255                        $d['date'] = $row['confirm_time'];
256                        if (!isset($d['statut'])) {
257                                $d['statut'] = 'valide';
258                        }
259                }
260
261                $data[] = $d;
262        }
263
264        return $data;
265}
266
267/**
268 *
269 * @param string $filename
270 * @param array $options
271 *   statut
272 *   listes
273 * @return array
274 */
275function importer_mailsubscribers_importe($filename, $options = array()) {
276        $res = array('count' => 0, 'erreurs' => array());
277
278        $data = importer_mailsubscribers_data($filename);
279        $newsletter_subscribe = charger_fonction('subscribe', 'newsletter');
280        $newsletter_unsubscribe = charger_fonction('unsubscribe', 'newsletter');
281        include_spip('inc/filtres'); // email_valide
282        include_spip('action/editer_objet');
283        include_spip('inc/mailsubscribers');
284        set_request('id_auteur', ''); // pas d'auteur associe a nos inscrits
285        $notify = true;
286        if (isset($options['notify'])){
287                $notify = $options['notify'];
288        }
289
290        foreach ($data as $d) {
291                // strategie d'import en fonction de la qualite des donnees
292
293                // si pas de colonne email explicite, on prend la premiere colonne et on importe en mail si valide, tel quel
294                // mais graceful (sans forcer le reabonnement d'un desabonne)
295                $email = trim($d['email']);
296                if ($email AND email_valide($email)) {
297                        // abonner directement, sans passer par demande de confirmation
298                        $set = array('notify'=>$notify, 'force'=>true);
299                        if (isset($d['nom'])) {
300                                $set['nom'] = $d['nom'];
301                        }
302                        if (isset($d['lang'])) {
303                                $set['lang'] = $d['lang'];
304                        }
305                        if (isset($d['listes'])) {
306                                $set['listes'] = explode(',', $d['listes']);
307                                $set['listes'] = importer_mailsubscribers_listes($set['listes']);
308                        }
309
310                        if (!isset($d['statut']) AND isset($options['statut'])) {
311                                $d['statut'] = $options['statut'];
312                        }
313                        if (!isset($set['listes']) AND isset($options['listes']) AND is_array($options['listes'])) {
314                                $set['listes'] = $options['listes'];
315                        }
316
317                        if (!isset($d['statut']) or !isset($d['listes'])) {
318                                if (!mailsubscribers_test_email_obfusque($email)){
319                                        $set['graceful'] = true; // ne pas reabonner un desabonne
320                                        $newsletter_subscribe($email, $set);
321                                        spip_log("Importer $email " . var_export($set, true), "mailsubscribers");
322                                        $res['count']++;
323                                }
324                        } // si statut explicite, il faut importer a la main pour respecter le statut demande
325                        else {
326                                unset($set['notify']);
327                                unset($set['force']);
328                                $listes = $set['listes'];
329                                unset($set['listes']);
330                                $razlistes = false;
331                                // si la liste vient des options on la merge avec l'existante
332                                if (!isset($d['listes']) AND is_array($listes)) {
333                                        $razlistes = true;
334                                }
335
336                                if (isset($d['date'])) {
337                                        $set['date'] = $d['date'];
338                                }
339                                if($razlistes){
340                                        $set['optin'] = mailsubscribers_trace_optin('raz par import csv','');
341                                }
342                                // d'abord on cree/update les donnees dans spip_mailsubscribers
343                                $id = 0;
344                                if ($row = sql_fetsel("id_mailsubscriber", "spip_mailsubscribers",
345                                                "email=" . sql_quote($email) . " OR email=" . sql_quote(mailsubscribers_obfusquer_email($email)))
346                                        AND $id = $row["id_mailsubscriber"]
347                                ) {
348                                        $set['email'] = $email; // si mail obfusque
349                                        $set['statut'] = $d['statut'];
350                                        objet_modifier("mailsubscriber", $id, $set);
351                                        $res['count']++;
352                                } else {
353                                        $set['email'] = $email;
354                                        if ($id = objet_inserer("mailsubscriber", 0, $set)) {
355                                                // on garde tous les champs car objet_inserer n'a pas forcement fait le boulot (depend de https://core.spip.net/projects/spip/repository/revisions/20021)
356                                                $set['statut'] = $d['statut'];
357                                                objet_modifier("mailsubscriber", $id, $set);
358                                                $res['count']++;
359                                        } else {
360                                                $res['erreurs'][] = "erreur import \"<tt>$email</tt>\"";
361                                        }
362                                }
363                                // et on appelle subscribe juste pour les listes
364                                if ($id){
365                                        if ($razlistes){
366                                                sql_delete('spip_mailsubscriptions','id_mailsubscriber='.intval($id));
367                                        }
368                                        if (in_array($d['statut'],array('prop','valide','refuse'))){
369                                                $set = array('listes'=>$listes,'notify'=>false);
370                                                if ($d['statut']=='valide') {
371                                                        $set['force'] = true;
372                                                }
373                                                else {
374                                                        $set['force'] = -1;
375                                                }
376                                                $newsletter_subscribe($email, $set);
377                                                if ($d['statut'] == 'refuse') {
378                                                        $set['force'] = true;
379                                                        $newsletter_unsubscribe($email, $set);
380                                                }
381                                        }
382                                }
383                        }
384                } else {
385                        // ne pas produire une erreur pour un email vide
386                        if ($email) {
387                                $res['erreurs'][] = "email invalide \"<tt>$email</tt>\"";
388                        }
389                }
390        }
391
392        // debloquer les flags edition
393        include_spip('inc/drapeau_edition');
394        debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
395        effacer_meta("newsletter_subscribers_count");
396
397
398        return $res;
399}
400
401/**
402 * Importer les listes
403 * @param array $listes
404 * @return array
405 */
406function importer_mailsubscribers_listes($listes){
407        static $existing;
408
409        if (is_null($existing)){
410                $existing = sql_allfetsel('identifiant','spip_mailsubscribinglists');
411                $existing = array_map('reset',$existing);
412        }
413
414        foreach ($listes as $k=>$liste) {
415                $listes[$k] = $liste = mailsubscribers_normaliser_nom_liste($liste);
416                if (!in_array($liste, $existing)){
417                        $statut = 'fermee';
418                        $identifiant = $liste;
419                        if (!$id = sql_getfetsel('id_mailsubscribinglist','spip_mailsubscribinglists','identifiant='.sql_quote($identifiant))) {
420                                $ins = array(
421                                        'titre' => 'Liste ' . $identifiant,
422                                        'descriptif' => 'Import CSV',
423                                        'identifiant' => $identifiant,
424                                        'statut' => $statut,
425                                        'date' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']),
426                                );
427                                $id = sql_insertq('spip_mailsubscribinglists', $ins);
428                        }
429                        if ($id) {
430                                $existing[] = $liste;
431                        }
432                }
433        }
434
435        return $listes;
436}
437
Note: See TracBrowser for help on using the repository browser.