source: spip-zone/_plugins_/mailsubscribers/trunk/newsletter/subscribe.php @ 83028

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

oups, bugfix correctif de r82344 : quand le invite_from est vide, il ne faut pas envoyer un mail d'invitation, c'est une confirmation normale
+ pas de blocquote dans un <p>

File size: 6.1 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
11include_spip("action/editer_objet");
12include_spip('inc/mailsubscribers');
13include_spip('inc/config');
14include_spip('inc/filtres');
15include_spip('inc/autoriser');
16
17/**
18 * Inscrit un subscriber par son email
19 * si le subscriber existe deja, on met a jour les informations (nom, listes, lang)
20 * l'ajout d'une inscription a une liste est cumulatif : si on appelle plusieurs fois la fonction avec le meme email
21 * et plusieurs listes differentes, l'inscrit sera sur chaque liste
22 * Pour retirer une liste il faut desinscrire
23 *
24 * Quand aucune liste n'est indiquee :
25 *   si l'email n'est inscrit a rien, on l'inscrit a la liste generale 'newsletter'
26 *   si l'email est deja inscrit, on ne change pas ses inscriptions, mais on modifie ses informations (nom, lang)
27 *
28 * @param $email
29 *   champ obligatoire
30 * @param array $options
31 *   nom : string
32 *   listes : array (si non fourni, inscrit a la liste generale 'newsletter')
33 *   lang : string
34 *   force : bool permet de forcer une inscription sans doubleoptin (passe direct en valide)
35 *   graceful : bool permet a contrario de ne pas inscrire quelqu'un qui s'est desabonne (utilise lors de l'import en nombre, l'utilisateur est ignore dans ce cas)
36 *   invite_email_from : text . utilisé par le formulaire #NEWSLETTER_INVITE, permet de renseigner la personne qui invite à s'inscrire à la newsletter
37 *   invite_email_text : text . utilisé par le formulaire #NEWSLETTER_INVITE, permet de renseigner le message personnalisé d'invitation
38 * @return bool
39 *   true si inscrit comme demande, false sinon
40 */
41function newsletter_subscribe_dist($email,$options = array()){
42
43        if (!$email = trim($email)) return false;
44        // on abonne pas un email invalide ou obfusque !
45        if (!email_valide($email) OR mailsubscribers_test_email_obfusque($email)){
46                spip_log("email invalide pour abonnement : $email","mailsubscribers."._LOG_INFO_IMPORTANTE);
47                return false;
48        }
49
50        $set = array();
51        foreach (array('lang', 'nom','invite_email_from','invite_email_text') as $k){
52                if (isset($options[$k]))
53                        $set[$k] = $options[$k];
54        }
55        if (isset($options['listes'])
56          AND is_array($options['listes'])){
57                $set['listes'] = array_map('mailsubscribers_normaliser_nom_liste',$options['listes']);
58                $set['listes'] = implode(',',$set['listes']);
59        }
60
61        // chercher si un tel email est deja en base
62        $row = sql_fetsel('*','spip_mailsubscribers','email='.sql_quote($email)." OR email=".sql_quote(mailsubscribers_obfusquer_email($email)));
63
64        // Si c'est une creation d'inscrit
65        if (!$row){
66                if (isset($options['invite_email_from']) AND strlen($options['invite_email_from'])){
67            spip_log("Invitation ". $options['invite_email_from'] . " invite $email a s'inscrire " ,"mailsubscribers."._LOG_INFO_IMPORTANTE);
68                }
69        else {
70                        spip_log("Inscription liste $email " ,"mailsubscribers."._LOG_INFO_IMPORTANTE);
71          }
72                // on utilise pas objet_inserer car email unique et on ne veut pas passer par etape insertion email='' qui peut echouer
73                // en cas de doublon
74                $set['email'] = $email;
75                if (!isset($set['lang']))
76                        $set['lang'] = $GLOBALS['meta']['langue_site'];
77                if (!isset($set['listes']))
78                        $set['listes'] = mailsubscribers_normaliser_nom_liste();
79                // statut et date par defaut
80                $set['statut'] = 'prepa';
81                $set['date'] = date('Y-m-d H:i:s');
82
83                if ($id = objet_inserer("mailsubscriber",0,$set)){
84                        $row = sql_fetsel('*','spip_mailsubscribers','id_mailsubscriber='.intval($id));
85                        if ($row['email']!==$set['email']){
86                                // securite car $set pas forcement pris en charge dans objet_inserer
87                                autoriser_exception("modifier","mailsubscriber",$row['id_mailsubscriber']);
88                                autoriser_exception("instituer","mailsubscriber",$row['id_mailsubscriber']);
89                                objet_modifier("mailsubscriber",$row['id_mailsubscriber'],$set);
90                                autoriser_exception("modifier","mailsubscriber",$row['id_mailsubscriber'],false);
91                                autoriser_exception("instituer","mailsubscriber",$row['id_mailsubscriber'],false);
92                                $row = sql_fetsel('*','spip_mailsubscribers','id_mailsubscriber='.intval($id));
93                        }
94                        $set = array();
95                }
96
97                else {
98                        spip_log("Impossible de creer un mailsubscriber : ".var_export($set,true),"mailsubscribers."._LOG_ERREUR);
99                        return false;
100                }
101        }
102        else {
103                $set['email'] = $email; // si email obfusque
104                // si on est graceful et que l'inscrit s'est deja desabonne, on ne fait rien
105                if ($row['statut']=='refuse'
106                  AND isset($options['graceful'])
107                  AND $options['graceful']==true)
108                        return false;
109
110                $row['listes'] = explode(',',$row['listes']);
111                if (!isset($set['listes'])){
112                        // filtrer les listes de newsletter pour voir si l'abonne est abonne a quelque chose
113                        $listes = array_map('mailsubscribers_filtre_liste',$row['listes']);
114                        $listes = array_filter($listes);
115                        // sinon l'abonner a la liste par defaut
116                        if (!count($listes))
117                                $set['listes'] = mailsubscribers_normaliser_nom_liste();
118                }
119                // si c'est un inscrit existant faire les mises a jour des listes si besoins
120                if (isset($set['listes'])){
121                        $set['listes'] = array_merge($row['listes'],explode(',',$set['listes']));
122                        $set['listes'] = array_map('trim',$set['listes']);
123                        $set['listes'] = array_unique($set['listes']);
124                        $set['listes'] = array_filter($set['listes']);
125                        $set['listes'] = implode(",",$set['listes']);
126                        if (!$set['listes'])
127                                $set['listes'] = mailsubscribers_normaliser_nom_liste();
128                }
129        }
130
131        // si pas deja valide
132        if ($row['statut']!=='valide'){
133                // changer le statut en prop (doubleoptin) ou valide (simpleoptin)
134                if (
135                        (isset($options['force']) AND $options['force'])
136                        OR !lire_config('mailsubscribers/double_optin',0)){
137
138                        $set['statut'] = 'valide';
139                }
140                else {
141                        $set['statut'] = 'prop';
142                }
143        }
144        if (count($set)){
145                autoriser_exception("modifier","mailsubscriber",$row['id_mailsubscriber']);
146                autoriser_exception("instituer","mailsubscriber",$row['id_mailsubscriber']);
147                objet_modifier("mailsubscriber",$row['id_mailsubscriber'],$set);
148                autoriser_exception("modifier","mailsubscriber",$row['id_mailsubscriber'],false);
149                autoriser_exception("instituer","mailsubscriber",$row['id_mailsubscriber'],false);
150        }
151
152        return true;
153}
Note: See TracBrowser for help on using the repository browser.