Ignore:
Timestamp:
Nov 28, 2014, 4:23:14 PM (5 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)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • _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}
Note: See TracChangeset for help on using the changeset viewer.