source: spip-zone/_plugins_/alertes/trunk/genie/alertes.php @ 81373

Last change on this file since 81373 was 81373, checked in by magegahell@…, 5 years ago

Compatibilité Accès Restreint (on espère).
Formulaires d'exemples plus "SPIP" niveau sémantique.

File size: 5.7 KB
Line 
1<?php
2/*
3 * Plugin Alertes
4 * Distribué sous licence GPL
5 *
6 * Système d'envoi des emails d'alertes par pseudo-CRON SPIP.
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11function genie_alertes_dist($time) {
12        spip_log('Lacement du cron', 'alertes'._LOG_ERREUR);
13        include_spip('base/abstract_sql');
14        $now = date('Y-m-d H:i:s');
15        //Récupération de la configuration
16        $a = @unserialize($GLOBALS['meta']['config_alertes']);
17        //Est-ce que Accès restreint est activé ?
18        $plugins = @unserialize($GLOBALS['meta']['plugin']);
19        if(is_array($plugins['ACCESRESTREINT'])){
20                $acces_restreint = true;
21        }else{
22                $acces_restreint = false;
23        }
24        $limit = "0, ".intval($a['nb_mails']);
25        $nb_max = sql_countsel("id_alerte_cron", "spip_alertes_cron","date_pour_envoi <= '".$now."'"); //Nombres total d'alerte à traité, donc de mail à envoyer.
26        //Si on a plus d'alertes prevues que d'email autorisé à envoyer, il faudra poursuivre la tâche.
27        if($nb_max > intval($a['nb_mails'])){
28                $time = - intval($a['nb_mails']); //Si j'ai bien compris, temps en seconde avant de relancer la tâche non-terminée.
29                spip_log('Le temps sera fixe a '.$time, 'alertes'._LOG_ERREUR);
30        }
31        //Parcours des alertes demandées, qui ne doivent pas être dans le futur
32        if ($resultats = sql_select("*", "spip_alertes_cron","date_pour_envoi <= '".$now."'",$groupby, $orderby, $limit)) {
33                include_spip('classes/facteur'); //dépendance Facteur
34                $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
35                spip_log('Il y a des resultats', 'alertes'._LOG_ERREUR);
36                //Envoi des emails d'alertes
37                while ($res = sql_fetch($resultats)) {
38                        $id_article = $res['id_objet']; //Pour l'instant ça ne gère que les articles
39                        $id_auteur = $res['id_auteur'];
40                        $article_accessible = true;
41                        spip_log('Pour '.$id_article.' on a auteur '.$id_auteur.' qui est abo', 'alertes'._LOG_ERREUR);
42                        //On récupere l'email de l'auteur concerné
43                        if($auteur = sql_select('id_auteur,email','spip_auteurs','id_auteur = '.intval($id_auteur)) ){
44                                spip_log('Il y a des abonnes : '.$id_auteur, 'alertes'._LOG_ERREUR);
45                                while ($aut = sql_fetch($auteur)) {
46                                        //Evidemment, il faut l'email du membre.
47                                        $email = $aut['email'];
48                                        //On va quand même vérifier que l'article existe encore/est en etat publié
49                                        $verif = sql_select('statut','spip_articles','id_article = '.intval($id_article));
50                                        while($art = sql_fetch($verif)){
51                                                $statut = $art['statut'];
52                                        }
53                                        //Si accès restreint : vérifions que l'article n'est pas dans une zone limité pour l'auteur;
54                                        if($acces_restreint == true){   
55                                                $article_accessible = false; //On repasse à false par défaut
56                                                spip_log('Il y a acces restreint', 'alertes'._LOG_ERREUR);
57                                                //Recuperation des zones de l'auteur
58                                                if($zones = sql_select("id_zone", "spip_zones_liens", "id_objet = ".intval($id_auteur)." AND objet='auteur'")){
59                                                        while($z = sql_fetch($zones)){
60                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article n'est pas dans une des rubriques restreinte
61                                                                if($restrict = sql_select("*","spip_articles AS art, spip_zones_liens AS zo","id_zone = ".$z['id_zone']." AND zo.objet='rubrique' AND art.id_article = ".intval($id_article)." AND art.id_rubrique = zo.id_objet")){
62                                                                        while($r = sql_fetch($restrict)){
63                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
64                                                                                spip_log('mais on est dans une zone accessible pour '.$id_article, 'alertes'._LOG_ERREUR);
65                                                                        }
66                                                                }
67                                                        }
68                                                }
69                                        }
70                                        if( ($email)&&($statut == 'publie')&&($article_accessible == true) ){
71                                                spip_log('On build le mail pour '.$id_article, 'alertes'._LOG_ERREUR);
72                                                //On build le mail à partir de templates
73                                                $header_email = recuperer_fond("alertes/header-email-alerte",  array('id_article' => $id_article,'id_auteur' => $id_auteur));
74                                                $footer_email = recuperer_fond("alertes/footer-email-alerte",  array('id_article' => $id_article,'id_auteur' => $id_auteur));
75                                                $corps_email = recuperer_fond("alertes/corps-email-alerte", array('id_article' => $id_article,'id_auteur' => $id_auteur));
76                                                $sujet =  recuperer_fond("alertes/sujet-email-alerte", array('id_article' => $id_article,'id_auteur' => $id_auteur));  // Sujet du mail aussi en template (dangereux mais pratique si on veut le customiser). Doit renvoyer du texte brut                               
77                                                //On n'envoie que si on a un contenu (présumé dans le corps du mail)
78                                                if($corps_email){
79                                                        spip_log('On prepare l\'envoi', 'alertes'._LOG_ERREUR);
80                                                        //Envoi email via Facteur
81                                                        $html = $header_email.$corps_email.$footer_email;
82                                                        $texte = Facteur::html2text($html); //Version  texte
83                                                        $corps = array(
84                                                                'html' => $html,
85                                                                'texte' => $texte
86                                                        );     
87                                                        if($ok = $envoyer_mail($email, $sujet, $corps)){
88                                                                //Email envoyé, on retire l'alerte-cron et on log.
89                                                                $del = sql_delete('spip_alertes_cron', 'id_alerte_cron = ' . intval($res['id_alerte_cron']));
90                                                                spip_log('Email correctement envoyer a '.$email, 'alertes'._LOG_ERREUR); 
91                                                        }else{
92                                                                //Email non envoyé. On log.
93                                                                spip_log('Echec de l\'envoie d\'email a '.$email, 'alertes'._LOG_ERREUR); 
94                                                        }
95                                                }else{
96                                                        spip_log('On n\'a pas de contenu pour '.$id_article, 'alertes'._LOG_ERREUR); 
97                                                }
98                                        }else{
99                                                spip_log('Pas d\'email pour '.$id_auteur.' ou'.$id_article.'non publie ou article inaccessible', 'alertes'._LOG_ERREUR);
100                                                //Auteur sans email ou article non-publié/inexistant/restreint
101                                                if($statut != 'publie'){
102                                                        //Article non publie, l'alerte n'a pas lieu d'être nulle part
103                                                        $del = sql_delete("spip_alertes_cron", "objet = 'article' AND id_objet = " . intval($id_article));
104                                                }
105                                        }
106                                }
107                        }
108                }
109        }
110       
111        return $time;
112}
113
114?>
Note: See TracBrowser for help on using the repository browser.