source: spip-zone/_plugins_/spip-listes/spip-listes_1_9_3/balise/formulaire_abonnement.php @ 47554

Last change on this file since 47554 was 47554, checked in by paladin@…, 10 years ago

format de réception par défaut appliqué à la balise FORMULAIRE_ABONNEMENT

  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 17.3 KB
Line 
1<?php
2/**
3 *
4 * Si inscriptions pas autorisees, retourner une chaine d'avertissement
5 * Sinon inclusion du squelette
6 * Si pas de nom ou pas de mail valide, premier appel rien d'autre a faire
7 * Autrement 2e appel, envoyer un mail et le squelette ne produira pas de
8 * formulaire.
9 * @see formulaire_abonnement.html
10 *              qui est un formulaire d'exemple d'utilisation
11 *              de la balise.
12 * @see formulaires/formulaire_abonnement.html
13 *              qui est le formulaire utilisé par cette balise
14 *              pour calculer le contenu du formulaire
15 *              d'abonnement ou de gestion, à l'aide du contexte.
16 * @package spiplistes
17 */
18 // $LastChangedRevision: 47554 $
19 // $LastChangedBy: paladin@quesaco.org $
20 // $LastChangedDate: 2011-05-08 15:21:09 +0000 (Sun, 08 May 2011) $
21
22if(!defined('_ECRIRE_INC_VERSION')) return;     #securite
23
24include_spip('base/abstract_sql');
25include_spip('inc/spiplistes_api_globales');
26include_spip('inc/spiplistes_api');
27include_spip('inc/spiplistes_api_courrier');
28include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php');
29
30// Balise independante du contexte
31
32function balise_FORMULAIRE_ABONNEMENT ($p) {
33
34        spiplistes_debug_log('balise_FORMULAIRE_ABONNEMENT()');
35
36        return(calculer_balise_dynamique($p, 'FORMULAIRE_ABONNEMENT', array('id_liste')));
37}
38
39/**
40 * args[0] indique une liste
41 * args[1] indique un eventuel squelette alternatif
42 * [(#FORMULAIRE_ABONNEMENT{mon_squelette})]
43 * un cas particulier est :
44 * [(#FORMULAIRE_ABONNEMENT{listeX})]
45 * qui permet d'afficher le formulaire d'abonnement a la liste numero X
46 * @param array $args
47 * @param $filtres
48 * @return array
49 */
50function balise_FORMULAIRE_ABONNEMENT_stat($args, $filtres) {
51
52        preg_match_all('/liste([0-9]+)/x', $args[1], $matches);
53        if($id_liste = intval($matches[1][0])) {
54                $args[0]=$id_liste;
55        }
56        $args[1]='formulaire_abonnement';
57       
58        return(array($args[0],$args[1]));
59}
60
61
62function balise_FORMULAIRE_ABONNEMENT_dyn($id_liste, $formulaire) {
63
64        //spiplistes_debug_log("balise_FORMULAIRE_ABONNEMENT_dyn() -$id_liste-");
65
66        include_spip ('inc/meta');
67        include_spip ('inc/session');
68        include_spip ('inc/filtres');
69        include_spip ('inc/texte');
70        include_spip ('inc/meta');
71        include_spip ('inc/mail');
72        include_spip ('inc/acces');
73        include_once (_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php');
74
75               
76        //recuperation des variables utiles
77        $oubli_pass = _request('oubli_pass');
78        $email_oubli = _request('email_oubli');
79        $type = _request('type');
80       
81        // recuperation de la config SPIP-Listes
82        // 'simple' = ne renvoie que la confirmation d'abonnement
83        // 'membre' = complete le mail par un mot de passe pour s'identifier sur le site
84        $acces_membres = ($GLOBALS['meta']['abonnement_config'] == 'membre') ? 'oui' : 'non';
85               
86        // aller chercher le formulaire html qui va bien                               
87        $formulaire = 'formulaires/'.$formulaire ;             
88                       
89        // Accepter l'inscription en tant qu'auteur ?
90        // pour memo: l'auteur a acces a l'espace prive'
91        $inscriptions_ecrire = ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
92        // Accepter l'inscription en tant que visiteur ?
93        // pour memo: le visiteur n'a pas acces a l'espace prive'
94        $inscriptions_publiques = ($GLOBALS['meta']['accepter_visiteurs'] == 'oui');
95       
96        $affiche_formulaire = $inscription_redacteur = $inscription_visiteur = '';
97       
98        $nom_site_spip = spiplistes_nom_site_texte ($lang);
99        $adresse_site = $GLOBALS['meta']['adresse_site'];
100       
101        // envoyer le cookie de relance mot de passe si pass oublie
102        if($email_oubli)
103        {
104                if(email_valide($email_oubli))
105                {
106                        $row = spiplistes_auteurs_auteur_select('id_auteur,statut'
107                                                                                                        , 'email='.sql_quote($email_oubli)
108                                                                                                        );
109                       
110                        if($row /* = sql_fetch($sql_result) */ )
111                        {
112                                if($row['statut'] == '5poubelle')
113                                {
114                                        $erreur = _T('pass_erreur_acces_refuse');
115                                }
116                                else if($id_abo = intval($row['id_auteur']))
117                                {
118                                        $cookie = creer_uniqid();
119                                        spiplistes_auteurs_cookie_oubli_updateq($cookie, $email_oubli);
120                                       
121                                        $message = _T('spiplistes:abonnement_mail_passcookie'
122                                                                , array(
123                                                                        'nom_site_spip' => $nom_site_spip
124                                                                        , 'adresse_site' => $adresse_site
125                                                                        , 'cookie' => $cookie)
126                                                                );
127                               
128                                        $objet = "[$nom_site_spip] " . _T('pass_oubli_mot');
129                                        $patron = spiplistes_patron_message();
130                                        $format = spiplistes_format_abo_demande($id_abo);
131                                        $contexte = array();
132                                        $email_a_envoyer = spiplistes_preparer_message (
133                                                $objet
134                                                , $patron
135                                                , $format
136                                                , $contexte
137                                                , $abonne['email']
138                                                , $abonne['nom']);
139                                       
140                                        if(spiplistes_envoyer_mail($email_oubli
141                                                                                           , $objet
142                                                                                           , $email_a_envoyer
143                                                                                           ))
144                                        {
145                                                $erreur = _T('pass_recevoir_mail');
146                                        }
147                                        else
148                                        {
149                                                $erreur = _T('pass_erreur_probleme_technique');
150                                        }
151                                }
152                        }
153                        else
154                        {
155                                $erreur = _T('pass_erreur_non_enregistre'
156                                                         , array('email_oubli' => htmlspecialchars($email_oubli))
157                                                         );
158                        }
159                }
160                else
161                {
162                        $erreur = _T('pass_erreur_non_valide'
163                                                 , array('email_oubli' => htmlspecialchars($email_oubli))
164                                                 );
165                }
166        } // end if $email_oubli
167       
168        // afficher le formulaire d'oubli du pass
169        if($oubli_pass == 'oui') {
170                return array($formulaire,
171                                         $GLOBALS['delais'],
172                        array(
173                                'oubli_pass' => $oubli_pass
174                                , 'erreur' => $erreur
175                                , 'inscription_redac' => ''
176                                , 'inscription_visiteur' => ''
177                                , 'mode_login' => false
178                                , 'reponse_formulaire' => false
179                                , 'liste' => ''
180                        )
181                );
182        }
183       
184        //code pour s inscrire
185        else if(
186                $inscriptions_ecrire 
187                || $inscriptions_publiques 
188                || ($GLOBALS['meta']['forums_publics'] == 'abo') 
189        ) {
190                $accepter_nouveau = 'oui';
191               
192                // debut presentation
193       
194                $inscription_redacteur = 
195                        ($inscriptions_ecrire && ($type=='redac')) 
196                        ? 'oui' 
197                        : 'non'
198                        ;
199
200                $inscription_visiteur = 
201                        (($type!='redac') && $inscriptions_publiques && ($acces_membres=='oui')) 
202                        ? 'oui' 
203                        : 'non'
204                        ;
205                               
206                list($affiche_formulaire
207                         , $reponse_formulaire
208                         , $mode_modifier
209                         , $abonne
210                         ) = 
211                        spiplistes_formulaire_abonnement(
212                                (($type=='redac') ? 'redac' : 'forum')
213                                , $acces_membres
214                                , $formulaire
215                                , $nom_site_spip
216                                , $inscription_redacteur
217                                , $inscription_visiteur
218                        );
219        }
220        else {
221                spiplistes_debug_log (_T('pass_erreur').' acces visiteurs non autorises');
222        }
223       
224        return array($formulaire, $GLOBALS['delais'],
225                                array(
226                                        'oubli_pass' => $oubli_pass
227                                        , 'erreur' => $erreur
228                                        , 'inscription_redacteur' => $inscription_redacteur
229                                        //, 'acces_membres' => $acces_membres
230                                        , 'inscription_visiteur' => $inscription_visiteur
231                                        , 'mode_login' => $affiche_formulaire
232                                        , 'message_formulaire' => $message_formulaire
233                                        , 'reponse_formulaire' => $reponse_formulaire
234                                        , 'accepter_auteur' => $GLOBALS['meta']['accepter_inscriptions']
235                                        , 'id_liste' => $id_liste
236                                        , 'accepter_nouveau' => $accepter_nouveau
237                                        , 'mode_modifier' => $mode_modifier
238                                        , 'id_auteur' => $abonne['id_auteur']
239                                        , 'format' => $abonne['format']
240                                        )
241                                );
242                               
243                               
244} // end balise_FORMULAIRE_ABONNEMENT_dyn()
245
246
247/**
248 * Abonnement d'un visiteur ou d'un auteur
249 * Si authentifie', modifie l'abonnement, sinon envoie mail avec cookie_oubli pour confirmer.
250 * Si adresse_mail absent de la base, cree un login a partir de l'email et renvoie un mail de confirmation.
251 *
252 * @param string $type
253 * @param string $acces_membres
254 * @param string $formulaire
255 * @param string $nom_site_spip
256 * @param string $inscription_redacteur
257 * @param string $inscription_visiteur
258 * @return array()
259 */
260function spiplistes_formulaire_abonnement (
261                                                                                        $type
262                                                                                        , $acces_membres
263                                                                                        , $formulaire
264                                                                                        , $nom_site_spip
265                                                                                        , $inscription_redacteur
266                                                                                        , $inscription_visiteur
267                                                                                        ) {
268       
269        $mail_inscription_ = trim(strtolower(_request('mail_inscription_')));
270        $nom_inscription_ = trim(_request('nom_inscription_'));
271        $type_abo = _request('suppl_abo') ;
272        $listes_demande = _request('list');
273        $desabo = ($type_abo == 'non') ? 'oui' : 'non';
274       
275        $adresse_site = $GLOBALS['meta']['adresse_site'];
276
277        $reponse_formulaire = '';
278        $email_a_envoyer = $mode_modifier = $sql_where = false;
279        $abonne = array();
280       
281        /**
282         * La variable d est transmise via URL proposé en pied de mail
283         * du courrier envoyé.
284         * Elle n'est pas utilisée dans le squelette
285         * d'abonnement.
286         */
287        $d = _request('d');
288       
289        if(!empty($d)) {
290                $sql_where = array(
291                                'cookie_oubli='.sql_quote($d)
292                                , 'statut<>'.sql_quote('5poubelle')
293                                , 'pass<>'.sql_quote('')
294                        );
295        }
296        // ou si identifie'
297        else if($connect_id_auteur = intval($GLOBALS['auteur_session']['id_auteur']))
298        {
299                $sql_where = array("id_auteur=$connect_id_auteur");
300        }
301        if($sql_where) {
302                // cherche les coordonnees de l'abonne'
303                $sql_select = 'id_auteur,statut,nom,email,cookie_oubli';
304                $sql_result = sql_select(
305                        $sql_select
306                        , 'spip_auteurs'
307                        , $sql_where
308                        , '', '', 1
309                );
310                if($row = sql_fetch($sql_result)) {
311                        foreach(explode(',', $sql_select) as $key) {
312                                $abonne[$key] = $row[$key];
313                        }
314                }
315                $abonne['format'] = spiplistes_format_abo_demande($abonne['id_auteur']);
316               
317        }
318       
319        // si identifie' par cookie ou login... effectuer les modifications demandees
320        if(count($abonne)) {
321               
322               
323                // toujours rester en mode modif pour permettre la correction
324                $mode_modifier = 'oui';
325               
326                if($desabo == 'oui')
327                {
328                        spiplistes_format_abo_modifier($abonne['id_auteur']);
329                        $reponse_formulaire = _T('spiplistes:vous_etes_desabonne');
330                        $email_a_envoyer = true;
331                }
332               
333                else if($listes_demande)
334                {
335                        //spiplistes_debug_log("demande modification abonnements listes " . implode(",", $listes_demande));
336                       
337                        if(is_array($listes_demande) && count($listes_demande))
338                        {
339                                $listes_ajoutees = spiplistes_abonnements_ajouter($abonne['id_auteur']
340                                                                                                                        , array_map('intval', $listes_demande)
341                                                                                                                        );
342                                $curr_abos_auteur = spiplistes_abonnements_listes_auteur($abonne['id_auteur']);
343                               
344                                foreach($curr_abos_auteur as $id_liste) {
345                                        if(!in_array($id_liste, $listes_demande)) {
346                                                spiplistes_abonnements_auteur_desabonner($abonne['id_auteur']
347                                                                                                                                 , $id_liste
348                                                                                                                                 );
349                                        }
350                                }
351                        }
352                       
353                        // modifier le format de reception ?
354                        if(spiplistes_format_valide($type_abo) && ($type_abo != $abonne['format']))
355                        {
356                                spiplistes_format_abo_modifier($abonne['id_auteur'], $abonne['format'] = $type_abo);
357                                //$abonne['ids_abos'] = spiplistes_abonnements_listes_auteur($abonne['id_auteur']);
358                               
359                        }
360                       
361                        $reponse_formulaire = _T('spiplistes:demande_enregistree_retour_mail');
362                        $email_a_envoyer = true;
363                }
364                else
365                {
366                        //spiplistes_debug_log('pas de demande, afficher formulaire de modif au complet');
367                        $reponse_formulaire = ''
368                                . '<span class="nom">' . $abonne['nom'] . "</span>\n"
369                                . '<span class="souhait">' . _T('spiplistes:effectuez_modif_validez', array('s'=>$abonne['nom'])). "</span>\n"
370                                ;
371                }
372               
373                $id_abonne = $abonne['id_auteur'];
374                $objet_email = _T('spiplistes:votre_abo_listes');
375                $contexte = array('titre' => $objet_email);
376               
377        }
378        else // non identifie' ? gestion par cookie_oubli.
379        {
380                $texte_intro = _T('form_forum_message_auto') . '<br /><br />'._T('spiplistes:bonjour') . "<br />\n";
381               
382                $abonne = array('email' => email_valide($mail_inscription_));
383               
384                if($abonne['email'])
385                {
386                        // si l'abonne existe deja mais pas d'action demandee,
387                        // affiche formulaire complet
388                        //if($row = sql_fetch(
389                        if ($row = 
390                                spiplistes_auteurs_auteur_select ('id_auteur,login,nom,statut,lang', 'email='.sql_quote($abonne['email']))
391                               
392                        ) {
393                               
394                                $abonne['id_auteur'] = intval($row['id_auteur']);
395                                $abonne['statut'] = $row['statut'];
396                                $abonne['login'] = $row['login'];
397                                $abonne['nom'] = $row['nom'];
398                                $abonne['lang'] = $row['lang'];
399                                $abonne['format'] =
400                                        ($f = spiplistes_format_abo_demande($abonne['id_auteur']))
401                                        ? $f
402                                        : 'texte'
403                                        ;
404       
405                                if($abonne['statut'] == '5poubelle')
406                                {
407                                        $reponse_formulaire = _T('form_forum_access_refuse');
408                                }
409                                // si encore nouveau, c'est qu'il ne s'est jamais identifie'
410                                else if($abonne['statut'] == 'nouveau')
411                                {
412                                        // le supprimer. Il sera re-cree plus loin
413                                        spiplistes_auteurs_auteur_delete('id_auteur='.sql_quote($abonne['id_auteur']));
414                                        $abonne['id_auteur'] = false;
415                                }
416                                else {
417                                        // demande de modifier l'abonnement ? envoie le cookie de relance par mail
418                                        spiplistes_auteurs_cookie_oubli_updateq($abonne['cookie_oubli'] = creer_uniqid(), $abonne['email']);
419                                       
420                                        $objet_email = _T('spiplistes:abonnement_titre_mail');
421                                        $texte_email = spiplistes_texte_inventaire_abos($abonne['id_auteur'], $type_abo, $nom_site_spip);
422                                       
423                                       
424                                        $contexte = array('titre' => $objet_email);
425                                        $id_abonne = $abonne['id_auteur'];
426                                }
427                               
428                        }
429                        // l'adresse mail n'existe pas dans la base.
430                        else 
431                        {
432                               
433                                $abonne['login'] = spiplistes_login_from_email($abonne['email']);
434                                $abonne['nom'] =
435                                        (($acces_membres == 'non') || empty($nom_inscription_))
436                                        ? ucfirst($abonne['login'])
437                                        : $nom_inscription_
438                                        ;
439                               
440                                // ajouter l'abonne
441                                $pass = creer_pass_aleatoire(8, $abonne['email']);
442                                $abonne['zepass'] = $pass;
443                                $abonne['mdpass'] = md5($pass);
444                                $abonne['htpass'] = generer_htpass($pass);
445                               
446                                $abonne['cookie_oubli'] = creer_uniqid();
447                               
448                                $abonne['statut'] = ($inscription_redacteur == 'oui') ? 'nouveau' : '6forum';
449       
450                                // format d'envoi par defaut pour le premier envoi de confirmation
451                                $abonne['format'] = spiplistes_formats_abo_default();
452                               
453                                // creation du compte ...
454                                if($id_abonne = spiplistes_auteurs_auteur_insertq(
455                                                array(
456                                                        'nom' => $abonne['nom']
457                                                        , 'email' => $abonne['email']
458                                                        , 'login' => $abonne['login']
459                                                        , 'pass' => $abonne['mdpass']
460                                                        , 'statut' => $abonne['statut']
461                                                        , 'htpass' => $abonne['htpass']
462                                                        , 'cookie_oubli' => $abonne['cookie_oubli']
463                                                        )
464                                        )) {
465                                        // creation .htpasswd & LDAP si besoin systeme
466                                        ecrire_acces();
467                                       
468                                        // premier format de reception par defaut
469                                        spiplistes_format_abo_modifier($id_abonne, $abonne['format']);
470                                }
471
472                                $objet_email = _T('spiplistes:confirmation_inscription');
473                               
474                                $contexte = array(
475                                                                'titre' => $objet_email
476                                                                , 'nouvel_inscription' => 'oui'
477                                                                , 'inscription_redacteur' => $inscription_redacteur
478                                                                , 'inscription_visiteur' => $inscription_visiteur
479                                                        );
480                        }
481                       
482                        $email_a_envoyer = true;
483                       
484                }
485                else if(!empty($mail_inscription_)) {
486                        //Non email o non valida
487                        return(array(true, _T('spiplistes:erreur_adresse'), $mode_modifier, false));
488                }
489        }
490        if($id_abonne && $email_a_envoyer) {
491               
492                $abonne['ids_abos'] = spiplistes_abonnements_listes_auteur($abonne['id_auteur']);
493
494                $abonne['format'] = spiplistes_format_valide($abonne['format']);
495               
496                $email_a_envoyer = spiplistes_preparer_message(
497                                        ($objet_email = "[$nom_site_spip] " . $objet_email)
498                                        , spiplistes_patron_message()
499                                        , array_merge($contexte, $abonne)
500                                        );
501                if(
502                        spiplistes_envoyer_mail(
503                                $abonne['email']
504                                , $objet_email
505                                , $email_a_envoyer
506                                , false
507                                , ''
508                                , $abonne['format']
509                        )
510                ) {
511                        $reponse_formulaire =
512                                ($acces_membres == 'oui')
513                                ? _T('form_forum_identifiant_mail')
514                                : _T('spiplistes:demande_enregistree_retour_mail')
515                                ;
516                }
517                else {
518                        $reponse_formulaire = _T('form_forum_probleme_mail');
519                }
520        } 
521
522        return(array(true, $reponse_formulaire, $mode_modifier, $abonne));
523} // end spiplistes_formulaire_abonnement()
524
525
526function spiplistes_preparer_message ($objet, $patron, $contexte) {
527       
528        // si pas encore abonne' ou desabonne', pas de format ! donc forcer a texte
529        $format = ($contexte['format'] == 'html') ? $contexte['format'] : ($contexte['format'] = 'texte');
530
531        $contexte['patron'] = $patron;
532        $path_patron = _SPIPLISTES_PATRONS_MESSAGES_DIR . $patron;
533       
534        list($message_html, $message_texte) = spiplistes_assembler_patron($path_patron, $contexte);
535
536        $charset = $GLOBALS['meta']['spiplistes_charset_envoi'];
537       
538        if($charset != $GLOBALS['meta']['charset'])
539        {
540                include_spip('inc/charsets');
541                if($format == 'html') {
542                        $message_html = unicode2charset(charset2unicode($message_html), $charset);
543                }
544                //$message_texte = unicode2charset(charset2unicode($message_texte), $charset);
545                $message_texte = spiplistes_translate_2_charset ($message_texte, $charset);
546        }
547        $email_a_envoyer = array();
548        $email_a_envoyer['texte'] = new phpMail('', $objet, '', $message_texte, $charset);
549        if($format == 'html') {
550                $email_a_envoyer['html'] = new phpMail('', $objet, $message_html, $message_texte, $charset);
551                $email_a_envoyer['html']->Body = "<html>\n\n<body>\n\n" . $message_html . "\n\n</body></html>";
552                $email_a_envoyer['html']->AltBody = $message_texte;
553        }
554        $email_a_envoyer['texte']->Body = $message_texte ."\n\n";
555        $email_a_envoyer[$format]->SetAddress($contexte['email'], $contexte['nom']);
556       
557        return($email_a_envoyer);
558}
559
560
561function spiplistes_texte_inventaire_abos ($id_abonne, $type_abo, $nom_site_spip) {
562       
563        // fait l'inventaire des abos
564        $listes_abonnements = spiplistes_abonnements_listes_auteur ($id_abonne, true);
565        $nb = count($listes_abonnements);
566        $message_list = 
567                ($nb)
568                ? "\n- " . implode("\n- ", $listes_abonnements) . ".\n"
569                : ''
570                ;
571
572        $m1 = ($nb > 1) ? 'inscription_reponses_s' : 'inscription_reponse_s';
573        if($nb > 1) {
574                $m2 = _T('spiplistes:inscription_listes_f', array('f' => $type_abo));
575        } else if($nb == 1) {
576                $m2 = _T('spiplistes:inscription_liste_f', array('f' => $type_abo));
577        } else {
578                $m2 = _T('spiplistes:vous_abonne_aucune_liste');
579        }
580        $texte = ''
581                . "\n"._T('spiplistes:'.$m1, array('s' => htmlentities($nom_site_spip)))
582                . ".\n"
583                . $m2.$message_list
584                ;
585        return($texte);
586}
587
588/**
589 * renvoie le nom du patron pour la composition des messages de gestion
590 * (confirmation d'abonnement, modification, etc.)
591 * @return string
592 * */
593function spiplistes_patron_message () {
594        return ('standard');
595}
Note: See TracBrowser for help on using the repository browser.