source: spip-zone/_plugins_/alertes/trunk/alertes_pipelines.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: 14.0 KB
Line 
1<?php
2/*
3 * Plugin Alertes
4 * Distribué sous licence GPL
5 *
6 * Pipelines utilisés par le plugins d'Alertes.
7 * (NB : celui de notification ralentit de facto le mécanisme de publication d'article)
8 */
9
10if (!defined("_ECRIRE_INC_VERSION")) return;
11
12/*** Appel des CSS ***/
13function alertes_insert_head_css($flux){
14        $css = find_in_path("css/alertes.css");
15        $flux .= "<link rel='stylesheet' type='text/css' media='all' href='".direction_css($css)."' />\n";
16        return $flux;
17}
18/*** Tache CRON pour l'envoie différé des alertes ***/
19function alertes_taches_generales_cron($taches_generales){
20        //Récuperation de la configuration
21        $a = @unserialize($GLOBALS['meta']['config_alertes']);
22        if(is_array($a) AND intval($a['intervalle_cron']) > 1){
23                $taches_generales['alertes'] = 60 * intval($a['intervalle_cron']); // toutes les X minutes
24        }
25        return $taches_generales;
26}
27/*** Alertes : envoie d'email lors de la publication d'un article ***/
28function alertes_notifications_destinataires($flux) {
29        $quoi = $flux['args']['quoi'];
30        $options = $flux['args']['options'];
31        $date_pour_envoi = $options['date'];
32        //Récuperation de la configuration
33        $a = @unserialize($GLOBALS['meta']['config_alertes']);
34        //Est-ce que Accès restreint est activé ?
35        $plugins = @unserialize($GLOBALS['meta']['plugin']);
36        if(is_array($plugins['ACCESRESTREINT'])){
37                $acces_restreint = true;
38        }else{
39                $acces_restreint = false;
40        }
41        //Publication d'article : à ajouter aux alertes des abonnés
42        if ($quoi=='instituerarticle' AND $options['statut'] == 'publie' AND is_array($a)){
43                //Seulement si alertes actives
44                if($a['activer_alertes'] == 'oui'){
45                        $emails = array();
46                        $id_article = $flux['args']['id'];               
47                        include_spip('base/abstract_sql');
48                        //Mots clefs abonnables
49                        if($a['groupes']){
50                                $mots = sql_select('mot.id_mot, mot.id_groupe','spip_mots AS mot, spip_mots_liens AS ma','ma.id_objet = '.$id_article.' AND ma.objet ="article" AND ma.id_mot = mot.id_mot AND mot.id_groupe IN('.$a['groupes'].')');
51                                while ($mot = sql_fetch($mots)){               
52                                        //Qui est abonné à ce mot ?
53                                        $abonnes = sql_select('id_auteur', 'spip_alertes', 'id_objet = '.$mot['id_mot'].' AND objet = "mot"');
54                                        while($abonne = sql_fetch($abonnes)){
55                                                //L'auteur existe-t-il et a-t-il un email ?
56                                                if($verif = sql_select('id_auteur, email', 'spip_auteurs', 'id_auteur= '.$abonne['id_auteur'])){
57                                                        while($v = sql_fetch($verif)){
58                                                                if( ($v['email'])&&($v['id_auteur']) ){
59                                                                        if($acces_restreint == true){           
60                                                                                $article_accessible = false; // On bloque de base puis on vérifie
61                                                                                //Recuperation des zones de l'auteur
62                                                                                if($zones = sql_select("id_zone", "spip_zones_liens", "id_objet = ".$abonne['id_auteur']." AND objet='auteur'")){
63                                                                                        while($z = sql_fetch($zones)){
64                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
65                                                                                                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 = ".$id_article." AND art.id_rubrique = zo.id_objet")){
66                                                                                                        while($r = sql_fetch($restrict)){
67                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
68                                                                                                        }
69                                                                                                }
70                                                                                        }
71                                                                                }
72                                                                        }else{
73                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
74                                                                        }
75                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
76                                                                        if($article_accessible == true){
77                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
78                                                                        }
79                                                                }
80                                                                if( (!$v['email'])||($v['email'] == '') ){
81                                                                        //Pas d'email, on enlève des listes
82                                                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$v['id_auteur'])){
83                                                                                                spip_log('Effacement des auteurs sans emails le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
84                                                                                        }                                       
85                                                                }
86                                                        }
87                                                }else{
88                                                        //Retrait de l'auteur introuvable
89                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$abonne['id_auteur'])){
90                                                                spip_log('Effacer des auteurs sans ID le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
91                                                        }
92                                                }
93                                        }
94                                }
95                        }
96                        //Fin Mots-clefs abonnables
97                       
98                        //Secteurs abonnables
99                        if($a['secteurs']){
100                                $secteurs = sql_select('id_secteur','spip_articles','id_article = '.$id_article.'  AND id_secteur IN('.$a['secteurs'].')');
101                                while ($secteur = sql_fetch($secteurs)){               
102                                        //Qui est abonné à ce secteur ?
103                                        $abonnes = sql_select('id_auteur', 'spip_alertes', 'id_objet = '.$secteur['id_secteur'].' AND objet = "secteur"');
104                                        while($abonne = sql_fetch($abonnes)){
105                                                //L'auteur existe-t-il et a-t-il un email ?
106                                                if($verif = sql_select('id_auteur, email', 'spip_auteurs', 'id_auteur= '.$abonne['id_auteur'])){
107                                                        while($v = sql_fetch($verif)){
108                                                                if( ($v['email'])&&($v['id_auteur']) ){
109                                                                        if($acces_restreint == true){           
110                                                                                $article_accessible = false; // On bloque de base puis on vérifie
111                                                                                //Recuperation des zones de l'auteur
112                                                                                if($zones = sql_select("id_zone", "spip_zones_liens", "id_objet = ".$abonne['id_auteur']." AND objet='auteur'")){
113                                                                                        while($z = sql_fetch($zones)){
114                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
115                                                                                                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 = ".$id_article." AND art.id_rubrique = zo.id_objet")){
116                                                                                                        while($r = sql_fetch($restrict)){
117                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
118                                                                                                        }
119                                                                                                }
120                                                                                        }
121                                                                                }
122                                                                        }else{
123                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
124                                                                        }
125                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
126                                                                        if($article_accessible == true){
127                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
128                                                                        }
129                                                                }
130                                                                if( (!$v['email'])||($v['email'] == '') ){
131                                                                        //Pas d'email, on enlève des listes
132                                                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$v['id_auteur'])){
133                                                                                                spip_log('Effacer des auteurs sans email le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
134                                                                                        }                                       
135                                                                }
136                                                        }
137                                                }else{
138                                                        //Retrait de l'auteur introuvable
139                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$abonne['id_auteur'])){
140                                                                spip_log('Effacer des auteurs sans ID le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
141                                                        }
142                                                }
143                                        }
144                                }
145                        }
146                        //Fin secteurs abonnables
147                       
148                        //Rubriques abonnables
149                        if($a['rubriques']){
150                                $rubriques = sql_select('id_rubrique','spip_articles','id_article = '.$id_article.'  AND id_rubrique IN('.$a['rubriques'].')');
151                                while ($rubrique = sql_fetch($rubriques)){             
152                                        //Qui est abonné à cette rubrique ?
153                                        $abonnes = sql_select('id_auteur', 'spip_alertes', 'id_objet = '.$rubrique['id_rubrique'].' AND objet = "rubrique"');
154                                        while($abonne = sql_fetch($abonnes)){
155                                                //L'auteur existe-t-il et a-t-il un email ?
156                                                if($verif = sql_select('id_auteur, email', 'spip_auteurs', 'id_auteur= '.$abonne['id_auteur'])){
157                                                        while($v = sql_fetch($verif)){
158                                                                if( ($v['email'])&&($v['id_auteur']) ){
159                                                                        if($acces_restreint == true){           
160                                                                                $article_accessible = false; // On bloque de base puis on vérifie
161                                                                                //Recuperation des zones de l'auteur
162                                                                                if($zones = sql_select("id_zone", "spip_zones_liens", "id_objet = ".$abonne['id_auteur']." AND objet='auteur'")){
163                                                                                        while($z = sql_fetch($zones)){
164                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
165                                                                                                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 = ".$id_article." AND art.id_rubrique = zo.id_objet")){
166                                                                                                        while($r = sql_fetch($restrict)){
167                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
168                                                                                                        }
169                                                                                                }
170                                                                                        }
171                                                                                }
172                                                                        }else{
173                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
174                                                                        }
175                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
176                                                                        if($article_accessible == true){
177                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
178                                                                        }
179                                                                }
180                                                                if( (!$v['email'])||($v['email'] == '') ){
181                                                                        //Pas d'email, on enlève des listes
182                                                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$v['id_auteur'])){
183                                                                                                spip_log('Effacer des auteurs sans email le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
184                                                                                        }                                       
185                                                                }
186                                                        }
187                                                }else{
188                                                        //Retrait de l'auteur introuvable
189                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$abonne['id_auteur'])){
190                                                                spip_log('Effacer des auteurs sans ID le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
191                                                        }
192                                                }
193                                        }
194                                }
195                        }
196                        //Fin rubriques abonnables
197
198                        //Auteurs abonnables
199                        if($a['auteurs']){
200                                $auteurs = sql_select("id_auteur","spip_auteurs_liens","id_objet = ".$id_article."  AND objet='article'");
201                                while ($auteur = sql_fetch($auteurs)){         
202                                        //Qui est abonné à cet auteur ?
203                                        $abonnes = sql_select('id_auteur', 'spip_alertes', 'id_objet = '.$auteur['id_auteur'].' AND objet = "auteur"');
204                                        while($abonne = sql_fetch($abonnes)){
205                                                //L'auteur existe-t-il et a-t-il un email ?
206                                                if($verif = sql_select('id_auteur, email', 'spip_auteurs', 'id_auteur= '.$abonne['id_auteur'])){
207                                                        while($v = sql_fetch($verif)){
208                                                                if( ($v['email'])&&($v['id_auteur']) ){
209                                                                        if($acces_restreint == true){           
210                                                                                $article_accessible = false; // On bloque de base puis on vérifie
211                                                                                //Recuperation des zones de l'auteur
212                                                                                if($zones = sql_select("id_zone", "spip_zones_liens", "id_objet = ".$abonne['id_auteur']." AND objet='auteur'")){
213                                                                                        while($z = sql_fetch($zones)){
214                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
215                                                                                                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 = ".$id_article." AND art.id_rubrique = zo.id_objet")){
216                                                                                                        while($r = sql_fetch($restrict)){
217                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
218                                                                                                        }
219                                                                                                }
220                                                                                        }
221                                                                                }
222                                                                        }else{
223                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
224                                                                        }
225                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
226                                                                        if($article_accessible == true){
227                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
228                                                                        }
229                                                                }
230                                                                if( (!$v['email'])||($v['email'] == '') ){
231                                                                        //Pas d'email, on enlève des listes
232                                                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$v['id_auteur'])){
233                                                                                                spip_log('Effacer des auteurs sans email le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
234                                                                                        }                                       
235                                                                }
236                                                        }
237                                                }else{
238                                                        //Retrait de l'auteur introuvable
239                                                        if($del = sql_delete('spip_alertes', 'id_auteur='.$abonne['id_auteur'])){
240                                                                spip_log('Effacer des auteurs sans ID le '.date('Y-m-d H:i:s'), 'alertes'._LOG_INFO); 
241                                                        }
242                                                }
243                                        }
244                                }
245                        }
246                        //Fin auteurs abonnables
247                       
248                        //Maintenant, on gére l'envoi
249                        if( is_array($emails) AND sizeof($emails) > 0 ){
250                                //Mode CRON ou direct ? Mode CRON d'office si la configuration autorise les articles publié post-daté.
251                                if( ($a['mode_envoi'] == 'cron')||($GLOBALS['meta']['post_dates'] == 'oui') ){
252                                        //Mode CRON : on enregistre tout ça dans la table d'envois CRON dediée
253                                        foreach($emails as $id_auteur => $email){
254                                                $ins_cron =  sql_insertq('spip_alertes_cron', array('id_auteur'=> $id_auteur, 'id_objet' => $id_article, 'objet' => 'article', 'date_pour_envoi' => $date_pour_envoi));
255                                        }
256                               
257                                }else{
258                                //Mode direct (attention à la charge)
259                                        //Fonctions facteurs
260                                        include_spip('classes/facteur'); //dépendance Facteur
261                                        $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
262                                               
263                                        foreach($emails as $id_auteur => $email){               
264                                                //On construit le mail à partir de templates
265                                                $header_email = recuperer_fond("alertes/header-email-alerte",  array('id_article' => $id_article,'id_auteur' => $id_auteur));
266                                                $footer_email = recuperer_fond("alertes/footer-email-alerte",  array('id_article' => $id_article,'id_auteur' => $id_auteur));
267                                                $corps_email = recuperer_fond("alertes/corps-email-alerte", array('id_article' => $id_article,'id_auteur' => $id_auteur));
268                                                $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                               
269                                                //On n'envoie que si on a un contenu (présumé dans le corps du mail
270                                                if($corps_email){
271                                                        //Envoi email via Facteur
272                                                        $html = $header_email.$corps_email.$footer_email;
273                                                        $texte = Facteur::html2text($html); //Version  texte
274                                                        $corps = array(
275                                                                'html' => $html,
276                                                                'texte' => $texte
277                                                        );     
278                                                        if($ok = $envoyer_mail($email, $sujet, $corps)){
279                                                                //Email envoyé. On log.
280                                                                spip_log('Email correctement envoyer a '.$email, 'alertes'._LOG_INFO); 
281                                                        }else{
282                                                                //Email non envoyé. On log.
283                                                                spip_log('Echec de l\'envoie d\'email a '.$email, 'alertes'._LOG_ERREUR); 
284                                                        }
285                                                }                                       
286                                        }
287                                }
288                        }
289                }
290        }
291        return $flux;
292}
293
294
295?>
Note: See TracBrowser for help on using the repository browser.