You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

408 lines
14 KiB

<?php
/**
* Plugin mailsubscribers
* (c) 2012 Cédric Morin
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function mailsubscribers_taches_generales_cron($taches) {
// a peu pres tous les jours mais en se decalant un peu
$taches['mailsubscribers_synchro_lists'] = 23 * 3600;
if (isset($GLOBALS['meta']['mailsubscriptions_update_segments'])){
$taches['mailsubscribers_update_segments'] = 90;
}
return $taches;
}
/**
* Ajouter un jeton unique sur chaque inscrit (sert aux signatures d'action)
*
* @param $flux
* @return mixed
*/
function mailsubscribers_pre_insertion($flux) {
if ($flux['args']['table'] == 'spip_mailsubscribers'
AND !isset($flux['data']['jeton'])
) {
include_spip("inc/acces");
$flux['data']['jeton'] = creer_uniqid();
include_spip("inc/mailsubscribers");
if (!isset($flux['data']['email'])) {
include_spip("inc/acces");
$flux['data']['email'] = creer_uniqid(); // eviter l'eventuel echec unicite sur email vide
}
}
return $flux;
}
/**
* Quand le statut de l'abonnement est change, tracer par qui (date, ip, #id si auteur loge, nom/email si en session)
* Permet d'opposer l'optin d'un internaute a son abonnement
* (et a contrario de tracer que l'abonnement n'a pas ete fait par lui si c'est le cas...)
*
* @param $flux
* @return mixed
*/
function mailsubscribers_pre_edition($flux) {
if ($flux['args']['table'] == 'spip_mailsubscribers'
AND $id_mailsubscriber = $flux['args']['id_objet']
) {
if ($flux['args']['action'] == 'instituer'
AND $statut_ancien = $flux['args']['statut_ancien']
AND isset($flux['data']['statut'])
AND $statut = $flux['data']['statut']
AND $statut != $statut_ancien
) {
include_spip('inc/mailsubscribers');
$email = sql_getfetsel('email', 'spip_mailsubscribers', "id_mailsubscriber=" . intval($id_mailsubscriber));
// on ne peut jamais passer en prepa, c'est un statut reserve a la creation
if ($statut == 'prepa' and !autoriser('superinstituer', 'mailsubscriber', $id_mailsubscriber)) {
unset($flux['data']['statut']);
}
// on ne peut jamais passer en prop, c'est un statut intermediaire automatique
if ($statut == 'prop' and !autoriser('superinstituer', 'mailsubscriber', $id_mailsubscriber)) {
unset($flux['data']['statut']);
}
// on ne peut jamais passer en valide que si on etait en prop
if ($statut == 'valide' and $statut_ancien !== 'prop' and !autoriser('superinstituer', 'mailsubscriber',
$id_mailsubscriber)
) {
unset($flux['data']['statut']);
} // un subscriber avec email obfusque ne peut que passer en poubelle ou refuse
elseif (mailsubscribers_test_email_obfusque($email) and !in_array($statut, array('poubelle', 'refuse'))) {
unset($flux['data']['statut']);
}
}
}
// changement de mail d'un auteur : faire suivre son inscription si l'adresse email est unique dans les auteurs
if ($flux['args']['table'] == 'spip_auteurs'
AND $id_auteur = $flux['args']['id_objet']
AND isset($flux['data']['email'])
AND $flux['data']['email']
) {
$old_email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
if ($old_email
AND !sql_countsel('spip_auteurs',
'email=' . sql_quote($old_email) . ' AND id_auteur<>' . intval($id_auteur) . ' AND statut<>' . sql_quote('5poubelle'))
) {
include_spip('action/editer_objet');
include_spip('inc/mailsubscribers');
if ($id_mailsubscriber = sql_getfetsel('id_mailsubscriber', 'spip_mailsubscribers',
'email=' . sql_quote($old_email))
) {
objet_modifier('mailsubscriber', $id_mailsubscriber, array('email' => $flux['data']['email']));
}
if ($id_mailsubscriber = sql_getfetsel('id_mailsubscriber', 'spip_mailsubscribers',
'email=' . sql_quote(mailsubscribers_obfusquer_email($old_email)))
) {
objet_modifier('mailsubscriber', $id_mailsubscriber,
array('email' => mailsubscribers_obfusquer_email($flux['data']['email'])));
}
}
}
return $flux;
}
/**
* Quand le statut de l'abonnement est change, tracer par qui (date, ip, #id si auteur loge, nom/email si en session)
* Permet d'opposer l'optin d'un internaute a son abonnement
* (et a contrario de tracer que l'abonnement n'a pas ete fait par lui si c'est le cas...)
*
* @param $flux
* @return mixed
*/
function mailsubscribers_post_edition($flux) {
if (
isset($flux['args']['table'])
AND $flux['args']['table'] == 'spip_mailsubscribers'
AND $id_mailsubscriber = $flux['args']['id_objet']
) {
if ($flux['args']['action'] == 'instituer'
AND $statut_ancien = $flux['args']['statut_ancien']
AND isset($flux['data']['statut'])
AND $statut = $flux['data']['statut']
AND $statut != $statut_ancien
) {
include_spip('inc/mailsubscribers');
$email = sql_getfetsel('email', 'spip_mailsubscribers', "id_mailsubscriber=" . intval($id_mailsubscriber));
if (!mailsubscribers_test_email_obfusque($email)) {
if ($statut == 'valide') {
$subscriber = charger_fonction('subscriber', 'newsletter');
$infos = $subscriber($email);
$add = array();
foreach ($infos['subscriptions'] as $sub) {
if ($sub['status'] == 'pending') {
$add[] = $sub['id'];
}
}
if ($add) {
$subscribe = charger_fonction('subscribe', 'newsletter');
$subscribe($email, array('listes' => $add, 'force' => true, 'notify' => false));
}
}
if (in_array($statut, array('refuse', 'poubelle'))) {
$unsubscribe = charger_fonction('unsubscribe', 'newsletter');
$unsubscribe($email, array('notify' => false));
$id_job = job_queue_add('mailsubscribers_obfusquer_mailsubscriber', "Obfusquer email #$id_mailsubscriber",
array($id_mailsubscriber), 'inc/mailsubscribers', false, time() + 300);
job_queue_link($id_job, array('objet' => 'mailsubscriber', 'id_objet' => $id_mailsubscriber));
}
}
}
}
return $flux;
}
/**
* Optimiser la base de donnee en supprimant :
* -> les inscriptions non confirmees
* -> les inscriptions et les listes a la poubelle
*
* @param array $flux
* @return array
*/
function mailsubscribers_optimiser_base_disparus($flux) {
$n = &$flux['data'];
$mydate = sql_quote(trim($flux['args']['date'], "'"));
# passer en poubelle les inscriptions en attente jamais confirmees (ce sont des bots)
sql_updateq("spip_mailsubscribers", array("statut" => "poubelle", 'date' => date('Y-m-d H:i:s')),
"statut=" . sql_quote('prepa') . " AND date < " . $mydate);
# supprimer les inscrits a la poubelle
sql_delete("spip_mailsubscribers", "statut=" . sql_quote('poubelle') . " AND date < " . $mydate);
# supprimer les listes a la poubelle
sql_delete("spip_mailsubscribinglists", "statut=" . sql_quote('poubelle') . " AND date < " . $mydate. " AND maj < " . $mydate);
# supprimer les inscriptions dont le subscriber n'existe plus
$res = sql_select("S.id_mailsubscriber AS id",
"spip_mailsubscriptions AS S
LEFT JOIN spip_mailsubscribers AS M
ON M.id_mailsubscriber=S.id_mailsubscriber",
"M.id_mailsubscriber IS NULL");
$n += optimiser_sansref('spip_mailsubscriptions', 'id_mailsubscriber', $res);
# supprimer les inscriptions dont la liste n'existe plus
$res = sql_select("S.id_mailsubscribinglist AS id",
"spip_mailsubscriptions AS S
LEFT JOIN spip_mailsubscribinglists AS L
ON L.id_mailsubscribinglist=S.id_mailsubscribinglist",
"L.id_mailsubscribinglist IS NULL");
$n += optimiser_sansref('spip_mailsubscriptions', 'id_mailsubscribinglist', $res);
# reliquat d'inscriptions incoherentes
// on utilise le critere su.statut=refuse qui est plus rapide que email like '%@example.org'
$old_sub = sql_allfetsel('su.id_mailsubscriber,su.email', 'spip_mailsubscribers AS su JOIN spip_mailsubscriptions as si on su.id_mailsubscriber=si.id_mailsubscriber','su.statut=' . sql_quote('refuse') . ' AND si.id_segment=0 AND si.statut=' . sql_quote('valide'), 'su.id_mailsubscriber','','0,50');
if ($old_sub) {
$unsubscribe = charger_fonction('unsubscribe', 'newsletter');
foreach ($old_sub as $sub) {
// si mail obfusque, on desinscrit de tout
if (mailsubscribers_test_email_obfusque($sub['email'])) {
$unsubscribe($sub['email'], array('notify' => false));
}
// sinon on retablit le statut=valide sur le mailsubscriber
else {
sql_updateq('spip_mailsubscribers', array('statut' => 'valide'), 'id_mailsubscriber='.intval($sub['id_mailsubscriber']));
}
}
}
return $flux;
}
/**
* Ajout de la coche d'optin sur le formulaire inscription
*
* @param array $flux
* @return array
*/
function mailsubscribers_formulaire_charger($flux) {
if (in_array($flux['args']['form'], array("inscription", "forum"))
and is_array($flux['data'])) {
// ici on ne lit pas la config pour aller plus vite (pas grave si on a ajoute le champ sans l'utiliser)
$flux['data']['mailsubscriber_optin'] = '';
}
return $flux;
}
/**
* Ajout de la coche d'optin sur le formulaire inscription et forum
*
* @param array $flux
* @return array
*/
function mailsubscribers_formulaire_fond($flux) {
if ($flux['args']['form'] == "inscription") {
include_spip('inc/config');
if (lire_config("mailsubscribers/proposer_signup_optin", 0)) {
if (preg_match(",</(div|ul)>\s*</fieldset>,Uims", $flux['data'], $m)) {
$p = strrpos($flux['data'], $m[0]);
$c = array_merge($flux['args']['contexte'], array('tag' => ($m[1] == 'ul' ? 'li' : 'div')));
$input = recuperer_fond("formulaires/inc-optin-subscribe", $c);
$flux['data'] = substr_replace($flux['data'], $input, $p, 0);
}
}
}
if ($flux['args']['form'] == "forum") {
include_spip('inc/config');
if (lire_config("mailsubscribers/proposer_comment_optin", 0)) {
$show = true;
// si l'utilisateur est connu et deja abonne on propose pas la coche
if ((isset($GLOBALS['visiteur_session']['email']) AND $email = $GLOBALS['visiteur_session']['email'])
OR (isset($GLOBALS['visiteur_session']['session_email']) AND $email = $GLOBALS['visiteur_session']['session_email'])
) {
$newsletter_subscriber = charger_fonction('subscriber', 'newsletter');
$infos = $newsletter_subscriber($email);
if ($infos AND $infos['status'] == "on") {
$show = false;
}
}
if ($show AND ($pform = strrpos($flux['data'], "<form")) !== false) {
if (strrpos($flux['data'], '</textarea>') < $pform) {
$pform = 0;
}
if ($p = strripos($flux['data'], "</fieldset>")
and $pfieldset = strripos($flux['data'], "<fieldset", strlen($flux['data'])- $p)
and preg_match(",</(div|ul)>\s*</fieldset>,Uims", substr($flux['data'], $pfieldset), $m)){
$p = strpos($flux['data'], $m[0], $pfieldset);
$c = array_merge($flux['args']['contexte'], array('tag' => ($m[1]=='ul' ? 'li' : 'div')));
$input = recuperer_fond("formulaires/inc-optin-subscribe", $c);
$flux['data'] = substr_replace($flux['data'], $input, $p, 0);
}
}
}
}
return $flux;
}
/**
* Reinjecter mailsubscriber_optin dans la previsu forum si besoin
*
* @param $flux
* @return mixed
*/
function mailsubscribers_formulaire_verifier($flux) {
if ($flux['args']['form'] == "forum"
AND _request('mailsubscriber_optin')
AND isset($flux['data']['previsu'])
) {
// reinjecter l'optin dans la previsu
if ($p = strpos($flux['data']['previsu'], "<input")) {
$flux['data']['previsu'] = substr_replace($flux['data']['previsu'],
"<input type='hidden' name='mailsubscriber_optin' value='oui' />", $p, 0);
}
}
return $flux;
}
/**
* Traitement de la coche d'optin sur le formulaire inscription et forum
*
* @param array $flux
* @return array
*/
function mailsubscribers_formulaire_traiter($flux) {
if ($flux['args']['form'] == "inscription"
AND _request('mailsubscriber_optin')
AND isset($flux['data']['id_auteur'])
AND $id_auteur = $flux['data']['id_auteur']
) {
// si on a poste l'optin et auteur inscrit en base
// verifier quand meme que la config autorise cet optin, et que l'inscription s'est bien faite)
include_spip('inc/config');
if (lire_config("mailsubscribers/proposer_signup_optin", 0)) {
$row = sql_fetsel('nom,email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
if ($row) {
// inscrire le nom et email
$newsletter_subscribe = charger_fonction('subscribe', 'newsletter');
$newsletter_subscribe($row['email'], array('nom' => $row['nom']));
}
}
}
if ($flux['args']['form'] == "forum"
AND _request('mailsubscriber_optin')
AND (isset($GLOBALS['visiteur_session']['email']) OR isset($GLOBALS['visiteur_session']['session_email']))
) {
// si on a poste l'optin et on a un email en session
// verifier quand meme que la config autorise cet optin, et que l'inscription s'est bien faite)
include_spip('inc/config');
if (lire_config("mailsubscribers/proposer_comment_optin", 0)) {
$email = $nom = "";
if (isset($GLOBALS['visiteur_session']['email'])) {
$email = $GLOBALS['visiteur_session']['email'];
} elseif (isset($GLOBALS['visiteur_session']['session_email'])) {
$email = $GLOBALS['visiteur_session']['session_email'];
}
if (isset($GLOBALS['visiteur_session']['nom'])) {
$nom = $GLOBALS['visiteur_session']['nom'];
} elseif (isset($GLOBALS['visiteur_session']['session_nom'])) {
$nom = $GLOBALS['visiteur_session']['session_nom'];
}
if ($email) {
// inscrire le nom et email
$newsletter_subscribe = charger_fonction('subscribe', 'newsletter');
$newsletter_subscribe($email, array('nom' => $nom));
}
}
}
return $flux;
}
/**
* Afficher les inscriptions d'un auteur (et pouvoir les modifier)
*
* @param $flux
* @return mixed
*/
function mailsubscribers_affiche_auteurs_interventions($flux) {
if ($id_auteur = $flux['args']['id_auteur']) {
$flux['data'] .= recuperer_fond('prive/squelettes/inclure/auteur-subscription', array('id_auteur' => $id_auteur));
}
return $flux;
}
/**
* Proteger les formulaires subscriber/unsubscribe
*
* @param $formulaires
* @return array
*/
function mailsubscribers_nospam_lister_formulaires($formulaires) {
$formulaires[] = 'newsletter_subscribe';
$formulaires[] = 'newsletter_unsubscribe';
return $formulaires;
}