source: spip-zone/_plugins_/alertes/trunk/alertes_pipelines.php @ 101473

Last change on this file since 101473 was 101473, checked in by teddy.spip@…, 3 years ago

Début de refonte du plugin. On passe en v2.

  • On peut maintenant voir depuis le BO le nombre d'abonnement aux alertes ;
  • On peut s'abonner depuis l'espace privé sur les rubriques et secteurs enregistrés dans la config ;
  • On crée un fichier d'action pour ne pas modifier et casser supprimer_alerte.
File size: 15.2 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")) {
11        return;
12}
13
14/*** Appel des CSS ***/
15function alertes_insert_head_css($flux) {
16        include_spip('inc/utils');
17        include_spip('inc/filtres');
18        $css = find_in_path("css/alertes.css");
19        $flux .= "<link rel='stylesheet' type='text/css' media='all' href='" . direction_css($css) . "' />\n";
20
21        return $flux;
22}
23
24/*** Tache CRON pour l'envoie différé des alertes ***/
25function alertes_taches_generales_cron($taches_generales) {
26        //Récuperation de la configuration
27        include_spip('inc/config');
28        $a = lire_config('config_alertes');
29        if (is_array($a) AND intval($a['intervalle_cron']) > 1) {
30                $taches_generales['alertes'] = 60*intval($a['intervalle_cron']); // toutes les X minutes
31        }
32
33        return $taches_generales;
34}
35
36/**
37 * Alertes : envoie d'email lors de la publication d'un article
38 * Attention à son utilisation avec le plugin Notifications qui utilise le pipeline notifications_destinataires.
39 *
40 * @param array $flux
41 *
42 * @return array
43 */
44function alertes_notifications_destinataires($flux) {
45        $quoi = $flux['args']['quoi'];
46        $options = $flux['args']['options'];
47        $date_pour_envoi = $options['date'];
48        //Récuperation de la configuration
49        include_spip('inc/config');
50        $a = lire_config('config_alertes');
51        //Est-ce que Accès restreint est activé ?
52        $plugins = lire_config('plugin');
53        if (is_array($plugins['ACCESRESTREINT'])) {
54                $acces_restreint = true;
55        } else {
56                $acces_restreint = false;
57        }
58        //Publication d'article : à ajouter aux alertes des abonnés
59        if ($quoi == 'instituerarticle' AND $options['statut'] == 'publie' AND is_array($a)) {
60                //Seulement si alertes actives
61                if ($a['activer_alertes'] == 'oui') {
62                        $emails = array();
63                        $id_article = $flux['args']['id'];
64                        include_spip('base/abstract_sql');
65                        //Mots clefs abonnables
66                        if ($a['groupes']) {
67                                $mots = sql_select('mot.id_mot, mot.id_groupe', 'spip_mots AS mot, spip_mots_liens AS ma',
68                                        'ma.id_objet = ' . $id_article . ' AND ma.objet ="article" AND ma.id_mot = mot.id_mot AND mot.id_groupe IN(' . $a['groupes'] . ')');
69                                while ($mot = sql_fetch($mots)) {
70                                        //Qui est abonné à ce mot ?
71                                        $abonnes = sql_select('id_auteur', 'spip_alertes',
72                                                'id_objet = ' . $mot['id_mot'] . ' AND objet = "mot"');
73                                        while ($abonne = sql_fetch($abonnes)) {
74                                                //L'auteur existe-t-il et a-t-il un email ?
75                                                if ($verif = sql_select('id_auteur, email', 'spip_auteurs',
76                                                        'id_auteur= ' . $abonne['id_auteur'])
77                                                ) {
78                                                        while ($v = sql_fetch($verif)) {
79                                                                if (($v['email']) && ($v['id_auteur'])) {
80                                                                        if ($acces_restreint == true) {
81                                                                                $article_accessible = false; // On bloque de base puis on vérifie
82                                                                                //Recuperation des zones de l'auteur
83                                                                                if ($zones = sql_select("id_zone", "spip_zones_liens",
84                                                                                        "id_objet = " . $abonne['id_auteur'] . " AND objet='auteur'")
85                                                                                ) {
86                                                                                        while ($z = sql_fetch($zones)) {
87                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
88                                                                                                if ($restrict = sql_select("*",
89                                                                                                        "spip_articles AS art, spip_zones_liens AS zo",
90                                                                                                        "id_zone = " . $z['id_zone'] . " AND zo.objet='rubrique' AND art.id_article = " . $id_article . " AND art.id_rubrique = zo.id_objet")
91                                                                                                ) {
92                                                                                                        while ($r = sql_fetch($restrict)) {
93                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
94                                                                                                        }
95                                                                                                }
96                                                                                        }
97                                                                                }
98                                                                        } else {
99                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
100                                                                        }
101                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
102                                                                        if ($article_accessible == true) {
103                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
104                                                                        }
105                                                                }
106                                                                if ((!$v['email']) || ($v['email'] == '')) {
107                                                                        //Pas d'email, on enlève des listes
108                                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $v['id_auteur'])) {
109                                                                                spip_log('Effacement des auteurs sans emails le ' . date('Y-m-d H:i:s'),
110                                                                                        'alertes' . _LOG_INFO);
111                                                                        }
112                                                                }
113                                                        }
114                                                } else {
115                                                        //Retrait de l'auteur introuvable
116                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $abonne['id_auteur'])) {
117                                                                spip_log('Effacer des auteurs sans ID le ' . date('Y-m-d H:i:s'),
118                                                                        'alertes' . _LOG_INFO);
119                                                        }
120                                                }
121                                        }
122                                }
123                        }
124                        //Fin Mots-clefs abonnables
125
126                        //Secteurs abonnables
127                        if ($a['secteurs']) {
128                                $secteurs = sql_select('id_secteur', 'spip_articles',
129                                        'id_article = ' . $id_article . '  AND id_secteur IN(' . $a['secteurs'] . ')');
130                                while ($secteur = sql_fetch($secteurs)) {
131                                        //Qui est abonné à ce secteur ?
132                                        $abonnes = sql_select('id_auteur', 'spip_alertes',
133                                                'id_objet = ' . $secteur['id_secteur'] . ' AND objet = "secteur"');
134                                        while ($abonne = sql_fetch($abonnes)) {
135                                                //L'auteur existe-t-il et a-t-il un email ?
136                                                if ($verif = sql_select('id_auteur, email', 'spip_auteurs',
137                                                        'id_auteur= ' . $abonne['id_auteur'])
138                                                ) {
139                                                        while ($v = sql_fetch($verif)) {
140                                                                if (($v['email']) && ($v['id_auteur'])) {
141                                                                        if ($acces_restreint == true) {
142                                                                                $article_accessible = false; // On bloque de base puis on vérifie
143                                                                                //Recuperation des zones de l'auteur
144                                                                                if ($zones = sql_select("id_zone", "spip_zones_liens",
145                                                                                        "id_objet = " . $abonne['id_auteur'] . " AND objet='auteur'")
146                                                                                ) {
147                                                                                        while ($z = sql_fetch($zones)) {
148                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
149                                                                                                if ($restrict = sql_select("*",
150                                                                                                        "spip_articles AS art, spip_zones_liens AS zo",
151                                                                                                        "id_zone = " . $z['id_zone'] . " AND zo.objet='rubrique' AND art.id_article = " . $id_article . " AND art.id_rubrique = zo.id_objet")
152                                                                                                ) {
153                                                                                                        while ($r = sql_fetch($restrict)) {
154                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
155                                                                                                        }
156                                                                                                }
157                                                                                        }
158                                                                                }
159                                                                        } else {
160                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
161                                                                        }
162                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
163                                                                        if ($article_accessible == true) {
164                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
165                                                                        }
166                                                                }
167                                                                if ((!$v['email']) || ($v['email'] == '')) {
168                                                                        //Pas d'email, on enlève des listes
169                                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $v['id_auteur'])) {
170                                                                                spip_log('Effacer des auteurs sans email le ' . date('Y-m-d H:i:s'),
171                                                                                        'alertes' . _LOG_INFO);
172                                                                        }
173                                                                }
174                                                        }
175                                                } else {
176                                                        //Retrait de l'auteur introuvable
177                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $abonne['id_auteur'])) {
178                                                                spip_log('Effacer des auteurs sans ID le ' . date('Y-m-d H:i:s'),
179                                                                        'alertes' . _LOG_INFO);
180                                                        }
181                                                }
182                                        }
183                                }
184                        }
185                        //Fin secteurs abonnables
186
187                        //Rubriques abonnables
188                        if ($a['rubriques']) {
189                                $rubriques = sql_select('id_rubrique', 'spip_articles',
190                                        'id_article = ' . $id_article . ' AND id_rubrique IN(' . $a['rubriques'] . ')');
191                                while ($rubrique = sql_fetch($rubriques)) {
192                                        //Qui est abonné à cette rubrique ?
193                                        $abonnes = sql_select('id_auteur', 'spip_alertes',
194                                                'id_objet = ' . $rubrique['id_rubrique'] . ' AND objet = "rubrique"');
195                                        while ($abonne = sql_fetch($abonnes)) {
196                                                //L'auteur existe-t-il et a-t-il un email ?
197                                                if ($verif = sql_select('id_auteur, email', 'spip_auteurs',
198                                                        'id_auteur= ' . $abonne['id_auteur'])
199                                                ) {
200                                                        while ($v = sql_fetch($verif)) {
201                                                                if (($v['email']) && ($v['id_auteur'])) {
202                                                                        if ($acces_restreint == true) {
203                                                                                $article_accessible = false; // On bloque de base puis on vérifie
204                                                                                //Recuperation des zones de l'auteur
205                                                                                if ($zones = sql_select("id_zone", "spip_zones_liens",
206                                                                                        "id_objet = " . $abonne['id_auteur'] . " AND objet='auteur'")
207                                                                                ) {
208                                                                                        while ($z = sql_fetch($zones)) {
209                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
210                                                                                                if ($restrict = sql_select("*",
211                                                                                                        "spip_articles AS art, spip_zones_liens AS zo",
212                                                                                                        "id_zone = " . $z['id_zone'] . " AND zo.objet='rubrique' AND art.id_article = " . $id_article . " AND art.id_rubrique = zo.id_objet")
213                                                                                                ) {
214                                                                                                        while ($r = sql_fetch($restrict)) {
215                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
216                                                                                                        }
217                                                                                                }
218                                                                                        }
219                                                                                }
220                                                                        } else {
221                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
222                                                                        }
223                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
224                                                                        if ($article_accessible == true) {
225                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
226                                                                        }
227                                                                }
228                                                                if ((!$v['email']) || ($v['email'] == '')) {
229                                                                        //Pas d'email, on enlève des listes
230                                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $v['id_auteur'])) {
231                                                                                spip_log('Effacer des auteurs sans email le ' . date('Y-m-d H:i:s'),
232                                                                                        'alertes' . _LOG_INFO);
233                                                                        }
234                                                                }
235                                                        }
236                                                } else {
237                                                        //Retrait de l'auteur introuvable
238                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $abonne['id_auteur'])) {
239                                                                spip_log('Effacer des auteurs sans ID le ' . date('Y-m-d H:i:s'),
240                                                                        'alertes' . _LOG_INFO);
241                                                        }
242                                                }
243                                        }
244                                }
245                        }
246                        //Fin rubriques abonnables
247
248                        //Auteurs abonnables
249                        if ($a['auteurs']) {
250                                $auteurs = sql_select("id_auteur", "spip_auteurs_liens",
251                                        "id_objet = " . $id_article . "  AND objet='article'");
252                                while ($auteur = sql_fetch($auteurs)) {
253                                        //Qui est abonné à cet auteur ?
254                                        $abonnes = sql_select('id_auteur', 'spip_alertes',
255                                                'id_objet = ' . $auteur['id_auteur'] . ' AND objet = "auteur"');
256                                        while ($abonne = sql_fetch($abonnes)) {
257                                                //L'auteur existe-t-il et a-t-il un email ?
258                                                if ($verif = sql_select('id_auteur, email', 'spip_auteurs',
259                                                        'id_auteur= ' . $abonne['id_auteur'])
260                                                ) {
261                                                        while ($v = sql_fetch($verif)) {
262                                                                if (($v['email']) && ($v['id_auteur'])) {
263                                                                        if ($acces_restreint == true) {
264                                                                                $article_accessible = false; // On bloque de base puis on vérifie
265                                                                                //Recuperation des zones de l'auteur
266                                                                                if ($zones = sql_select("id_zone", "spip_zones_liens",
267                                                                                        "id_objet = " . $abonne['id_auteur'] . " AND objet='auteur'")
268                                                                                ) {
269                                                                                        while ($z = sql_fetch($zones)) {
270                                                                                                //Pour chacunes des zones de l'auteur, on regarde si l'article est dans une des rubriques auxquelles il a accès
271                                                                                                if ($restrict = sql_select("*",
272                                                                                                        "spip_articles AS art, spip_zones_liens AS zo",
273                                                                                                        "id_zone = " . $z['id_zone'] . " AND zo.objet='rubrique' AND art.id_article = " . $id_article . " AND art.id_rubrique = zo.id_objet")
274                                                                                                ) {
275                                                                                                        while ($r = sql_fetch($restrict)) {
276                                                                                                                $article_accessible = true; //Dès qu'on a une zone accessible, on passe à true
277                                                                                                        }
278                                                                                                }
279                                                                                        }
280                                                                                }
281                                                                        } else {
282                                                                                $article_accessible = true; // Sans accès restreint, c'est bon de base.
283                                                                        }
284                                                                        //Email, on stocke pour envoi, ssi l'article n'est pas restreint pour cet auteur
285                                                                        if ($article_accessible == true) {
286                                                                                $emails[$v['id_auteur']] = $v['email']; //A voir si ça évite les doublons
287                                                                        }
288                                                                }
289                                                                if ((!$v['email']) || ($v['email'] == '')) {
290                                                                        //Pas d'email, on enlève des listes
291                                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $v['id_auteur'])) {
292                                                                                spip_log('Effacer des auteurs sans email le ' . date('Y-m-d H:i:s'),
293                                                                                        'alertes' . _LOG_INFO);
294                                                                        }
295                                                                }
296                                                        }
297                                                } else {
298                                                        //Retrait de l'auteur introuvable
299                                                        if ($del = sql_delete('spip_alertes', 'id_auteur=' . $abonne['id_auteur'])) {
300                                                                spip_log('Effacer des auteurs sans ID le ' . date('Y-m-d H:i:s'),
301                                                                        'alertes' . _LOG_INFO);
302                                                        }
303                                                }
304                                        }
305                                }
306                        }
307                        //Fin auteurs abonnables
308
309                        // Maintenant, on gére l'envoi
310                        if (is_array($emails) AND sizeof($emails) > 0) {
311                                include_spip('inc/utils');
312                                //Mode CRON ou direct ? Mode CRON d'office si la configuration autorise les articles publié post-daté.
313                                if (($a['mode_envoi'] == 'cron') || ($GLOBALS['meta']['post_dates'] == 'oui')) {
314                                        // Mode CRON : on enregistre tout ça dans la table d'envois CRON dediée
315                                        foreach ($emails as $id_auteur => $email) {
316                                                $ins_cron = sql_insertq('spip_alertes_cron', array(
317                                                        'id_auteur' => $id_auteur,
318                                                        'id_objet' => $id_article,
319                                                        'objet' => 'article',
320                                                        'date_pour_envoi' => $date_pour_envoi,
321                                                ));
322                                        }
323
324                                } else {
325                                        //Mode direct (attention à la charge)
326                                        //Fonctions facteurs
327                                        include_spip('classes/facteur'); //dépendance Facteur
328                                        $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
329
330                                        foreach ($emails as $id_auteur => $email) {
331                                                //On construit le mail à partir de templates
332                                                $header_email = recuperer_fond("alertes/header-email-alerte",
333                                                        array('id_article' => $id_article, 'id_auteur' => $id_auteur));
334                                                $footer_email = recuperer_fond("alertes/footer-email-alerte",
335                                                        array('id_article' => $id_article, 'id_auteur' => $id_auteur));
336                                                $corps_email = recuperer_fond("alertes/corps-email-alerte",
337                                                        array('id_article' => $id_article, 'id_auteur' => $id_auteur));
338                                                $sujet = recuperer_fond("alertes/sujet-email-alerte", array(
339                                                        'id_article' => $id_article,
340                                                        'id_auteur' => $id_auteur,
341                                                ));  // Sujet du mail aussi en template (dangereux mais pratique si on veut le customiser). Doit renvoyer du texte brut
342                                                //On n'envoie que si on a un contenu (présumé dans le corps du mail
343                                                if ($corps_email) {
344                                                        //Envoi email via Facteur
345                                                        $html = $header_email . $corps_email . $footer_email;
346                                                        $texte = Facteur::html2text($html); //Version  texte
347                                                        $corps = array(
348                                                                'html' => $html,
349                                                                'texte' => $texte,
350                                                        );
351                                                        if ($ok = $envoyer_mail($email, $sujet, $corps)) {
352                                                                //Email envoyé. On log.
353                                                                spip_log('Email correctement envoyer a ' . $email, 'alertes' . _LOG_INFO);
354                                                        } else {
355                                                                //Email non envoyé. On log.
356                                                                spip_log('Echec de l\'envoie d\'email a ' . $email, 'alertes' . _LOG_ERREUR);
357                                                        }
358                                                }
359                                        }
360                                }
361                        }
362                }
363        }
364
365        return $flux;
366}
367
368function alertes_affiche_droite($flux) {
369        if (in_array($flux['args']['exec'], array('rubrique', 'auteur'))) {
370                $config = lire_config('config_alertes');
371                $contexte = array();
372                $contexte['objet'] = $flux['args']['exec'];
373                $_id_objet = id_table_objet($flux['args']['exec']);
374                $contexte['id_objet'] = $flux['args'][$_id_objet];
375                if (in_array($contexte['id_objet'], to_array($config[table_objet($flux['args']['exec'])]))) {
376                        $contexte['editable'] = true;
377                }
378                $flux['data'] = recuperer_fond('prive/squelettes/inclure/alertes', $contexte,
379                                array('ajax' => false)) . $flux['data'];
380        }
381
382        return $flux;
383}
Note: See TracBrowser for help on using the repository browser.