Changeset 86325 in spip-zone


Ignore:
Timestamp:
Nov 28, 2014, 4:23:14 PM (6 years ago)
Author:
cedric@…
Message:

Evolutions fonctionnelles :

  • on peut creer automatiquement une liste des Administrateurs, Redacteurs et/ou Visiteurs, en cochant une case, qui seront synchronisées automatiquement une fois par jour
  • par extension, on peut synchroniser facilement la liste de son choix avec toutes données externes en ecrivant la fonction mailsubscribers_synchro_list_newsletter_{$id}() qui devra retourner une liste des abonnes avec au moins le champs 'email' pour chaque et optionnellement les champs 'nom' et 'prenom'. Des que la fonction existe, un message informe que la liste est synchronisée automatiquement
  • fonction de synchronisation facile d'une liste avec un tableau d'abonnes. Pour le moment la fonction ne peut fonctionner qu'avec un tableau, ce qui limite aux listes raisonnables (quelques milliers, mais pas plusieurs centaines de millier)
Location:
_plugins_/mailsubscribers/trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/mailsubscribers/trunk/formulaires/configurer_mailsubscribers.html

    r69541 r86325  
    4141                                        <BOUCLE_listes(POUR){tableau #GET{tableau}|array_merge{#ARRAY{new1,#LISTE,new2,#LISTE}}}>
    4242                                                #SET{index,#COMPTEUR_BOUCLE|moins{1}}
     43                                                <h3 class="legend">#ENV*{lists/#GET{index}/titre,#VALEUR{titre}}</h3>
     44                                                [<p class="explication">(#ENV*{lists/#GET{index}/id}|sinon{'-'}|mailsubscribers_compte_inscrits|singulier_ou_pluriel{mailsubscriber:info_1_mailsubscriber,mailsubscriber:info_nb_mailsubscribers}
     45                                                        |concat{'. ',#ENV*{lists/#GET{index}/id}|sinon{'-'}|mailsubscribers_trouver_fonction_synchro|?{<:mailsubscriberscfg:info_liste_synchronisee_automatiquement:>}}|ltrim{'.'}|trim)</p>]
    4346                                                <ul class="liste-diffusion">
    4447                                                        #SET{name,id}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs/lists/#GET{index}/#GET{name}}}
     
    8992                                </fieldset>
    9093                        </li>
    91 
     94                        #SET{name,listes_auto_auteurs}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     95                        <B_statuts>
     96                        <li class="fieldset">
     97                                <fieldset>
     98                                        <legend><:mailsubscriberscfg:legend_listes_automatiques:></legend>
     99                                        <ul>
     100                                                <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
     101                                                        <span class='erreur_message'>(#GET{erreurs})</span>
     102                                                        ]
     103                                                        <BOUCLE_statuts(POUR){tableau #ENV{_auteurs_possibles}}>
     104                                                        #SET{val,#CLE}
     105                                                        <div class="choix">
     106                                                                <input type="checkbox" name="#GET{name}#EVAL{chr(91)}#EVAL{chr(93)}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#GET{val}|in_any{#ENV{#GET{name},#GET{defaut}}}|oui)checked="checked"] />
     107                                                                <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name}}|_T{#ARRAY{'statut',#VALEUR}})]</label>
     108                                                        </div>
     109                                                        </BOUCLE_statuts>
     110                                                </li>
     111                                        </ul>
     112                                </fieldset>
     113                        </li>
     114                        </B_statuts>
    92115                </ul>
    93116
     
    97120</div>
    98121<style type="text/css">
    99 ul.liste-diffusion {border-bottom: 1px solid #eee;padding-top: 1em !important;padding-bottom: 1em !important;}
     122h3.legend {margin-top: 1.5em;margin-bottom: 0}
     123.formulaire_spip ul.liste-diffusion {border-bottom: 1px solid #eee;padding-top: 1em !important;padding-bottom: 1em !important;margin-left: 125px}
    100124ul.liste-diffusion .editer {padding-top: 2px;padding-bottom: 2px;}
    101125ul.liste-diffusion .editer .choix.left {float: left}
    102126ul.liste-diffusion .editer .choix.right {float: right}
    103 ul.liste-diffusion .choix_close { margin-left:3em;}
     127ul.liste-diffusion .choix_close { margin-left:1em;}
     128ul.liste-diffusion .choix_close label { margin-left:0;}
     129ul.liste-diffusion .explication {clear: both}
    104130</style>
  • _plugins_/mailsubscribers/trunk/formulaires/configurer_mailsubscribers.php

    r69683 r86325  
    1616                'double_optin' => lire_config('mailsubscribers/double_optin',1),
    1717                'lists' => lire_config('mailsubscribers/lists',array()),
     18                'listes_auto_auteurs' => lire_config('mailsubscribers/listes_auto_auteurs',array()),
    1819        );
    1920
     
    2223        }
    2324
     25        $valeurs['_auteurs_possibles'] = mailsubscribers_liste_statut_auteur_possibles($valeurs['lists']);
    2426        return $valeurs;
    2527}
     
    5355**/
    5456function formulaires_configurer_mailsubscribers_traiter_dist(){
    55 
     57        $mailsubscribers_synchro_lists = false;
    5658        if ($lists = _request('lists')) {
    5759                $renommages = array(); # un renommage a t'il eu lieu ?
     
    6870
    6971                        // cas d'une suppression de liste d'information
    70                         if ($v['status'] == 'delete') {
     72                        if ($id_bak AND $v['status'] == 'delete') {
    7173                                mailsubscribers_supprimer_identifiant_liste($id_bak);
    7274                                unset($lists[$k]);
     
    105107                }
    106108
     109                // creer les listes automatiques 0minirezo, 1comite, 6forum si besoin
     110                if (count($la = _request('listes_auto_auteurs'))){
     111                        $noms = mailsubscribers_liste_statut_auteur_possibles($lists);
     112                        foreach($la as $s){
     113                                $id = mailsubscribers_normaliser_nom_liste($s);
     114                                foreach ($lists as $k => $v) {
     115                                        if ($v['id']==$id){
     116                                                $id="";
     117                                        }
     118                                }
     119                                if ($id){
     120                                        $lists[] = array('id'=>$id,'status'=>'open','titre'=>$noms[$s]);
     121                                }
     122                        }
     123                        // lancer le genie de synchro
     124                        $mailsubscribers_synchro_lists = charger_fonction("mailsubscribers_synchro_lists","genie");
     125                }
     126
    107127                set_request('lists',array_merge($lists)); // array_merge pour renumeroter les cles numeriques...
    108128                ecrire_config('mailsubscribers/',array('lists'=>$lists));
     
    111131
    112132        $trace = cvtconf_formulaires_configurer_enregistre('configurer_mailsubscribers',array());
     133        if ($mailsubscribers_synchro_lists AND function_exists($mailsubscribers_synchro_lists))
     134                $mailsubscribers_synchro_lists(0);
     135
    113136        $res = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true);
    114137
     
    118141        return $res;
    119142}
     143
     144/**
     145 * Trouver les statuts auteur qui n'ont pas encore de liste automatique
     146 * @param $lists
     147 * @return array
     148 */
     149function mailsubscribers_liste_statut_auteur_possibles($lists){
     150        $possibles = array(
     151                '0minirezo'=>'info_administrateurs',
     152                '1comite'=>'info_redacteurs',
     153                '6forum'=>'info_visiteurs'
     154        );
     155        foreach ($lists as $k => $v) {
     156                if (isset($possibles[$v['id']])){
     157                        unset($possibles[$v['id']]);
     158                }
     159        }
     160
     161        $possibles = array_map('_T',$possibles);
     162        return $possibles;
     163}
  • _plugins_/mailsubscribers/trunk/inc/mailsubscribers.php

    r75281 r86325  
    4141function mailsubscribers_test_email_obfusque($email){
    4242        return preg_match(",^[a-f0-9]+@example\.org$,",$email);
     43}
     44
     45/**
     46 * Compter les inscrits a une liste
     47 * @param $liste
     48 * @return mixed
     49 */
     50function mailsubscribers_compte_inscrits($liste){
     51        $subscribers = charger_fonction("subscribers","newsletter");
     52        return $subscribers(array($liste),array('count'=>true));
     53}
     54
     55/**
     56 * Trouver une fonction de synchronisation pour une liste donnee
     57 * @param $liste
     58 * @return mixed|string
     59 */
     60function mailsubscribers_trouver_fonction_synchro($liste){
     61        $f = mailsubscribers_normaliser_nom_liste($liste);
     62        $f = str_replace("::","_",$f);
     63        include_spip("public/parametrer"); // fichier mes_fonctions.php
     64        if (function_exists($f="mailsubscribers_synchro_list_$f"))
     65                return $f;
     66        return "";
    4367}
    4468
     
    81105 *   status : filtrer les listes sur le status
    82106 * @return array
    83  *   listes
     107 *   array
     108 *     id : identifiant
     109 *     titre : titre de la liste
     110 *     status : status de la liste
    84111 */
    85112function mailsubscribers_listes($options = array()){
     
    223250        return true;
    224251}
     252
     253
     254function mailsubscribers_do_synchro_list($liste){
     255        if ($f = mailsubscribers_trouver_fonction_synchro($liste)){
     256                $abonnes = $f();
     257                $n = count($abonnes);
     258                spip_log("Synchronise liste $liste avec $n abonnes (fonction $f)","mailsubscribers");
     259                mailsubscribers_synchronise_liste($liste,$abonnes);
     260        }
     261}
     262
     263
     264/**
     265 * Retourner la liste des abonnes qu'on veut voir dans la liste newsletter::0minirezo
     266 * @return array
     267 */
     268function mailsubscribers_synchro_list_newsletter_0minirezo(){
     269        $auteurs = sql_allfetsel("email,nom","spip_auteurs","statut=".sql_quote("0minirezo"));
     270        return $auteurs;
     271}
     272
     273/**
     274 * Retourner la liste des abonnes qu'on veut voir dans la liste newsletter::1comite
     275 * @return array
     276 */
     277function mailsubscribers_synchro_list_newsletter_1comite(){
     278        $auteurs = sql_allfetsel("email,nom","spip_auteurs","statut=".sql_quote("1comite"));
     279        return $auteurs;
     280}
     281
     282/**
     283 * Retourner la liste des abonnes qu'on veut voir dans la liste newsletter::6forum
     284 * @return array
     285 */
     286function mailsubscribers_synchro_list_newsletter_6forum(){
     287        $auteurs = sql_allfetsel("email,nom","spip_auteurs","statut=".sql_quote("6forum"));
     288        return $auteurs;
     289}
     290
     291
     292/**
     293 * Synchroniser les abonnes d'une liste en base avec un tableau fourni
     294 * TODO : permettre de fournir une resource SQL en entree et ne pas manipuler de gros tableau en memoire (robustesse)
     295 * @param string $liste
     296 *   liste avec laquelle on synchronise les abonnes
     297 * @param array $abonnes
     298 *   chaque abonne est un tableau avec l'entree 'email' et les entrees optionnelles 'nom' et 'prenom'
     299 */
     300function mailsubscribers_synchronise_liste($liste,$abonnes){
     301        $listes = array($liste);
     302
     303        // desactiver toutes les notifications pendant cette operation
     304        // on ne veut pas envoyer de mail a ceux qu'on ajoute/retire de la liste
     305        $GLOBALS['notification_instituermailsubscriber_status'] = false;
     306
     307        $abonnes_emails = array();
     308        while(count($abonnes)){
     309                $abonne = array_shift($abonnes);
     310                if (isset($abonne['email'])
     311                  AND strlen(trim($abonne['email']))){
     312                        $abonnes_emails[$abonne['email']] = $abonne;
     313                }
     314        }
     315
     316        $subscribers = charger_fonction('subscribers','newsletter');
     317        $subscribe = charger_fonction('subscribe','newsletter');
     318        $unsubscribe = charger_fonction('unsubscribe','newsletter');
     319
     320        // d'abord on prend la liste de tous les abonnes en base
     321        // et on retire ceux qui ne sont plus dans le tableau $abonnes
     322        $subs = $subscribers($listes);
     323        foreach($subs as $sub){
     324                // OK il est toujours dans les abonnes
     325                if (isset($abonnes_emails[$sub['email']])){
     326                        unset($abonnes_emails[$sub['email']]);
     327                }
     328                // il n'est plus dans les abonnes on l'enleve
     329                else {
     330                        //echo "unsubscribe ".$sub['email']."<br />";
     331                        $unsubscribe($sub['email'],array('listes'=>$listes));
     332                }
     333        }
     334
     335        // si il reste du monde dans $abonnes, c'est ceux qui ne sont pas en base
     336        // on les subscribe
     337        foreach($abonnes_emails as $email=>$abonne){
     338                //echo "subscribe ".$email."<br />";
     339                $nom = (isset($abonne['nom'])?$abonne['nom'].' ':'');
     340                $nom .= (isset($abonne['prenom'])?$abonne['prenom'].' ':'');
     341                $subscribe($email,array(
     342                        'nom' => trim($nom),
     343                        'listes' => $listes,
     344                        'force' => true,
     345                ));
     346        }
     347
     348        $GLOBALS['notification_instituermailsubscriber_status'] = true;
     349}
  • _plugins_/mailsubscribers/trunk/lang/mailsubscriberscfg_fr.php

    r69541 r86325  
    2222        'label_proposer_signup_optin_1'=> 'Proposer l\'inscription à la Newsletter lors de l\'inscription au site',
    2323
     24        'label_listes_auto_auteurs' => 'Liste des <b>@statut@</b>',
     25
    2426        'legend_listes_diffusion' => 'Listes de diffusion',
     27        'legend_listes_automatiques' => 'Listes de diffusion automatiques',
     28
     29        'info_liste_synchronisee_automatiquement' => 'Cette liste est automatiquement synchronisée.',
    2530
    2631        // T
  • _plugins_/mailsubscribers/trunk/mailsubscribers_fonctions.php

    r67853 r86325  
    3333        return $url;
    3434}
    35 
    36 ?>
  • _plugins_/mailsubscribers/trunk/mailsubscribers_pipelines.php

    r67911 r86325  
    77
    88if (!defined('_ECRIRE_INC_VERSION')) return;
     9
     10function mailsubscribers_taches_generales_cron($taches){
     11        // a peu pres tous les jours mais en se decalant un peu
     12        $taches['mailsubscribers_synchro_lists'] = 23 * 3600;
     13        return $taches;
     14}
    915
    1016/**
  • _plugins_/mailsubscribers/trunk/paquet.xml

    r84608 r86325  
    22        prefix="mailsubscribers"
    33        categorie="communication"
    4         version="1.5.5"
     4        version="1.6.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.0.*]"
     
    2424        <pipeline nom="formulaire_fond" inclure="mailsubscribers_pipelines.php" />
    2525        <pipeline nom="formulaire_traiter" inclure="mailsubscribers_pipelines.php" />
     26        <pipeline nom="taches_generales_cron" inclure="mailsubscribers_pipelines.php" />
    2627
    2728        <menu nom="mailsubscribers" titre="mailsubscriber:titre_mailsubscribers" parent="menu_activite" icone="images/mailsubscriber-16.png" action="mailsubscribers" />
Note: See TracChangeset for help on using the changeset viewer.