diff --git a/ecrire/action/instituer_forum.php b/ecrire/action/instituer_forum.php index bd65e6f95405c2c90cb2187b6d30d6713b218736..ebd2a5e29478cb999f923f5862c9131c554bc0da 100644 --- a/ecrire/action/instituer_forum.php +++ b/ecrire/action/instituer_forum.php @@ -52,6 +52,13 @@ function action_instituer_forum_dist() { include_spip('inc/indexation'); marquer_indexer ('spip_forum', $id_parent); } + + // Notifier de la publication du message, s'il etait 'prop' + if ($old=='prop' AND $statut=='publie') { + if ($notifications = charger_fonction('notifications', 'inc')) { + $notifications('forumvalide', $id_forum); + } + } } ?> diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php index 72f444e8e36642a09258e6bf52c2269f07f094dd..c4600629099d8014449137376171b6f5e6cc3d03 100644 --- a/ecrire/inc/autoriser.php +++ b/ecrire/inc/autoriser.php @@ -43,13 +43,11 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) { static $restreint = array(); // Qui ? auteur_session ? - if (!is_array($qui)) { - if (is_int($qui)) { - $qui = spip_fetch_array(spip_query( - "SELECT * FROM spip_auteurs WHERE id_auteur=".$qui)); - } else { - $qui = $GLOBALS['auteur_session']; - } + if ($qui === NULL) + $qui = $GLOBALS['auteur_session']; + elseif (!is_array($qui)) { + $qui = spip_fetch_array(spip_query( + "SELECT * FROM spip_auteurs WHERE id_auteur=".$qui)); } // Admins restreints, les verifier ici (pas generique mais...) @@ -65,7 +63,7 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) { $qui['restreint'] = $restreint[$qui['id_auteur']]; } - if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ?"); + if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ($qui[nom]) ?"); // Chercher une fonction d'autorisation explicite if ( @@ -99,7 +97,7 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) { ) $a = $f($faire,$type,intval($id),$qui,$opt); - if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id): ".($a?'OK':'niet')); + if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet')); return $a; } diff --git a/ecrire/inc/notifications.php b/ecrire/inc/notifications.php index 24f595963c2db0a0f765ccdefd2b16f262c3c59b..a42d479ef2c917f0d19d7f521cfb62cafc2ade84 100644 --- a/ecrire/inc/notifications.php +++ b/ecrire/inc/notifications.php @@ -151,7 +151,7 @@ function notifier_proposition_article($id_article) { // http://doc.spip.org/@email_notification_forum function email_notification_forum ($t, $email) { - // Rechercher la langue du destinataire + // Rechercher eventuellement la langue du destinataire if ($l = spip_fetch_array(spip_query("SELECT lang FROM spip_auteurs WHERE email=" . _q($email)))) lang_select($l['lang']); @@ -165,28 +165,36 @@ function email_notification_forum ($t, $email) { else { spip_log('inc-urls personnalise : ajoutez generer_url_forum() !'); if ($t['id_article']) - $url = generer_url_article($t['id_article']); + $url = generer_url_article($t['id_article']).'#'.$t['id_forum']; else $url = './'; } + if ($t['id_article']) { + $article = spip_fetch_array(spip_query("SELECT titre FROM spip_articles WHERE id_article="._q($t['id_article']))); + $titre = textebrut(typo($article['titre'])); + } + $sujet = "[" . entites_html(textebrut(typo($GLOBALS['meta']["nom_site"]))) . "] ["._T('forum_forum')."] ".typo($t['titre']); $parauteur = (strlen($t['auteur']) <= 2) ? '' : - (" " ._T('forum_par_auteur', array('auteur' => $t['auteur'])) . + (" " ._T('forum_par_auteur', array( + 'auteur' => $t['auteur']) + ) . ($t['email_auteur'] ? ' <' . $t['email_auteur'] . '>' : '')); + // TODO: squelettiser $corps = _T('form_forum_message_auto') . "\n\n" . - _T('forum_poste_par', array('parauteur' => $parauteur)). - "\n" - . _T('forum_ne_repondez_pas') - . "\n" + _T('forum_poste_par', array('parauteur' => $parauteur, + 'titre' => $titre)). + "\n\n" + . (($t['statut'] == 'publie') ? _T('forum_ne_repondez_pas')."\n" : '') . url_absolue($url) - . "\n\n\n".textebrut(typo($t['titre'])) - ."\n\n".textebrut(propre($t['texte'])) + . "\n\n\n** ".textebrut(typo($t['titre'])) + ."\n\n* ".textebrut(propre($t['texte'])) . "\n\n".$t['nom_site']."\n".$t['url_site']."\n"; if ($l) @@ -195,8 +203,12 @@ function email_notification_forum ($t, $email) { return array('subject' => $sujet, 'body' => $corps); } -// http://doc.spip.org/@notifications_forumposte_dist -function notifications_forumposte_dist($quoi, $id_forum) { + +// cette notification s'execute quand on valide un message 'prop'ose, +// dans ecrire/inc/forum_insert.php ; ici on va notifier ceux qui ne l'ont +// pas ete a la notification forumposte (sachant que les deux peuvent se +// suivre si le forum est valide directement ('pos' ou 'abo') +function notifications_forumvalide_dist($quoi, $id_forum) { $s = spip_query("SELECT * FROM spip_forum WHERE id_forum="._q($id_forum)); if (!$t = spip_fetch_array($s)) return; @@ -204,31 +216,39 @@ function notifications_forumposte_dist($quoi, $id_forum) { include_spip('inc/texte'); include_spip('inc/filtres'); include_spip('inc/mail'); + include_spip('inc/autoriser'); // Qui va-t-on prevenir ? $tous = array(); + $pasmoi = array(); + + // 1. Les auteurs de l'article ; si c'est un article, ceux qui n'ont + // pas le droit de le moderer (les autres l'ont recu plus tot) + if ($t['id_article'] + AND $GLOBALS['meta']['prevenir_auteurs'] == 'oui') { + $result = spip_query("SELECT auteurs.* FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article="._q($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur"); - // 1. Les auteurs de l'article ? - if ($GLOBALS['meta']['prevenir_auteurs'] == 'oui') { - $result = spip_query("SELECT auteurs.email FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article="._q($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur"); + while ($qui = spip_fetch_array($result)) { + if (!autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur'])) + $tous[] = $qui['email']; + else + $pasmoi[] = $qui['email']; - while ($r = spip_fetch_array($result)) - $tous[] = $r['email']; + } } - // 2. Tous les participants a ce *thread* (desactive pour l'instant, - // et ne fonctionne que pour les forums moderes a posteriori) + // 2. Tous les participants a ce *thread* (desactive pour l'instant) // TODO: proposer une case a cocher ou un lien dans le message // pour se retirer d'un troll (hack: replacer @ par % dans l'email) if (defined('_SUIVI_FORUM_THREAD') - AND _SUIVI_FORUM_THREAD - AND $t['statut'] == 'publie') { + AND _SUIVI_FORUM_THREAD) { $s = spip_query("SELECT DISTINCT(email_auteur) FROM spip_forum WHERE id_thread=".$t['id_thread']." AND email_auteur != ''"); while ($r = spip_fetch_array($s)) $tous[] = $r['email_auteur']; } + // 3. Tous les auteurs des messages qui precedent (desactive egalement) // (possibilite exclusive de la possibilite precedente) // TODO: est-ce utile, par rapport au thread ? @@ -242,7 +262,57 @@ function notifications_forumposte_dist($quoi, $id_forum) { } } - // 4. Les moderateurs definis par mes_options + // Nettoyer le tableau + // Ne pas ecrire au posteur du message, ni au moderateur qui active le mail, + // ni aux auteurs deja notifies precedemment + $destinataires = array(); + foreach ($tous as $m) { + if ($m = email_valide($m) + AND $m != trim($t['email_auteur']) + AND $m != $GLOBALS['auteur_session']['email'] + AND !in_array($m, $pasmoi)) + $destinataires[$m]++; + } + + // + // Envoyer les emails + // + foreach (array_keys($destinataires) as $email) { + $msg = email_notification_forum($t, $email); + envoyer_mail($email, $msg['subject'], $msg['body']); + } +} + + +// http://doc.spip.org/@notifications_forumposte_dist +function notifications_forumposte_dist($quoi, $id_forum) { + $s = spip_query("SELECT * FROM spip_forum WHERE id_forum="._q($id_forum)); + if (!$t = spip_fetch_array($s)) + return; + + include_spip('inc/texte'); + include_spip('inc/filtres'); + include_spip('inc/mail'); + include_spip('inc/autoriser'); + + + // Qui va-t-on prevenir ? + $tous = array(); + + // 1. Les auteurs de l'article (si c'est un article), mais + // seulement s'ils ont le droit de le moderer (les autres seront + // avertis par la notifications_forumvalide). + if ($t['id_article'] + AND $GLOBALS['meta']['prevenir_auteurs'] == 'oui') { + $result = spip_query("SELECT auteurs.* FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article="._q($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur"); + + while ($qui = spip_fetch_array($result)) { + if (autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur'])) + $tous[] = $qui['email']; + } + } + + // 2. Les moderateurs definis par mes_options // TODO: a passer en meta // define('_MODERATEURS_FORUM', 'email1,email2,email3'); if (defined('_MODERATEURS_FORUM')) @@ -263,12 +333,16 @@ function notifications_forumposte_dist($quoi, $id_forum) { // // Envoyer les emails // - // TODO: changer le corps selon le statut (auteur de l'article, moderateur, etc) foreach (array_keys($destinataires) as $email) { $msg = email_notification_forum($t, $email); envoyer_mail($email, $msg['subject'], $msg['body']); } + // Notifier les autres si le forum est valide + if ($t['statut'] == 'publie') { + $notifications = charger_fonction('notifications', 'inc'); + $notifications('forumvalide', $id_forum); + } } ?>