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

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

Import d'inscription. Le format attendu est du type CSV.
Si le fichier n'a pas de colonne nommée, on considère que la première est l'email et on inscrit tous les emails récupérés dans le fichier (permet d'importer tel quel un export txt des vieux spip-listes 1.9)
Si le fichier a des colonnes nommées :

  • en l'absence de colonne statut on inscrit tous ceux du fichier (mais graceful : on ne reinscrit jamais quelqu'un qui s'est desabonne)
  • avec une colonne statut on met en base directement (insertion ou modification) les emails fournis, avec le statut fourni (réimport depuis une autre base)

Cela boucle les fonctions importantes du plugin.
Restent en TODO :

  • interfaçage des listes de diffusion : configurer les listes disponibles, les prendre en compte dans le form edition (et dans le form inscription si aucune liste fournie en argument ?)
  • import automatisé des inscrits spip-listes/spip-clear/clevermail/mes_abonnes a l'installation
File size: 6.7 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');
10
11/**
12 * Declarer les champs postes et y integrer les valeurs par defaut
13 */
14function formulaires_importer_mailsubscribers_charger_dist(){
15        $valeurs = array('file_import' => '');
16        return $valeurs;
17}
18
19/**
20 * Verifier les champs postes et signaler d'eventuelles erreurs
21 */
22function formulaires_importer_mailsubscribers_verifier_dist(){
23        $erreurs = array();
24        if (_request('go')){
25                $filename=session_get('importer_mailsubscribers::filename');
26        }
27        else {
28                $files = importer_mailsubscribers_file();
29                if (is_string($files)) // erreur
30                        $erreurs['file_import'] = $files;
31                else {
32                        $files = reset($files);
33                        $filename = _DIR_TMP.basename($files['tmp_name']);
34                        move_uploaded_file($files['tmp_name'], $filename);
35                        session_set('importer_mailsubscribers::filename',$filename);
36                }
37        }
38
39        if (!$filename){
40                $erreurs['file_import'] = _T('info_obligatoire');
41        }
42        elseif (!_request('go')){
43                $importer_csv = charger_fonction("importer_csv","inc");
44                $test = importer_mailsubscribers_data($filename);
45                $head = array_keys(reset($test));
46
47                $erreurs['test'] = "";
48                if (in_array("statut",$head)){
49                        $erreurs['test'] .= "<p class='notice'>"._T('mailsubscriber:texte_avertissement_import')."</p>";
50                }
51                $erreurs['test'] .= "|{{".implode("}}|{{",$head)."}}|\n";
52                $nbmax = 10;
53                $count = count($test);
54                while ($row = array_shift($test) AND $nbmax--){
55                        $erreurs['test'].="|".implode("|",$row)."|\n";
56                }
57                $erreurs['test'] .= "\n";
58                $erreurs['test'] .= "{{".singulier_ou_pluriel($count,'mailsubscriber:info_1_adresse_a_importer','mailsubscriber:info_nb_adresses_a_importer')."}}";
59        }
60
61        return $erreurs;
62}
63
64/**
65 * Traiter les champs postes
66 */
67function formulaires_importer_mailsubscribers_traiter_dist(){
68        refuser_traiter_formulaire_ajax();// pour recharger toute la page
69
70        $res = array('editable'=>true);
71        $r = importer_mailsuscribers_importe(session_get('importer_mailsubscribers::filename'));
72
73        $message =
74                sinon(
75                        singulier_ou_pluriel($r['count'],'mailsubscriber:info_1_mailsubscriber','mailsubscriber:info_nb_mailsubscribers'),
76                        _T('mailsubscriber:info_aucun_mailsubscriber')
77                );
78        if (count($r['erreurs'])){
79                $message .= "<p>Erreurs : <br />".implode("<br />",$r['erreurs'])."</p>";
80                $res['message_erreur'] = $message;
81        }
82        else {
83                $res['message_ok'] = $message;
84        }
85
86
87        return $res;
88}
89
90
91function importer_mailsubscribers_file(){
92        static $files = array();
93        // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif
94        // lorsqu'on est appelle au traitement
95
96        if (count($files))
97                return $files;
98
99        $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
100        $files = array();
101        if (is_array($post)){
102                include_spip('action/ajouter_documents');
103                include_spip('inc/joindre_document');
104
105          foreach ($post as $file) {
106                if (is_array($file['name'])){
107                        while (count($file['name'])){
108                                        $test=array(
109                                                'error'=>array_shift($file['error']),
110                                                'name'=>array_shift($file['name']),
111                                                'tmp_name'=>array_shift($file['tmp_name']),
112                                                'type'=>array_shift($file['type']),
113                                                );
114                                        if (!($test['error'] == 4)){
115                                                if (is_string($err = joindre_upload_error($test['error'])))
116                                                        return $err; // un erreur upload
117                                                if (!is_array(verifier_upload_autorise($test['name'])))
118                                                        return _T('medias:erreur_upload_type_interdit',array('nom'=>$test['name']));
119                                                $files[]=$test;
120                                        }
121                        }
122                }
123                else {
124                        //UPLOAD_ERR_NO_FILE
125                                if (!($file['error'] == 4)){
126                                        if (is_string($err = joindre_upload_error($file['error'])))
127                                                return $err; // un erreur upload
128                                        if (!is_array(verifier_upload_autorise($file['name'])))
129                                                return _T('medias:erreur_upload_type_interdit',array('nom'=>$file['name']));
130                                        $files[]=$file;
131                                }
132                }
133                }
134                if (!count($files))
135                        return _T('medias:erreur_indiquez_un_fichier');
136        }
137        return $files;
138}
139
140function importer_mailsubscribers_data($filename){
141
142        $header = true;
143        $importer_csv = charger_fonction("importer_csv","inc");
144
145        // lire la premiere ligne et voir si elle contient 'email' pour decider si entete ou non
146        if ($handle = @fopen($filename, "r")){
147                $line = fgets($handle, 4096);
148                if (!$line OR stripos($line,'email')===false)
149                        $header = false;
150                @fclose($handle);
151        }
152
153        $data_raw = $importer_csv($filename,$header);
154
155        // colonner : si colonne email on prend toutes les colonnes
156        // sinon on ne prend que la premiere colonne, comme un email
157        $data = array();
158        while ($data_raw AND count($data_raw)){
159                $d = array_shift($data_raw);
160                if ($d){
161                        if (isset($d['email']))
162                                $data[] = $d;
163                        else
164                                $data[] = array('email'=>reset($d));
165                }
166        }
167
168        return $data;
169}
170
171function importer_mailsuscribers_importe($filename){
172        $res = array('count'=>0,'erreurs'=>array());
173
174        $data = importer_mailsubscribers_data($filename);
175        $newsletter_subscribe = charger_fonction('subscribe','newsletter');
176        include_spip('inc/filtres'); // email_valide
177        include_spip('action/editer_objet'); // email_valide
178        set_request('id_auteur',''); // pas d'auteur associe a nos inscrits
179
180        foreach ($data as $d){
181                // strategie d'import en fonction de la qualite des donnees
182
183                // si pas de colonne email explicite, on prend la premiere colonne et on importe en mail si valide, tel quel
184                // mais graceful (sans forcer le reabonnement d'un desabonne)
185                $email = $d['email'];
186                if (email_valide($email)){
187                        $set = array();
188                        if (isset($d['nom'])) $set['nom'] = $d['nom'];
189                        if (isset($d['lang'])) $set['lang'] = $d['lang'];
190                        if (isset($d['listes'])) $set['listes'] = explode(',',$d['listes']);
191
192                        if (!isset($d['statut'])){
193                                $set['graceful']=true;
194                                $newsletter_subscribe($email,$set);
195                                spip_log("Importer $email ".var_export($set,true),"mailsubscribers");
196                                $res['count']++;
197                        }
198                        // si statut explicite, il faut importer a la main pour respecter le statut demande
199                        else {
200                                if (isset($set['listes'])) $set['listes'] = implode(',',$set['listes']);
201                                if (isset($d['date'])) $set['date'] = $d['date'];
202                                if ($id = sql_getfetsel("id_mailsubscriber","spip_mailsubscribers","email=".sql_quote($email))){
203                                        $set['statut'] = $d['statut'];
204                                        objet_modifier("mailsubscriber",$id,$set);
205                                        $res['count']++;
206                                }
207                                else {
208                                        $set['email'] = $email;
209                                        if ($id = objet_inserer("mailsubscriber",0,$set)) {
210                                                // 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)
211                                                $set['statut'] = $d['statut'];
212                                                objet_modifier("mailsubscriber",$id,$set);
213                                                $res['count']++;
214                                        }
215                                        else {
216                                                $res['erreurs'][] = "erreur import \"<tt>$email</tt>\"";
217                                        }
218                                }
219                        }
220                }
221                else {
222                        $res['erreurs'][] = "email invalide \"<tt>$email</tt>\"";
223                }
224        }
225
226        return $res;
227}
228?>
Note: See TracBrowser for help on using the repository browser.