Skip to content
Extraits de code Groupes Projets
Valider a8cf1cc7 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

report de [15118] : notifications api

parent 37b2dffc
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -382,6 +382,13 @@ ecrire/maj/vieille_base/1927/serial.php -text ...@@ -382,6 +382,13 @@ ecrire/maj/vieille_base/1927/serial.php -text
ecrire/maj/vieille_base/1927/typedoc.php -text ecrire/maj/vieille_base/1927/typedoc.php -text
ecrire/maj/vieille_base/charger.php -text ecrire/maj/vieille_base/charger.php -text
ecrire/maj/vieille_base/create.php -text ecrire/maj/vieille_base/create.php -text
ecrire/notifications/article_propose.html -text
ecrire/notifications/article_publie.html -text
ecrire/notifications/article_valide.html -text
ecrire/notifications/forum_poste.html -text
ecrire/notifications/forumposte.php -text
ecrire/notifications/forumvalide.php -text
ecrire/notifications/instituerarticle.php -text
ecrire/plugins/afficher_liste.php -text ecrire/plugins/afficher_liste.php -text
ecrire/plugins/afficher_plugin.php -text ecrire/plugins/afficher_plugin.php -text
ecrire/plugins/afficher_repertoires.php -text ecrire/plugins/afficher_repertoires.php -text
......
...@@ -16,135 +16,215 @@ if (!defined("_ECRIRE_INC_VERSION")) return; ...@@ -16,135 +16,215 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// La fonction de notification de base, qui dispatche le travail // La fonction de notification de base, qui dispatche le travail
// http://doc.spip.org/@inc_notifications_dist // http://doc.spip.org/@inc_notifications_dist
function inc_notifications_dist($quoi, $id=0, $options=array()) { function inc_notifications_dist($quoi, $id=0, $options=array()) {
// charger les fichiers qui veulent ajouter des definitions // charger les fichiers qui veulent ajouter des definitions
// ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ... // ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ...
pipeline('notifications',array('args'=>array('quoi'=>$quoi,'id'=>$id,'options'=>$options))); pipeline('notifications',array('args'=>array('quoi'=>$quoi,'id'=>$id,'options'=>$options)));
if (function_exists($f = 'notifications_'.$quoi) if ($notification = charger_fonction($quoi,'notifications',true)) {
OR function_exists($f = $f.'_dist')) { spip_log("$notification($quoi,$id"
spip_log("$f($quoi,$id"
.($options?",".serialize($options):"") .($options?",".serialize($options):"")
.")"); .")",'notifications');
$f($quoi, $id, $options); $notification($quoi, $id, $options);
} }
} }
// Fonction appelee par divers pipelines /**
// http://doc.spip.org/@notifications_instituerarticle_dist * Nettoyage des emails avant un envoi
function notifications_instituerarticle_dist($quoi, $id_article, $options) { * on passe par reference pour la perf
*
* les emails liste par $eclure seront exclus de la liste
*
* @param array $emails
* @param array $exclure
*/
function notifications_nettoyer_emails(&$emails, $exclure = array()){
// filtrer et unifier
$emails = array_unique(array_filter(array_map('email_valide',array_map('trim', $emails))));
if ($exclure AND count($exclure)){
// nettoyer les exclusions d'abord
notifications_nettoyer_emails($exclure);
// faire un diff
$emails = array_diff($emails,$exclure);
}
}
// ne devrait jamais se produire /**
if ($options['statut'] == $options['statut_ancien']) { * Envoyer un email de notification
spip_log("statut inchange"); * Le sujet peut etre vide, dans ce cas il reprendra la premiere ligne non vide du texte
*
* @param array/string $emails
* @param string $texte
* @param string $sujet
*/
function notifications_envoyer_mails($emails,$texte,$sujet=""){
// rien a faire si pas de texte !
if (!strlen($texte))
return; return;
}
include_spip('inc/texte'); // si on ne specifie qu'un email, le mettre dans un tableau
if (!is_array($emails))
$emails = explode(',',$emails);
notifications_nettoyer_emails($emails);
// si le sujet est vide, extraire la premiere ligne du corps
if (!strlen($sujet)){
// nettoyer un peu les retours chariots
$texte = str_replace("\r\n", "\r", $texte);
$texte = str_replace("\r", "\n", $texte);
// decouper
$texte = explode("\n",trim($texte));
// extraire la premiere ligne
$sujet = array_shift($texte);
$texte = trim(implode("\n",$texte));
}
if ($options['statut'] == 'publie') $envoyer_mail = charger_fonction('envoyer_mail','inc');
notifier_publication_article($id_article); foreach($emails as $email){
// passer dans un pipeline qui permet un ajout eventuel
// (url de suivi des notifications par exemple)
$envoi = pipeline('notifications_envoyer_mails',array('email'=>$email,'sujet'=>$sujet,'texte'=>$texte));
$email = $envoi['email'];
$sujet = $envoi['sujet'];
$texte = $envoi['texte'];
if (function_exists('job_queue_add'))
job_queue_add('envoyer_mail', ">$email : $sujet", array($email, $sujet, $texte), 'inc/');
else
$envoyer_mail($email, $sujet, $texte);
}
if ($options['statut'] == 'prop' AND $options['statut_ancien'] != 'publie')
notifier_proposition_article($id_article);
} }
/**
* Notifier un evenement sur un article
* recupere le fond designe dans $modele,
* prend la premiere ligne comme sujet
* et l'interprete pour envoyer l'email
*
* @param int $id_article
* @param string $modele
*/
function email_notification_article($id_article, $modele) {
$envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email
return recuperer_fond($modele,array('id_article'=>$id_article));
}
// http://doc.spip.org/@extrait_article // Compatibilite, ne plus utiliser
function extrait_article($row) { // http://doc.spip.org/@notifier_publication_article
include_spip('inc/texte'); function notifier_publication_article($id_article) {
if ($GLOBALS['meta']["suivi_edito"] == "oui") {
$envoyer_mail = charger_fonction('envoyer_mail','inc'); $adresse_suivi = $GLOBALS['meta']["adresse_suivi"];
$titre = nettoyer_titre_email($row['titre']); $texte = email_notification_article($id_article, "notifications/article_publie");
$id_article = $row['id_article']; notifications_envoyer_mails($adresse_suivi, $texte);
$chapo = $row['chapo'];
$texte = $row['texte'];
$date = $row['date'];
$statut = $row['statut'];
$les_auteurs = "";
$result_auteurs = sql_select("nom", "spip_auteurs AS A, spip_auteurs_articles AS L", "L.id_article=$id_article AND A.id_auteur=L.id_auteur");
while ($row = sql_fetch($result_auteurs)) {
if ($les_auteurs) $les_auteurs .= ', ';
$les_auteurs .= trim(supprimer_tags(typo($row['nom'])));
} }
}
$extrait = "** $titre **\n"; // Compatibilite, ne plus utiliser
if ($les_auteurs) $extrait .= _T('info_les_auteurs_1', array('les_auteurs' => $les_auteurs)); // http://doc.spip.org/@notifier_proposition_article
if ($statut == 'publie') $extrait .= " "._T('date_fmt_nomjour_date', array('nomjour'=>nom_jour($date), 'date'=>affdate($date))); function notifier_proposition_article($id_article) {
$extrait .= "\n\n".textebrut(propre(couper("$chapo<p>$texte ", 700)))."\n\n"; if ($GLOBALS['meta']["suivi_edito"] == "oui") {
return $extrait; $adresse_suivi = $GLOBALS['meta']["adresse_suivi"];
$texte = email_notification_article($id_article, "notifications/article_propose");
notifications_envoyer_mails($adresse_suivi, $texte);
}
} }
/**
* Construitre l'email personalise de notification d'un forum
*
* @param array $t
* @param string $email
* @return string
*/
function email_notification_forum ($t, $email) {
static $contexte = array();
if(!isset($contexte[$t['id_forum']])){
$url = '';
$id_forum = $t['id_forum'];
if ($t['statut'] == 'prive') # forum prive
{
if ($t['id_article'])
$url = generer_url_ecrire('articles', 'id_article='.$t['id_article']).'#id'.$id_forum;
else if ($t['id_breve'])
$url = generer_url_ecrire('breves_voir', 'id_breve='.$t['id_breve']).'#id'.$id_forum;
else if ($t['id_syndic'])
$url = generer_url_ecrire('sites', 'id_syndic='.$t['id_syndic']).'#id'.$id_forum;
}
else if ($t['statut'] == 'privrac') # forum general
{
$url = generer_url_ecrire('forum').'#id'.$id_forum;
}
else if ($t['statut'] == 'privadm') # forum des admins
{
$url = generer_url_ecrire('forum_admin').'#id'.$id_forum;
}
else if ($t['statut'] == 'publie') # forum publie
{
$url = generer_url_entite($id_forum, 'forum');
}
else # forum modere, spam, poubelle direct ....
{
$url = generer_url_ecrire('controle_forum', "debut_id_forum=".$id_forum);
}
// http://doc.spip.org/@notifier_publication_article if (!$url) {
function notifier_publication_article($id_article) { spip_log("forum $id_forum sans referent",'notifications');
$url = './';
}
if ($t['id_article']) {
$titre = sql_getfetsel("titre", "spip_articles", "id_article=".sql_quote($t['id_article']));
}
if ($t['id_message']) {
$titre = sql_getfetsel("titre", "spip_messages", "id_message=".sql_quote($t['id_message']));
}
$envoyer_mail = charger_fonction('envoyer_mail','inc'); $t['titre_source'] = $titre;
$adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; $t['url'] = $url;
$nom_site_spip = nettoyer_titre_email($GLOBALS['meta']["nom_site"]);
$suivi_edito = $GLOBALS['meta']["suivi_edito"];
if ($suivi_edito == "oui") { // detecter les url des liens du forum
$row = sql_fetsel("*", "spip_articles", "id_article = $id_article"); // pour la moderation (permet de reperer les SPAMS avec des liens caches)
if ($row) { $links = array();
foreach ($t as $champ)
$links = $links + extraire_balises($champ,'a');
$links = extraire_attribut($links,'href');
$links = implode("\n",$links);
$t['liens'] = $links;
$l = lang_select($row['lang']); $contexte[$t['id_forum']] = $t;
}
$url = generer_url_entite_absolue($id_article, 'article'); $t = $contexte[$t['id_forum']];
// Rechercher eventuellement la langue du destinataire
if (NULL !== ($l = sql_getfetsel('lang', 'spip_auteurs', "email=" . sql_quote($email))))
$l = lang_select($l);
$titre = nettoyer_titre_email($row['titre']); $parauteur = (strlen($t['auteur']) <= 2) ? '' :
(" " ._T('forum_par_auteur', array(
'auteur' => $t['auteur'])
) .
($t['email_auteur'] ? ' <' . $t['email_auteur'] . '>' : ''));
$sujet = _T('info_publie_1', array('nom_site_spip' => $nom_site_spip, 'titre' => $titre)); $titre = textebrut(typo($t['titre_source']));
$courr = _T('info_publie_2')."\n\n"; $forum_poste_par = ($t['id_article']
? _T('forum_poste_par', array(
'parauteur' => $parauteur, 'titre' => $titre))
: $parauteur . ' (' . $titre . ')');
$nom = $GLOBALS['visiteur_session']['nom']; $t['par_auteur'] = $forum_poste_par;
$nom = trim(supprimer_tags(typo($nom)));
$courr .= _T('info_publie_01', array('titre' => $titre, 'connect_nom' => $nom))
. "\n\n"
. extrait_article($row)
. "-> " . $url
. "\n";
$envoyer_mail($adresse_suivi, $sujet, $courr);
if ($l) lang_select();
}
}
}
// http://doc.spip.org/@notifier_proposition_article $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email
function notifier_proposition_article($id_article) { $corps = recuperer_fond("notifications/forum_poste",$t);
$envoyer_mail = charger_fonction('envoyer_mail','inc');
$adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; if ($l)
$nom_site_spip = nettoyer_titre_email($GLOBALS['meta']["nom_site"]); lang_select();
$suivi_edito = $GLOBALS['meta']["suivi_edito"];
return $corps;
if ($suivi_edito == "oui") {
$row = sql_fetsel("*", "spip_articles", "id_article = $id_article");
if ($row) {
if ($l = $row['lang']) $l = lang_select($l);
$titre = nettoyer_titre_email($row['titre']);
$sujet = _T('info_propose_1', array('nom_site_spip' => $nom_site_spip, 'titre' => $titre));
$envoyer_mail($adresse_suivi,
$sujet,
_T('info_propose_2')
."\n\n"
. _T('info_propose_3', array('titre' => $titre))
."\n"
. _T('info_propose_4')
."\n"
. _T('info_propose_5')
."\n"
. generer_url_ecrire("articles", "id_article=$id_article", true)
. "\n\n\n"
. extrait_article($row)
);
if ($l) lang_select();
}
}
} }
?> ?>
\ No newline at end of file
[(#REM)
Squelette
(c) 2009 SPIP
Distribue sous licence GPL
][(#HTTP_HEADER{Content-type: text/plain[; charset=(#CHARSET)]})]
<BOUCLE_art(ARTICLES){id_article}{statut?}{tout}>
#SET{auteurs,#LESAUTEURS}
[(#VAL{info_propose_1}|_T{#ARRAY{nom_site_spip,#NOM_SITE_SPIP,titre,#TITRE}}|nettoyer_titre_email)]
<:info_propose_2:>
[(#VAL{info_propose_3}|_T{#ARRAY{titre,#TITRE}})]
<:info_propose_4:>
<:info_propose_5:>
[(#ID_ARTICLE|generer_url_entite{article,'','',0})]
[** (#TITRE) **][(#GET{auteurs}|oui)
[(#VAL{info_les_auteurs_1}|_T{#ARRAY{les_auteurs,#GET{auteurs}}})]][
(#VAL{date_fmt_nomjour_date}|_T{[(#ARRAY{'nomjour',[(#DATE|nom_jour)],'date',[(#DATE|affdate)]})]})]
[(#CHAPO|concat{#TEXTE}|couper{700}|textebrut)]
</BOUCLE_art>
#FILTRE{supprimer_tags|filtrer_entites|trim}
\ No newline at end of file
[(#REM)
Squelette
(c) 2009 SPIP
Distribue sous licence GPL
][(#HTTP_HEADER{Content-type: text/plain[; charset=(#CHARSET)]})]
<BOUCLE_art(ARTICLES){id_article}{statut?}{tout}>
#SET{auteurs,#LESAUTEURS}
[(#VAL{info_publie_1}|_T{#ARRAY{nom_site_spip,#NOM_SITE_SPIP,titre,#TITRE}}|nettoyer_titre_email)]
<:info_publie_2:>
[(#VAL{info_publie_01}|_T{#ARRAY{titre,#TITRE,connect_nom,#SESSION{nom}}})]
[** (#TITRE) **][(#GET{auteurs}|oui)
[(#VAL{info_les_auteurs_1}|_T{#ARRAY{les_auteurs,#GET{auteurs}}})]][
(#VAL{date_fmt_nomjour_date}|_T{[(#ARRAY{'nomjour',[(#DATE|nom_jour)],'date',[(#DATE|affdate)]})]})]
[(#CHAPO|concat{#TEXTE}|couper{700}|textebrut)]
[->(#URL_ARTICLE|url_absolue)]
</BOUCLE_art>
#FILTRE{supprimer_tags|filtrer_entites|trim}
\ No newline at end of file
[(#REM)
Squelette
(c) 2009 SPIP
Distribue sous licence GPL
][(#HTTP_HEADER{Content-type: text/plain[; charset=(#CHARSET)]})]
#INCLURE{fond=notifications/article_publie,env}
\ No newline at end of file
[(#REM)
Squelette
(c) 2009 SPIP
Distribue sous licence GPL
][(#HTTP_HEADER{Content-type: text/plain[; charset=(#CHARSET)]})]
[[(#NOM_SITE_SPIP|textebrut)]] [<:forum_forum:>][ (#TITRE|nettoyer_titre_email)]
<:form_forum_message_auto:>
[(#ENV{par_auteur})
][
(#STATUT|=={publie}|oui)<:forum_ne_repondez_pas:>][
(#STATUT|=={spam}|oui) (SPAM)][
(#ENV{url}|url_absolue)]
** #TITRE **[
(#TEXTE|textebrut)
][
#NOM_SITE
(#ENV{url_site})][
----
(#LIENS)]
#FILTRE{supprimer_tags|filtrer_entites|trim}
\ No newline at end of file
<?php
/*
* Plugin Notifications
* (c) 2009 SPIP
* Distribue sous licence GPL
*
*/
/**
* cette notification s'execute quand un message est poste,
*
* @param string $quoi
* @param int $id_forum
*/
function notifications_forumposte_dist($quoi, $id_forum, $options) {
$t = sql_fetsel("*", "spip_forum", "id_forum=".intval($id_forum));
if (!$t)
return;
// plugin notification si present
$prevenir_auteurs = isset($GLOBALS['notifications']['prevenir_auteurs']) AND $GLOBALS['notifications']['prevenir_auteurs'];
// sinon voie normale
if ($t['id_article'] AND !$prevenir_auteurs){
$s = sql_getfetsel('accepter_forum','spip_articles',"id_article=" . $t['id_article']);
if (!$s) $s = substr($GLOBALS['meta']["forums_publics"],0,3);
$prevenir_auteurs = (strpos(@$GLOBALS['meta']['prevenir_auteurs'],",$s,")!==false
OR @$GLOBALS['meta']['prevenir_auteurs'] === 'oui'); // compat
}
include_spip('inc/texte');
include_spip('inc/filtres');
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 $prevenir_auteurs) {
$result = sql_select("auteurs.*","spip_auteurs AS auteurs, spip_auteurs_articles AS lien","lien.id_article=".intval($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
while ($qui = sql_fetch($result)) {
if ($qui['email'] AND autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
$tous[] = $qui['email'];
}
}
$options['forum'] = $t;
$destinataires = pipeline('notifications_destinataires',
array(
'args'=>array('quoi'=>$quoi,'id'=>$id_forum,'options'=>$options)
,
'data'=>$tous)
);
// Nettoyer le tableau
// Ne pas ecrire au posteur du message !
notifications_nettoyer_emails($destinataires,array($t['email_auteur']));
//
// Envoyer les emails
//
foreach ($destinataires as $email) {
$texte = email_notification_forum($t, $email);
notifications_envoyer_mails($email, $texte);
}
// Notifier les autres si le forum est valide
// est-ce que cet appel devrait bien etre la ?
if ($t['statut'] == 'publie') {
$notifications = charger_fonction('notifications', 'inc');
$notifications('forumvalide', $id_forum);
}
}
?>
\ No newline at end of file
<?php
/*
* Plugin Notifications
* (c) 2009 SPIP
* Distribue sous licence GPL
*
*/
/**
* 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')
* http://doc.spip.org/@notifications_forumvalide_dist
*
* @param string $quoi
* @param int $id_forum
*/
function notifications_forumvalide_dist($quoi, $id_forum, $options) {
$t = sql_fetsel("*", "spip_forum", "id_forum=".intval($id_forum));
if (!$t
// forum sur un message prive : pas de notification ici (cron)
OR @$t['statut'] == 'perso')
return;
// plugin notification si present
$prevenir_auteurs = isset($GLOBALS['notifications']['prevenir_auteurs']) AND $GLOBALS['notifications']['prevenir_auteurs'];
// sinon voie normale
if ($t['id_article'] AND !$prevenir_auteurs){
$s = sql_getfetsel('accepter_forum','spip_articles',"id_article=" . $t['id_article']);
if (!$s) $s = substr($GLOBALS['meta']["forums_publics"],0,3);
$prevenir_auteurs = (strpos(@$GLOBALS['meta']['prevenir_auteurs'],",$s,")!==false
OR @$GLOBALS['meta']['prevenir_auteurs'] === 'oui'); // compat
}
include_spip('inc/texte');
include_spip('inc/filtres');
include_spip('inc/autoriser');
// Qui va-t-on prevenir ?
$tous = array();
// Ne pas ecrire au posteur du message, ni au moderateur qui valide le forum,
$pasmoi = array($t['email_auteur'],$GLOBALS['visiteur_session']['email']);
// 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 $prevenir_auteurs) {
$result = sql_select("auteurs.*","spip_auteurs AS auteurs, spip_auteurs_articles AS lien","lien.id_article=".intval($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
while ($qui = sql_fetch($result)) {
if (!autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
$tous[] = $qui['email'];
else
// Ne pas ecrire aux auteurs deja notifies precedemment
$pasmoi[] = $qui['email'];
}
}
$options['forum'] = $t;
$destinataires = pipeline('notifications_destinataires',
array(
'args'=>array('quoi'=>$quoi,'id'=>$id_forum,'options'=>$options)
,
'data'=>$tous)
);
// Nettoyer le tableau
// en enlevant les exclus
notifications_nettoyer_emails($destinataires,$pasmoi);
//
// Envoyer les emails
//
foreach ($destinataires as $email) {
$texte = email_notification_forum($t, $email);
notifications_envoyer_mails($email, $texte);
}
}
?>
<?php
/*
* Plugin Notifications
* (c) 2009 SPIP
* Distribue sous licence GPL
*
*/
// Fonction appelee par divers pipelines
// http://doc.spip.org/@notifications_instituerarticle_dist
function notifications_instituerarticle_dist($quoi, $id_article, $options) {
// ne devrait jamais se produire
if ($options['statut'] == $options['statut_ancien']) {
spip_log("statut inchange",'notifications');
return;
}
include_spip('inc/texte');
$modele = "";
if ($options['statut'] == 'publie') {
if ($GLOBALS['meta']["post_dates"]=='non'
AND strtotime($options['date'])>time())
$modele = "notifications/article_valide";
else
$modele = "notifications/article_publie";
}
if ($options['statut'] == 'prop' AND $options['statut_ancien'] != 'publie')
$modele = "notifications/article_propose";
if ($modele){
$destinataires = array();
if ($GLOBALS['meta']["suivi_edito"] == "oui")
$destinataires = explode(',',$GLOBALS['meta']["adresse_suivi"]);
$destinataires = pipeline('notifications_destinataires',
array(
'args'=>array('quoi'=>$quoi,'id'=>$id_article,'options'=>$options)
,
'data'=>$destinataires)
);
$texte = email_notification_article($id_article, $modele);
notifications_envoyer_mails($destinataires, $texte);
}
}
?>
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter