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

Last change on this file since 65614 was 65614, checked in by cedric@…, 7 years ago

Notification des forums : c'est du contenu html mis en forme par des raccourcis spip, le conserver intact pour l'envoyer dans un mail html plutot que le transformer en texte pour faire un mail texte puis re formater le mail en html par un wrapper qui perd des mises en forme.

On utilise le wrapper pour formater le mail directement en html, et on le fournit a la fonction notifications_envoyer_mails avec les bons arguments.
Si pas de plugin facteur, c'est le mail texte qui est utilisé, comme avant.

File size: 9.4 KB
Line 
1<?php
2/*
3 * Plugin Notifications
4 * (c) 2009 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 $quoi = $GLOBALS['notifications_post_edition'][$x['args']['table']]
43        ){
44                // repasser par l'entree principale
45                $notifications = charger_fonction('notifications', 'inc');
46                $notifications($quoi, $x['args']['id_objet'], array());
47        }
48
49        return $x;
50}
51
52/**
53 * Ajouter des destinataires dans une notification en lot
54 *
55 * @param array $flux
56 * @return array
57 */
58function notifications_notifications_destinataires($flux){
59        static $sent = array();
60        $quoi = $flux['args']['quoi'];
61        $options = $flux['args']['options'];
62
63        // proposition d'article prevenir les admins restreints
64        if ($quoi=='instituerarticle' AND $GLOBALS['notifications']['prevenir_admins_restreints']
65                AND $options['statut']=='prop' AND $options['statut_ancien']!='publie' // ligne a commenter si vous voulez prevenir de la publication
66        ){
67
68                $id_article = $flux['args']['id'];
69                include_spip('base/abstract_sql');
70                $t = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . intval($id_article));
71                $id_rubrique = $t['id_rubrique'];
72
73                while ($id_rubrique){
74                        $hierarchie[] = $id_rubrique;
75                        $res = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
76                        if (!$res){ // rubrique inexistante
77                                $id_rubrique = 0;
78                                break;
79                        }
80                        $id_parent = $res['id_parent'];
81                        $id_rubrique = $id_parent;
82                }
83                spip_log("Prop article > admin restreint de " . join(',', $hierarchie), 'notifications');
84
85                //les admins de la rub et de ses parents
86                $result_email = sql_select(
87                        "auteurs.email,auteurs.id_auteur,lien.id_objet as id_rubrique",
88                        "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur ",
89                        "lien.objet='rubrique' AND ".sql_in('lien.id_objet',sql_quote($hierarchie))." AND auteurs.statut='0minirezo'");
90
91                while ($qui = sql_fetch($result_email)){
92                        spip_log($options['statut'] . " article > admin restreint " . $qui['id_auteur'] . " de la rubrique" . $qui['id_rubrique'] . " prevenu", 'notifications');
93                        $flux['data'][] = $qui['email'];
94                }
95
96        }
97
98        // publication d'article : prevenir les auteurs
99        if ($quoi=='instituerarticle'
100                AND $GLOBALS['notifications']['prevenir_auteurs_articles']
101        ){
102                $id_article = $flux['args']['id'];
103
104
105                include_spip('base/abstract_sql');
106
107                // Qui va-t-on prevenir en plus ?
108                $result_email = sql_select(
109                        "auteurs.email",
110                        "spip_auteurs AS auteurs JOIN spip_auteurs_liens AS lien ON auteurs.id_auteur=lien.id_auteur",
111                        "lien.id_objet=".intval($id_article)." AND lien.objet='article'");
112
113                while ($qui = sql_fetch($result_email)){
114                        $flux['data'][] = $qui['email'];
115                }
116
117        }
118
119        // forum valide ou prive : prevenir les autres contributeurs du thread
120        if (($quoi=='forumprive' AND $GLOBALS['notifications']['thread_forum_prive'])
121                OR ($quoi=='forumvalide' AND $GLOBALS['notifications']['thread_forum'])
122        ){
123
124                $id_forum = $flux['args']['id'];
125
126                if ($t = $options['forum']
127                        OR $t = sql_fetsel("*", "spip_forum", "id_forum=" . intval($id_forum))
128                ){
129
130                        // Tous les participants a ce *thread*
131                        // TODO: proposer une case a cocher ou un lien dans le message
132                        // pour se retirer d'un troll (hack: replacer @ par % dans l'email)
133                        $s = sql_select("DISTINCT(email_auteur)", "spip_forum", "id_thread=" . intval($t['id_thread']) . " AND email_auteur != ''");
134                        while ($r = sql_fetch($s))
135                                $flux['data'][] = $r['email_auteur'];
136
137                        /*
138                        // 3. Tous les auteurs des messages qui precedent (desactive egalement)
139                        // (possibilite exclusive de la possibilite precedente)
140                        // TODO: est-ce utile, par rapport au thread ?
141                        else if (defined('_SUIVI_FORUMS_REPONSES')
142                        AND _SUIVI_FORUMS_REPONSES) {
143                                $id_parent = $id_forum;
144                                while ($r = spip_fetch_array(spip_query("SELECT email_auteur, id_parent FROM spip_forum WHERE id_forum=$id_parent AND statut='publie'"))) {
145                                        $tous[] = $r['email_auteur'];
146                                        $id_parent = $r['id_parent'];
147                                }
148                        }
149                        */
150                }
151        }
152
153        // Les moderateurs de forums public
154        if ($quoi=='forumposte' AND $GLOBALS['notifications']['moderateurs_forum']){
155                foreach (explode(',', $GLOBALS['notifications']['moderateurs_forum']) as $m){
156                        $flux['data'][] = $m;
157                }
158        }
159
160        // noter les envois de ce forum pour ne pas doublonner
161        if (in_array($quoi, array('forumposte', 'forumvalide', 'forumprive'))
162                AND $id = $flux['args']['id']
163        ){
164                if (isset($sent[$id])){
165                        $flux['data'] = array_diff($flux['data'], $sent[$id]);
166                } else {
167                        $sent[$id] = array();
168                }
169                $sent[$id] = array_merge($sent[$id], $flux['data']);
170        }
171
172        return $flux;
173}
174
175
176/**
177 * Pipeline notifications_envoyer_mails
178 * appele a chaque envoi de mails
179 * permet de gerer les contributeurs :
180 *  - inscription auto si activee
181 *  - url de suivi des forums
182 *
183 * @param array $flux
184 * @return array
185 */
186function notifications_notifications_envoyer_mails($flux){
187        if ($GLOBALS['notifications']['suivi']){
188
189                // ajouter un acces a la page de suivi
190                $url = url_absolue(generer_url_public('suivi', 'email=' . $flux['email']));
191                $flux['texte'] .= "\n\n" . _L('Gerer mes abonnements : ') . $url;
192
193                // ajouter les auteurs en base ?
194                // ici ou dans la page de suivi lorsqu'ils essayent vraiment de gerer
195                // leurs abonnements ?
196                // $a = notifications_creer_auteur($email);
197        }
198
199        return $flux;
200}
201
202
203/**
204 * Regarder si l'auteur est dans la base de donnees, sinon l'ajouter
205 * comme s'il avait demande a s'inscrire comme visiteur
206 * Pour l'historique il faut retrouver le nom de la personne,
207 * pour ca on va regarder dans les forums existants
208 * Si c'est la personne connectee, c'est plus facile
209 *
210 * @param string $email
211 * @return array|bool
212 */
213function notifications_creer_auteur($email){
214
215        include_spip('base/abstract_sql');
216        if (!$a = sql_fetsel('*', 'spip_auteurs', 'email=' . sql_quote($email))){
217                if ($GLOBALS['visiteur_session']['session_email']===$email
218                        AND isset($GLOBALS['visiteur_session']['session_nom'])
219                ){
220                        $nom = $GLOBALS['visiteur_session']['session_nom'];
221                } else {
222                        if ($b = sql_fetsel('auteur', 'spip_forum',
223                                'email_auteur=' . sql_quote($email) . ' AND auteur!=""',
224                                /* groupby */
225                                '', /* orderby */
226                                array('date_heure DESC'),
227                                /* limit */
228                                '1')
229                        ){
230                                $nom = $b['auteur'];
231                        } else {
232                                $nom = $email;
233                        }
234                }
235                // charger message_inscription()
236                if ($traiter = charger_fonction('traiter', 'formulaires/inscription', true)){
237                        // "pirater" les globals
238                        $_GET['nom_inscription'] = $nom;
239                        $_GET['email_inscription'] = $email;
240                        $a = $traiter('6forum', null);
241                }
242                if (!is_array($a)){
243                        spip_log("erreur sur la creation d'auteur: $a", 'notifications');
244                        next;
245                }
246        }
247
248        // lui donner un cookie_oubli s'il n'en a pas deja un
249        if (!isset($a['cookie_oubli'])){
250                include_spip('inc/acces'); # pour creer_uniqid
251                $a['cookie_oubli'] = creer_uniqid();
252                sql_updateq('spip_auteurs',
253                        array('cookie_oubli' => $a['cookie_oubli']),
254                        'id_auteur=' . $a['id_auteur']
255                );
256        }
257
258        return $a;
259}
260
261/**
262 * Pretraiter le mail/sujet quand il est au format html
263 * pour la fonction notifications_envoyer_mails qui ne sait traiter que les mails html
264 *
265 * @param string $email
266 * @param $texte_ou_html
267 */
268function notifications_envoyer_mails_texte_ou_html($email, $texte_ou_html){
269        $texte_ou_html = trim($texte_ou_html);
270
271        // tester si le mail est deja en html
272        if (substr($texte_ou_html,0,1)=="<"
273          AND substr($texte_ou_html,-1,1)==">"
274          AND stripos($texte_ou_html,"</html>")!==false){
275
276                // dans ce cas on ruse un peu : extraire le sujet du title
277                $sujet = "";
278                if (preg_match(",<title>(.*)</title>,Uims",$texte_ou_html,$m))
279                        $sujet = $m[1];
280
281                // et envoyer un content-type pour envoyer_mail
282                return notifications_envoyer_mails($email, $texte_ou_html, $sujet, "","Content-Type: text/html\n");
283        }
284        else
285                // texte brut, on passe
286                return notifications_envoyer_mails($email, $texte_ou_html);
287}
288
289/* TODO
290        // Envoyer un message de bienvenue/connexion au posteur du forum,
291        // dans le cas ou il ne s'est pas authentifie
292        // Souci : ne pas notifier comme ca si on est deja present dans le thread
293        // (eviter d'avoir deux notificaitons pour ce message qu'on a, dans 99,99%
294        // des cas, poste nous-memes !)
295        if (strlen(trim($t['email_auteur']))
296        AND email_valide($t['email_auteur'])
297        AND !$GLOBALS['visiteur_session']['id_auteur']) {
298                $msg = Notifications_jeuneposteur($t, $email);
299                if ($t['email_auteur'] == 'fil@rezo.net')
300                        notifications_envoyer_mails($t['email_auteur'], $msg['body'],$msg['subject'])
301        }
302*/
303
304
305/*
306// Creer un mail pour les forums envoyes par quelqu'un qui n'est pas authentifie
307// en lui souhaitant la bienvenue et avec un lien suivi&p= de connexion au site
308function Notifications_jeuneposteur($t, $email) {
309        return array('test', 'coucou');
310}
311*/
312
313?>
Note: See TracBrowser for help on using the repository browser.