source: spip-zone/_plugins_/notifications/trunk/notifications_pipelines.php @ 94843

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

Notice PHP en moins.

File size: 13.3 KB
Line 
1<?php
2/*
3 * Plugin Notifications
4 * (c) 2009-2012 SPIP
5 * Distribue sous licence GPL
6 *
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11/**
12 *
13 * Declarer la tache cron de notification lente (messagerie de l'espace prive)
14 * @param array $taches_generales
15 * @return array
16 */
17function notifications_taches_generales_cron($taches_generales){
18        $taches_generales['notifications'] = 60*10; // toutes les 10 minutes
19        return $taches_generales;
20}
21
22$GLOBALS['notifications_post_edition']['spip_signatures'] = "petitionsignee";
23
24// Initialise les reglages sous forme de tableau
25function notifications_go($x){
26        if (!is_array($GLOBALS['notifications'] = @unserialize($GLOBALS['meta']['notifications'])))
27                $GLOBALS['notifications'] = array();
28        return $x;
29}
30
31
32/**
33 * Pipeline post-edition
34 * pour permettre de se pluger sur une modification en base non notifiee par defaut
35 *
36 * @param array $x
37 * @return array
38 */
39function notifications_post_edition($x){
40        #spip_log($x,'notifications');
41        if (isset($x['args']['table'])
42                AND isset($GLOBALS['notifications_post_edition'][$x['args']['table']])
43                AND $quoi = $GLOBALS['notifications_post_edition'][$x['args']['table']]
44        ){
45                // repasser par l'entree principale
46                $notifications = charger_fonction('notifications', 'inc');
47                $notifications($quoi, $x['args']['id_objet'], array());
48        }
49
50        return $x;
51}
52
53/**
54 * Ajouter des destinataires dans une notification en lot
55 *
56 * @param array $flux
57 * @return array
58 */
59function notifications_notifications_destinataires($flux){
60        static $sent = array();
61        $quoi = $flux['args']['quoi'];
62        $options = $flux['args']['options'];
63
64        // proposition d'article prevenir les admins restreints pour le passage de proposé à publié
65        if ($quoi=='instituerarticle' AND $GLOBALS['notifications']['prevenir_admins_restreints']
66                AND $options['statut']=='prop' AND $options['statut_ancien']!='publie' // ligne a commenter si vous voulez prevenir de la publication
67        ){
68
69                $id_article = $flux['args']['id'];
70                include_spip('base/abstract_sql');
71                $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
72                $id_rubrique = $t['id_rubrique'];
73                if ($GLOBALS['notifications']['limiter_rubriques']){
74                        $limites = $GLOBALS['notifications']['limiter_rubriques'];
75                        $limiter_rubriques = explode(",",$limites);
76                } else {
77                        $limiter_rubriques = array($id_rubrique);
78                }
79
80                if (in_array($id_rubrique,$limiter_rubriques))
81                {
82                        while ($id_rubrique){
83                                $hierarchie[] = $id_rubrique;
84                                $res = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
85                                if (!$res){ // rubrique inexistante
86                                        $id_rubrique = 0;
87                                        break;
88                                }
89                                $id_parent = $res['id_parent'];
90                                $id_rubrique = $id_parent;
91                        }
92                        spip_log("Prop article > admin restreint de " . join(',', $hierarchie), 'notifications');
93
94                        //les admins de la rub et de ses parents
95                        $result_email = sql_select(
96                                "auteurs.email,auteurs.id_auteur,lien.id_objet as id_rubrique",
97                                "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur ",
98                                "lien.objet='rubrique' AND ".sql_in('lien.id_objet',sql_quote($hierarchie))." AND auteurs.statut='0minirezo'");
99
100                        while ($qui = sql_fetch($result_email)){
101                                spip_log($options['statut'] . " article > admin restreint " . $qui['id_auteur'] . " de la rubrique" . $qui['id_rubrique'] . " prevenu", 'notifications');
102                                $flux['data'][] = $qui['email'];
103                        }
104                }
105
106        }
107
108        // notification d'article pour le passage de proposé à refusé
109        if ($quoi=='instituerarticle' AND $GLOBALS['notifications']['prevenir_auteurs_articles_refus'] 
110                AND $options['statut']=='refuse' AND in_array($options['statut_ancien'], array('prop','publie')) // ligne a commenter si vous voulez prevenir de la publication
111        ){
112
113                $id_article = $flux['args']['id'];
114                include_spip('base/abstract_sql');
115                $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
116                $id_rubrique = $t['id_rubrique'];
117                if ($GLOBALS['notifications']['limiter_rubriques']){
118                        $limites = $GLOBALS['notifications']['limiter_rubriques'];
119                        $limiter_rubriques = explode(",",$limites);
120                } else {
121                        $limiter_rubriques = array($id_rubrique);
122                }
123
124                if (in_array($id_rubrique,$limiter_rubriques))
125                {
126                        while ($id_rubrique){
127                                $hierarchie[] = $id_rubrique;
128                                $res = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
129                                if (!$res){ // rubrique inexistante
130                                        $id_rubrique = 0;
131                                        break;
132                                }
133                                $id_parent = $res['id_parent'];
134                                $id_rubrique = $id_parent;
135                        }
136                        spip_log("Refuse article > admin restreint de " . join(',', $hierarchie), 'notifications');
137
138                        //les admins de la rub et de ses parents
139                        $result_email = sql_select(
140                                "auteurs.email,auteurs.id_auteur,lien.id_objet as id_rubrique",
141                                "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur ",
142                                "lien.objet='rubrique' AND ".sql_in('lien.id_objet',sql_quote($hierarchie))." AND auteurs.statut='0minirezo'");
143
144                        while ($qui = sql_fetch($result_email)){
145                                spip_log($options['statut'] . " article > admin restreint " . $qui['id_auteur'] . " de la rubrique" . $qui['id_rubrique'] . " prevenu", 'notifications');
146                                $flux['data'][] = $qui['email'];
147                        }
148                }
149
150        }
151
152        // publication d'article : prevenir les auteurs
153        if ($quoi=='instituerarticle'
154                AND $GLOBALS['notifications']['prevenir_auteurs_articles']
155        ){
156                $id_article = $flux['args']['id'];
157                include_spip('base/abstract_sql');
158                $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
159                $id_rubrique = $t['id_rubrique'];
160                if ($GLOBALS['notifications']['limiter_rubriques']){
161                        $limites = $GLOBALS['notifications']['limiter_rubriques'];
162                        $limiter_rubriques = explode(",",$limites);
163                } else {
164                        $limiter_rubriques = array($id_rubrique);
165                }
166
167                if (in_array($id_rubrique,$limiter_rubriques))
168                {
169
170                        include_spip('base/abstract_sql');
171
172                        // Qui va-t-on prevenir en plus ?
173                        $result_email = sql_select(
174                                "auteurs.email",
175                                "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur",
176                                "lien.id_objet=".intval($id_article)." AND lien.objet='article'");
177
178                        while ($qui = sql_fetch($result_email)){
179                                $flux['data'][] = $qui['email'];
180                                spip_log($options['statut'] . " article > auteur " . $qui['id_auteur'] . " prevenu", 'notifications');
181                        }
182                }
183
184        }
185        //publication d'article : ne pas prévenir l'auteur s'il est le validateur
186        if ($quoi == "instituerarticle" and $GLOBALS['notifications']['pas_prevenir_publieur']){
187                $publieur_email=$GLOBALS["visiteur_session"]["email"];
188                if(($key = array_search($publieur_email,$flux['data'])) !== false){
189                        unset($flux['data'][$key]);
190                }       
191        }
192        // forum valide ou prive : prevenir les autres contributeurs du thread ou ceux qui ont déjà répondu à l'article
193        if (($quoi=='forumprive' AND $GLOBALS['notifications']['thread_forum_prive'])
194                OR ($quoi=='forumvalide' AND ($GLOBALS['notifications']['thread_forum'] OR $GLOBALS['notifications']['forum'] OR $GLOBALS['notifications']['forum_article']))
195        ){
196
197                $id_forum = $flux['args']['id'];
198                if ($t = $options['forum']
199                        OR $t = sql_fetsel("*", "spip_forum", "id_forum=" . intval($id_forum))
200                ){
201           
202                        // Tous les participants a ce *thread*, abonnes
203                        // on prend les emails parmi notification_email (prioritaire si rempli) email_auteur ou email de l'auteur qd id_auteur connu
204                        // note : on exclut les forums refusé ou marqué comme spam
205                        $s = sql_select("F.email_auteur, F.notification_email, A.email",
206                                "spip_forum AS F LEFT JOIN spip_auteurs AS A ON F.id_auteur=A.id_auteur",
207                                "notification=1 AND id_thread=" . intval($t['id_thread']) . " AND (email_auteur != '' OR notification_email != '' OR A.email IS NOT NULL) AND F.statut NOT IN ('off','spam')") ;
208            // Eventuellement tout ceux qui ont répondu à cet article
209            if ($GLOBALS['notifications']['forum_article']){
210                $s = sql_select("F.email_auteur, F.notification_email, A.email",
211                                "spip_forum AS F LEFT JOIN spip_auteurs AS A ON F.id_auteur=A.id_auteur",
212                                "notification=1 AND objet=".sql_quote($t['objet'])." AND id_objet=" . intval($t['id_objet']) . " AND (email_auteur != '' OR notification_email != '' OR A.email IS NOT NULL) AND F.statut NOT IN ('off','spam')");               
213                }
214                        while ($r = sql_fetch($s)){
215                                if ($r['notification_email'])
216                                        $flux['data'][] = $r['notification_email'];
217                                elseif($r['email_auteur'])
218                                        $flux['data'][] = $r['email_auteur'];
219                                elseif($r['email'])
220                                        $flux['data'][] = $r['email'];
221                        }
222
223                }
224        }
225
226        // Les moderateurs de forums public
227        if ($quoi=='forumposte' AND $GLOBALS['notifications']['moderateurs_forum']){
228                foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum']) as $m){
229                        $flux['data'][] = $m;
230                }
231        }
232
233        // noter les envois de ce forum pour ne pas doublonner
234        if (in_array($quoi, array('forumposte', 'forumvalide', 'forumprive'))
235                AND $id = $flux['args']['id']
236        ){
237                if (isset($sent[$id])){
238                        $flux['data'] = array_diff($flux['data'], $sent[$id]);
239                } else {
240                        $sent[$id] = array();
241                }
242                $sent[$id] = array_merge($sent[$id], $flux['data']);
243        }
244
245        return $flux;
246}
247
248
249/**
250 * Pipeline notifications_envoyer_mails
251 * appele a chaque envoi de mails
252 * permet de gerer les contributeurs :
253 *  - inscription auto si activee
254 *  - url de suivi des forums
255 *
256 * @param array $flux
257 * @return array
258 */
259/*
260function notifications_notifications_envoyer_mails($flux){
261        if ($GLOBALS['notifications']['suivi']){
262
263                // ajouter un acces a la page de suivi
264                $url = url_absolue(generer_url_public('suivi', 'email=' . $flux['email']));
265                $flux['texte'] .= "\n\n" . _L('Gerer mes abonnements : ') . $url;
266
267                // ajouter les auteurs en base ?
268                // ici ou dans la page de suivi lorsqu'ils essayent vraiment de gerer
269                // leurs abonnements ?
270                // $a = notifications_creer_auteur($email);
271        }
272
273        return $flux;
274}
275*/
276
277function notifications_url_suivi($email){
278        if (!$email) return "";
279        include_spip("inc/securiser_action");
280        $key = calculer_cle_action("abonner_notifications $email");
281        $url = url_absolue(generer_url_public('notifications', "email=$email&key=$key"));
282        return $url;
283}
284
285/**
286 * Regarder si l'auteur est dans la base de donnees, sinon l'ajouter
287 * comme s'il avait demande a s'inscrire comme visiteur
288 * Pour l'historique il faut retrouver le nom de la personne,
289 * pour ca on va regarder dans les forums existants
290 * Si c'est la personne connectee, c'est plus facile
291 *
292 * @param string $email
293 * @return array|bool
294 */
295function notifications_creer_auteur($email){
296
297        include_spip('base/abstract_sql');
298        if (!$a = sql_fetsel('*', 'spip_auteurs', 'email=' . sql_quote($email))){
299                if ($GLOBALS['visiteur_session']['session_email']===$email
300                        AND isset($GLOBALS['visiteur_session']['session_nom'])
301                ){
302                        $nom = $GLOBALS['visiteur_session']['session_nom'];
303                } else {
304                        if ($b = sql_fetsel('auteur', 'spip_forum',
305                                'email_auteur=' . sql_quote($email) . ' AND auteur!=""',
306                                /* groupby */
307                                '', /* orderby */
308                                array('date_heure DESC'),
309                                /* limit */
310                                '1')
311                        ){
312                                $nom = $b['auteur'];
313                        } else {
314                                $nom = $email;
315                        }
316                }
317                // charger message_inscription()
318                if ($traiter = charger_fonction('traiter', 'formulaires/inscription', true)){
319                        // "pirater" les globals
320                        $_GET['nom_inscription'] = $nom;
321                        $_GET['email_inscription'] = $email;
322                        $a = $traiter('6forum', null);
323                }
324                if (!is_array($a)){
325                        spip_log("erreur sur la creation d'auteur: $a", 'notifications');
326                        next;
327                }
328        }
329
330        // lui donner un cookie_oubli s'il n'en a pas deja un
331        if (!isset($a['cookie_oubli'])){
332                include_spip('inc/acces'); # pour creer_uniqid
333                $a['cookie_oubli'] = creer_uniqid();
334                sql_updateq('spip_auteurs',
335                        array('cookie_oubli' => $a['cookie_oubli']),
336                        'id_auteur=' . $a['id_auteur']
337                );
338        }
339
340        return $a;
341}
342
343/**
344 * Pretraiter le mail/sujet quand il est au format html
345 * pour la fonction notifications_envoyer_mails qui ne sait traiter que les mails html
346 *
347 * @param string $email
348 * @param $texte_ou_html
349 */
350function notifications_envoyer_mails_texte_ou_html($email, $texte_ou_html){
351        $texte_ou_html = trim($texte_ou_html);
352
353        // tester si le mail est deja en html
354        if (substr($texte_ou_html,0,1)=="<"
355          AND substr($texte_ou_html,-1,1)==">"
356          AND stripos($texte_ou_html,"</html>")!==false){
357
358                // dans ce cas on ruse un peu : extraire le sujet du title
359                $sujet = "";
360                if (preg_match(",<title>(.*)</title>,Uims",$texte_ou_html,$m))
361                        $sujet = $m[1];
362
363                // et envoyer un content-type pour envoyer_mail
364                return notifications_envoyer_mails($email, $texte_ou_html, $sujet, "","Content-Type: text/html\n");
365        }
366        else
367                // texte brut, on passe
368                return notifications_envoyer_mails($email, $texte_ou_html);
369}
370
371/* TODO
372        // Envoyer un message de bienvenue/connexion au posteur du forum,
373        // dans le cas ou il ne s'est pas authentifie
374        // Souci : ne pas notifier comme ca si on est deja present dans le thread
375        // (eviter d'avoir deux notificaitons pour ce message qu'on a, dans 99,99%
376        // des cas, poste nous-memes !)
377        if (strlen(trim($t['email_auteur']))
378        AND email_valide($t['email_auteur'])
379        AND !$GLOBALS['visiteur_session']['id_auteur']) {
380                $msg = Notifications_jeuneposteur($t, $email);
381                if ($t['email_auteur'] == 'fil@rezo.net')
382                        notifications_envoyer_mails($t['email_auteur'], $msg['body'],$msg['subject'])
383        }
384*/
385
386
387/*
388// Creer un mail pour les forums envoyes par quelqu'un qui n'est pas authentifie
389// en lui souhaitant la bienvenue et avec un lien suivi&p= de connexion au site
390function Notifications_jeuneposteur($t, $email) {
391        return array('test', 'coucou');
392}
393*/
394
395?>
Note: See TracBrowser for help on using the repository browser.