Exemple #1
0
function spip_avant_typo($letexte)
{
    $letexte = extraire_multi($letexte);
    if (@function_exists('avant_typo')) {
        return avant_typo($letexte);
    }
    return $letexte;
}
Exemple #2
0
function url_nettoyer($titre,$longueur_maxi,$longueur_min=0,$separateur='-',$filtre=''){
	if (!defined('_TRANSLITTERER_URL')) define('_TRANSLITTERER_URL', true);
	
	$titre = supprimer_tags(supprimer_numero(extraire_multi($titre)));
	$url = corriger_caracteres($titre);
	
	
	if (_TRANSLITTERER_URL) $url = translitteration($url);

	if ($filtre)
		$url = $filtre($url);

	// on va convertir tous les caracteres de ponctuation et espaces
	// a l'exception de l'underscore (_), car on veut le conserver dans l'url
	$url = str_replace('_', chr(7), $url);
	$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
	$url = str_replace(chr(7), '_', $url);

	// S'il reste trop de caracteres non latins, les gerer comme wikipedia
	// avec rawurlencode :
	if (_TRANSLITTERER_URL && preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) {
		foreach ($r as $regs) {
			$url = substr_replace($url, rawurlencode($regs[0]),
				strpos($url, $regs[0]), strlen($regs[0]));
		}
	}

	// S'il reste trop peu, renvoyer vide
	if (strlen($url) < $longueur_min)
		return '';

	// Sinon couper les mots et les relier par des $separateur
	if (_TRANSLITTERER_URL) $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url); 
	else $mots = preg_split(",[\s]+,", $url);
	$url = '';
	foreach ($mots as $mot) {
		if (!strlen($mot)) continue;
		$url2 = $url.$separateur.$mot;

		// Si on depasse $longueur_maxi caracteres, s'arreter
		// ne pas compter 3 caracteres pour %E9 mais un seul
		$long = preg_replace(',%.,', '', $url2);
		if (strlen($long) > $longueur_maxi) {
			break;
		}

		$url = $url2;
	}
	$url = substr($url, 1);

	// On enregistre en utf-8 dans la base
	$url = rawurldecode($url);

	if (strlen($url) < $longueur_min)
		return '';
	return $url;
}
	function couper_intro3($texte, $long, $suite) {
		$texte = extraire_multi(preg_replace(",(</?)intro>,i", "\\1intro>", $texte)); // minuscules
		$intro = '';
		while ($fin = strpos($texte, "</intro>")) {
			$zone = substr($texte, 0, $fin);
			$texte = substr($texte, $fin + strlen("</intro>"));
			if ($deb = strpos($zone, "<intro>") OR substr($zone, 0, 7) == "<intro>")
				$zone = substr($zone, $deb + 7);
			$intro .= $zone;
		}
		$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte);
		return PtoBR(traiter_raccourcis(preg_replace(',([|]\s*)+,S', '; ', couper($texte, $long, _INTRODUCTION_CODE))));
	}
function balise_ECATALOGUE_PRODUCT_CURRENCY_SIGN_dyn($id_article, $sign = 'sign_pre')
{
    require_once _DIR_PLUGIN_ECATALOGUE . 'classes/class.CurrencyModel.php';
    $currency_mdl = new CurrencyModel();
    // If some exceptions are thrown - return empty value
    try {
        $sign = $currency_mdl->GetCurrencySignByIdArticle($id_article, $sign);
    } catch (Exception $e) {
        $sign = '';
    }
    include_spip('inc/filtres');
    $sign = extraire_multi($sign);
    return array('balise/ecatalogue_product_currency_sign', 0, array('sign' => $sign));
}
Exemple #5
0
function formulaires_ecrire_auteur_traiter_dist($id_auteur, $id_article, $mail)
{
    $adres = _request('email_message_auteur');
    $sujet = _request('sujet_message_auteur');
    $texte = _request('texte_message_auteur');
    $texte .= "\n\n-- " . _T('envoi_via_le_site') . " " . supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site'])) . " (" . $GLOBALS['meta']['adresse_site'] . "/) --\n";
    $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
    if ($envoyer_mail($mail, $sujet, $texte, $adres, "X-Originating-IP: " . $GLOBALS['ip'])) {
        $message['message_ok'] = _T('form_prop_message_envoye');
    } else {
        $message['message_erreur'] = _T('pass_erreur_probleme_technique');
    }
    return $message;
}
/**
 * Insertion dans le pipeline formulaire_charger (SPIP)
 * 
 * Surcharge du sujet et le texte du message généré par le formulaire_ecrire_auteur
 * Surcharge du formulaire d'inscription pour ne pas afficher l'explication
 * 
 * @param array $flux
 * @return array $flux
 */
function geol_formulaire_charger($flux)
{
    // sujet perso pour formulaire_ecrire_auteur depuis une page article (erreur de localisation)
    if ($flux['args']['form'] == 'ecrire_auteur' and $flux['args']['args'][1] != '') {
        $flux['data']['sujet_message_auteur'] .= supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site'])) . " : " . _T('geol:sujet_erreur_localisation');
        $flux['data']['texte_message_auteur'] .= _T('geol:depuis_page') . " : " . generer_url_entite_absolue($flux['args']['args'][1], 'article') . "\n\nMessage :\n\n";
    }
    // pas d'explicaltion sur le form d'inscription
    if ($flux['args']['form'] == 'inscription' and $flux['args']['args'][0] == '1comite') {
        $flux['data']['_commentaire'] = '';
    }
    // limiter le form de polyhierarchie sur la branche des categories (dans le public)
    // cf http://zone.spip.org/trac/spip-zone/changeset/41280
    if ($flux['args']['form'] == 'editer_polyhierarchie' and !test_espace_prive()) {
        $flux['data']['limite_branche'] = lire_config('geol/secteur_categories', 2);
    }
    return $flux;
}
function balise_ECATALOGUE_CURRENCY_SIGN_dyn($currency_code = false, $sign = 'sign_pre')
{
    require_once _DIR_PLUGIN_ECATALOGUE . 'classes/class.CurrencyModel.php';
    $currency_mdl = new CurrencyModel();
    // If $currency_code isn't defined, current currency sign will be returned
    if (!$currency_code) {
        $currency = $currency_mdl->GetCurrentCurrency();
    } else {
        $currency = $currency_mdl->SelectByCode($currency_code);
    }
    //$sign = $currency[$sign];
    include_spip('inc/filtres');
    if ($currency) {
        $sign = extraire_multi($currency[$sign]);
    } else {
        $sign = '';
    }
    return array('balise/ecatalogue_currency_sign', 0, array('sign' => $sign));
}
function glossaire_verifie(&$c) {
	include_spip('public/parametrer'); // pour mes_fonctions
	$res = array();
	$c = count($gloss = glossaire_query_tab());
	for($i=0; $i<$c; $i++) for($j=$i+1; $j<$c; $j++) {
		$gi = &$gloss[$i]; $gj = &$gloss[$j];
		if(!isset($gi['mots']))
			list($gi['mots'],$gi['regs'],$gi['titre2']) = glossaire_parse(extraire_multi($gi['titre']));
		if(!isset($gj['mots']))
			list($gj['mots'],$gj['regs'],$gj['titre2']) = glossaire_parse(extraire_multi($gj['titre']));
		$u = false;
		$titre = $gi['mots']?glossaire_gogogo($gj['titre2'], $gi['mots'], -1, $u):'';
		if(count($gi['regs']))
			$titre .= preg_replace_callback($gi['regs'], "glossaire_echappe_mot_callback", $gj[titre], -1);
		if(strpos($titre,'@@GLOSS')!==false) {	
			$a = '['.$gi['titre'].'->mot'.$gi['id_mot'].']';
			$b = '['.$gj['titre'].'->mot'.$gj['id_mot'].']';
			$res[] = "&bull; "._T('couteauprive:glossaire_erreur', array('mot1'=>$a, 'mot2'=>$b))."\n_ ";
		}
	}
	if(count($res)) return propre(join('', $res)._T('couteauprive:glossaire_inverser'));
	return '';
}
Exemple #9
0
function afficher_forum_auteur($row)
{
	$titre=$row['titre'];
	$id_auteur=$row["id_auteur"];
	$date_heure=$row['date_heure'];
	$email_auteur=$row['email_auteur'];
	$auteur= extraire_multi($row['auteur']);

	if ($id_auteur) {
		$formater_auteur = charger_fonction('formater_auteur', 'inc');
		$res = join(' ',$formater_auteur($id_auteur));
	} else {
		if ($email_auteur) {
			if (email_valide($email_auteur))
				$email_auteur = "<a href='mailto:"
				.htmlspecialchars($email_auteur)
				."?subject=".rawurlencode($titre)."'>".$email_auteur
				."</a>";
			$auteur .= " &mdash; $email_auteur";
		}
		$res = safehtml("<span class='arial2'> / <b>$auteur</b></span>");
	}
	return "<div style='font-weight: normal;'>"
	  . date_interface($date_heure)
	  . "&nbsp;&nbsp;$res</div>";
}
Exemple #10
0
function formulaires_forum_charger_dist(
$titre, $table, $type, $script,
$id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
$ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) {

	// exiger l'authentification des posteurs pour les forums sur abo
	if ($type == "abo") {
		if (!$GLOBALS["visiteur_session"]['statut']) {
			return array(
				'action' => '', #ne sert pas dans ce cas, on la vide pour mutualiser le cache
				'editable'=>false,
				'login_forum_abo'=>' ',
				'inscription' => generer_url_public('identifiants', 'lang='.$GLOBALS['spip_lang']),
				'oubli' => generer_url_public('spip_pass','lang='.$GLOBALS['spip_lang'],true),
				);
		}
	}

	// Tableau des valeurs servant au calcul d'une signature de securite.
	// Elles seront placees en Input Hidden pour que inc/forum_insert
	// recalcule la meme chose et verifie l'identite des resultats.
	// Donc ne pas changer la valeur de ce tableau entre le calcul de
	// la signature et la fabrication des Hidden
	// Faire attention aussi a 0 != ''

	// id_rubrique est parfois passee pour les articles, on n'en veut pas
	$ids = array();
	if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
		$id_rubrique = 0;
	foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
		$ids[$o] = ($x = intval($$o)) ? $x : '';
	}


	// ne pas mettre '', sinon le squelette n'affichera rien.
	$previsu = ' ';

	// au premier appel (pas de Post-var nommee "retour_forum")
	// memoriser eventuellement l'URL de retour pour y revenir apres
	// envoi du message ; aux appels suivants, reconduire la valeur.
	// Initialiser aussi l'auteur
	if ($retour_forum = rawurldecode(_request('retour')))
		$retour_forum =  str_replace('&var_mode=recalcul','',$retour_forum);
	else {
		// par defaut, on veut prendre url_forum(), mais elle ne sera connue
		// qu'en sortie, on inscrit donc une valeur absurde ("!")
		$retour_forum = "!";
		// sauf si on a passe un parametre en argument (exemple : {#SELF})
		if ($url_param_retour)
			$retour_forum = str_replace('&amp;', '&', $url_param_retour);
		$retour_forum = rawurlencode($retour_forum);
	}
	if (_request('retour_forum')){
		$arg = forum_fichier_tmp(join('', $ids));
		
		$securiser_action = charger_fonction('securiser_action', 'inc');
		// on sait que cette fonction est dans le fichier associe
		$hash = calculer_action_auteur("ajout_forum-$arg");
	}

	// pour les hidden
	$script_hidden = "";
	foreach ($ids as $id => $v)
		$script_hidden .= "<input type='hidden' name='$id' value='$v' />";
		
	$script_hidden .= "<input type='hidden' name='arg' value='$arg' />";
	$script_hidden .= "<input type='hidden' name='hash' value='$hash' />";
	$script_hidden .= "<input type='hidden' name='verif_".substr($hash,0,32)."' value='ok' />";
	$script_hidden .= "<input type='hidden' name='afficher_texte' value='$afficher_texte' />";
	$script_hidden .= "<input type='hidden' name='retour_forum' value='$retour_forum' />";

	// l'ajout de documents est-il autorise ?
	// cf. verifier.php
	if ($formats = forum_documents_acceptes()) {
		include_spip('inc/securiser_action');
		$cle_ajouter_document = calculer_cle_action('ajouter-document-'.join('-',array_map('intval',$ids)));
	}

	return array(
		'modere' => (($type != 'pri') ? '' : ' '),
		'nom_site' => '',
		'table' => $table,
		'texte' => '',
		'config' => array('afficher_barre' => ($GLOBALS['meta']['forums_afficher_barre']!='non'?' ':'')),
		'titre' => str_replace('~', ' ', extraire_multi($titre)),
		'action' => $script, # ce sur quoi on fait le action='...'
		'_hidden' => $script_hidden, # pour les variables hidden
		'url_site' => "http://",
		'cle_ajouter_document' => $cle_ajouter_document,
		'formats_documents_forum' => $formats,
		'ajouter_document' => $_FILES['ajouter_document']['name'],
		'nobot' => _request('nobot'),
		'ajouter_groupe' => $ajouter_groupe,
		'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
		'id_forum' => $id_forum, // passer id_forum au formulaire pour lui permettre d'afficher a quoi l'internaute repond
		'_sign'=>implode('_',$ids)
	);
}
Exemple #11
0
function cs_rempl_glossaire($texte, $liste=false) {
	global $gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id;
	// si [!glossaire] est trouve on sort
	if(strpos($texte, _CS_SANS_GLOSSAIRE)!==false)
		return $liste?array():str_replace(_CS_SANS_GLOSSAIRE, '', $texte);
	// mise en static de la table des mots pour eviter d'interrroger la base a chaque fois
	// attention aux besoins de memoire...
	static $limit, $glossaire_generer_url, $glossaire_generer_mot, $glossaire_array = NULL;
	if(!isset($glossaire_array)) {
		$glossaire_array = glossaire_query_tab();
		$glossaire_generer_url = function_exists('glossaire_generer_url')?'glossaire_generer_url':'glossaire_generer_url_dist';
		$limit = defined('_GLOSSAIRE_LIMITE')?_GLOSSAIRE_LIMITE:-1;
		$glossaire_generer_mot = function_exists('glossaire_generer_mot')
			?'glossaire_generer_mot(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])':'$GLOBALS[\'gloss_mots\'][\\1]'; // 'glossaire_generer_mot_dist(\'\\2\', $GLOBALS[\'gloss_mots\'][\\1])';
		$glossaire_generer_mot = '"<a $table1[\\2]_".$GLOBALS["gl_i"]++."\' class=\'cs_glossaire\'><span class=\'gl_mot\'>".'.$glossaire_generer_mot.'."</span>$table2[\\2]</a>"';
	}
	$unicode = false;
	$mem = $GLOBALS['toujours_paragrapher'];
	$GLOBALS['toujours_paragrapher'] = false;
	// initialisation des globales d'echappement
	$gloss_ech = $gloss_mots = array();
	$gloss_ech_id = $gloss_mots_id = 0;
	// prudence 1 : protection des liens SPIP
	if (strpos($texte, '[')!==false) 
		$texte = preg_replace_callback(',\[[^][]*->>?[^]]*\],msS', 'glossaire_echappe_balises_callback', $texte);
	// parcours de tous les mots, sauf celui qui peut faire partie du contexte (par ex : /spip.php?mot5)
	$mot_contexte=$GLOBALS['contexte']['id_mot']?$GLOBALS['contexte']['id_mot']:_request('id_mot');
	foreach ($glossaire_array as $mot) if (($gloss_id = $mot['id_mot']) <> $mot_contexte) {
		// parser le mot-cle du glossaire
		// contexte de langue a prendre en compte ici
		list($les_mots, $les_regexp, $les_titres) = glossaire_parse($titre=extraire_multi($mot['titre']));
		$mot_present = false;
		if(count($les_regexp)) {
			// a chaque expression reconnue, on pose une balise temporaire cryptee
			// ce remplacement est puissant, attention aux balises HTML ; par exemple, eviter : ,div,i
			$texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit);
			// TODO 1 : sous PHP 5.0, un parametre &$count permet de savoir si un remplacement a eu lieu
			// et s'il faut construire la fenetre de glossaire.
			// TODO 2 : decrementer le parametre $limit pour $les_mots, si &$count est renseigne.
			// en attendant, constuisons qd meme la fenetre...
			$mot_present = true;
		}
		if($les_mots) {
			if(preg_match(",\W(?:$les_mots)\W,i", " $texte ")) {
				$texte = glossaire_gogogo($texte, $les_mots, $limit, $unicode);
				$mot_present = true;
			}
		}
		// si un mot est trouve, on construit la fenetre de glossaire
		if($mot_present) {
			$lien = $glossaire_generer_url($gloss_id, $titre);
			// $definition =strlen($mot['descriptif'])?$mot['descriptif']:$mot['texte'];
			if($liste)
				$table1[$gloss_id] = array($gloss_id, $lien, $les_titres);
			else {
				$table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons
				$table2[$gloss_id] = recuperer_fond(
					defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css', 
					array('id_mot' => $gloss_id, 'titre' => $les_titres, 
						'texte' => glossaire_safe($mot['texte']), 
						'descriptif' => glossaire_safe($mot['descriptif'])));
			}
		}
	}
	$GLOBALS['toujours_paragrapher'] = $mem;
	$GLOBALS['gl_i'] = 0;
	if($liste) $texte = (preg_match_all(',@@M(\d+)#(\d+)@@,', $texte, $reg, PREG_SET_ORDER) 
			&& array_walk($reg,
		create_function('&$v,$k,&$t1', '$v=array_merge(array($GLOBALS[\'gloss_mots\'][$v[1]]),$t1[$v[2]]);'), $table1)
		)?$reg:array();
	else {
		// remplacement des echappements
		$texte = preg_replace(',@@E(\d+)@@,e', '$GLOBALS[\'gloss_ech\'][\\1]', $texte);
		// remplacement final des balises posees ci-dessus
		$texte = preg_replace(',@@M(\d+)#(\d+)@@,e', $glossaire_generer_mot, $texte);
	}
	// nettoyage
	unset($gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id);
	return $texte;
}
 /**
  * Récupérer les infos utiles des paquet
  *
  * Crée un tableau de description pour chaque paquet dans une
  * écriture courte comme index ('i' pour identifiant) tel que :
  * - i = identifiant
  * - p = prefixe (en majuscule)
  * - n = nom du plugin
  * - v = version
  * - e = etat
  * - a = actif
  * - du = dépendances utilise
  * - dn = dépendances nécessite
  * - dl = dépendances librairie
  * - procure = prefixes procurés
  * - maj = mise à jour
  *
  *
  * On passe un where ($condition) et on crée deux tableaux, l'un des paquets
  * triés par identifiant, l'autre par prefixe.
  *
  * @param array|string $condition
  *     Condition where
  * @param bool $multiple
  *     Si multiple, le tableau par préfixe est un sous-tableau (il peut alors
  *     y avoir plusieurs paquets pour un même prefixe, classés par états décroissants)
  * @return array
  *     Index 'i' : plugins triés par identifiant en base [i][32] = tableau de description
  *     Index 'p' : plugins triés par prefixe de plugin [p][MOTS] = tableau de description
  *                 ou, avec $multiple=true : [p][MOTS][] = tableau de description
  */
 public function infos_courtes($condition, $multiple = false)
 {
     $plugs = array('i' => array(), 'p' => array());
     $from = array('spip_paquets AS pa', 'spip_plugins AS pl');
     $orderby = $multiple ? 'pa.etatnum DESC' : '';
     $where = array('pa.id_plugin = pl.id_plugin');
     if (is_array($condition)) {
         $where = array_merge($where, $condition);
     } else {
         $where[] = $condition;
     }
     include_spip('inc/filtres');
     // extraire_multi()
     $res = sql_allfetsel(array('pa.id_paquet AS i', 'pl.nom AS n', 'pl.prefixe AS p', 'pa.version AS v', 'pa.etatnum AS e', 'pa.compatibilite_spip', 'pa.dependances', 'pa.procure', 'pa.id_depot', 'pa.maj_version AS maj', 'pa.actif AS a'), $from, $where, '', $orderby);
     foreach ($res as $r) {
         $r['p'] = strtoupper($r['p']);
         // on s'assure du prefixe en majuscule.
         // savoir si un paquet est en local ou non...
         $r['local'] = $r['id_depot'] == 0 ? true : false;
         unset($r['id_depot']);
         $d = unserialize($r['dependances']);
         // voir pour enregistrer en bdd simplement 'n' et 'u' (pas la peine d'encombrer)...
         $deps = array('necessite' => array(array()), 'utilise' => array(array()), 'librairie' => array(array()));
         if (!$d) {
             $d = $deps;
         }
         unset($r['dependances']);
         if (!$r['procure'] or !($proc = unserialize($r['procure']))) {
             $proc = array();
         }
         $r['procure'] = $proc;
         /*
          * On extrait les multi sur le nom du plugin
          */
         $r['n'] = extraire_multi($r['n']);
         $plugs['i'][$r['i']] = $r;
         // pour chaque type de dependences... (necessite, utilise, librairie)
         // on cree un tableau unique [$dependence] = array()
         // au lieu de plusieurs tableaux par version de spip
         // en ne mettant dans 0 que ce qui concerne notre spip local
         foreach ($deps as $cle => $defaut) {
             if (!isset($d[$cle])) {
                 $d[$cle] = $defaut;
             }
             // gerer les dependences autres que dans 0 (communs ou local) !!!!
             // il peut exister des cles info[dn]["[version_spip_min;version_spip_max]"] de dependences
             if (!isset($d[$cle][0]) or count($d[$cle]) > 1) {
                 $dep = array();
                 $dep[0] = isset($d[$cle][0]) ? $d[$cle][0] : array();
                 unset($d[$cle][0]);
                 foreach ($d[$cle] as $version => $dependences) {
                     if (svp_verifier_compatibilite_spip($version)) {
                         $dep = array_merge($dep[0], $dependences);
                     }
                 }
                 $d[$cle] = $dep;
             }
         }
         // passer les prefixes en majuscule
         foreach ($d['necessite'][0] as $i => $n) {
             $d['necessite'][0][$i]['nom'] = strtoupper($n['nom']);
         }
         $plugs['i'][$r['i']]['dn'] = $d['necessite'][0];
         $plugs['i'][$r['i']]['du'] = $d['utilise'][0];
         $plugs['i'][$r['i']]['dl'] = $d['librairie'][0];
         if ($multiple) {
             $plugs['p'][$r['p']][] =& $plugs['i'][$r['i']];
             // alias
         } else {
             $plugs['p'][$r['p']] =& $plugs['i'][$r['i']];
             // alias
         }
     }
     return $plugs;
 }
Exemple #13
0
function controle_forum_boucle($row, $args) {

	$id_forum = $row['id_forum'];
	$forum_id_parent = $row['id_parent'];
	$forum_id_rubrique = $row['id_rubrique'];
	$forum_id_article = $row['id_article'];
	$forum_id_breve = $row['id_breve'];
	$forum_date_heure = $row['date_heure'];
	$forum_titre = echapper_tags($row['titre']);
	$forum_texte = $row['texte'];
	$forum_auteur = echapper_tags(extraire_multi($row['auteur']));
	$forum_email_auteur = echapper_tags($row['email_auteur']);
	$forum_nom_site = echapper_tags($row['nom_site']);
	$forum_url_site = echapper_tags($row['url_site']);
	$forum_stat = $row['statut'];
	$forum_ip = $row['ip'];
	$forum_id_auteur = $row["id_auteur"];

	$r = forum_parent($id_forum);
	$avant = $r['avant'];
	$url = $r['url'];
	$titre = $r['titre'];
	$type = $r['type'];
	$valeur = $r['valeur'];
	$pref = $r['pref'];

	if ($documents = sql_allfetsel('doc.id_document, doc.fichier AS fichier', 'spip_documents AS doc LEFT JOIN spip_documents_liens AS lien ON doc.id_document=lien.id_document', 'lien.id_objet='.intval($id_forum)." AND objet='forum'")) {
		include_spip('inc/documents');
		foreach ($documents as $k => $t) {
			$h = generer_url_entite($t['id_document'], 'document');
			$documents[$k] = "<a href='".$h."'>".basename($t['fichier'])."</a>";
		}
	}

	switch($forum_stat) {
		case 'off':
		case 'privoff':
			$style = " style='border: 2px #ff0000 dashed;'";
			break;
		case 'prop':
			$style = " style='border: 2px yellow solid; background-color: white;'";
			break;
		case 'spam':
			$style = " style='border: 2px black dotted;'";
			break;
		default:
			$style = "";
			break;
	}

	if ($forum_email_auteur) {
		if (email_valide($forum_email_auteur))
			$forum_email_auteur = "<a href='mailto:"
			.htmlspecialchars($forum_email_auteur)
			."?subject=".rawurlencode($forum_titre)."'>".$forum_email_auteur
			."</a>";
		$forum_auteur .= " &mdash; $forum_email_auteur";
	}

	$suite = "\n<br />$avant<b>$pref\n<a href='$url' class='controle'>$titre</a></b>"  
	. "<div class='controle'>".justifier(propre($forum_texte))."</div>";
	include_spip('public/composer');
	if ($forum_notes = safehtml(calculer_notes()))
		$suite .= "<div class='notes controle'>".justifier(safehtml($forum_notes))."</div>";

	if (strlen($forum_url_site) > 10 AND strlen($forum_nom_site) >= 3)
		$suite .= "\n<div style='text-align: left' class='serif'><b><a href='$forum_url_site'>$forum_nom_site</a></b></div>";

	return 	"\n<div><br /><a id='forum$id_forum'></a></div>" .
	  debut_cadre_forum("", true, "", typo($forum_titre)) .
	  "<div$style>" .
	  date_interface($forum_date_heure) .
	  safehtml("<span class='arial2'> / <b>$forum_auteur</b></span>") .
	  boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur, "$type=$valeur", $forum_ip, 'controle_forum', $args) .
	  safehtml(lignes_longues($suite)) .
	  afficher_forum_mots($id_forum) .
	  join(', ', $documents) .
	  "<div class='nettoyeur'></div></div>".
	  fin_cadre_forum(true);
}
Exemple #14
0
/**
 * http://code.spip.net/@corriger_typo
 *
 * @param string $t
 * @param string $lang
 * @return string
 */
function corriger_typo($t, $lang = '')
{
    static $typographie = array();
    // Plus vite !
    if (!$t) {
        return $t;
    }
    $t = pipeline('pre_typo', $t);
    // Caracteres de controle "illegaux"
    $t = corriger_caracteres($t);
    // Proteger les caracteres typographiques a l'interieur des tags html
    if (preg_match_all(_TYPO_BALISE, $t, $regs, PREG_SET_ORDER)) {
        foreach ($regs as $reg) {
            $insert = $reg[0];
            // hack: on transforme les caracteres a proteger en les remplacant
            // par des caracteres "illegaux". (cf corriger_caracteres())
            $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
            $t = str_replace($reg[0], $insert, $t);
        }
    }
    // trouver les blocs multi et les traiter a part
    $t = extraire_multi($e = $t, $lang, true);
    $e = $e === $t;
    // Charger & appliquer les fonctions de typographie
    $idxl = "{$lang}:" . (isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : $GLOBALS['spip_lang']);
    if (!isset($typographie[$idxl])) {
        $typographie[$idxl] = charger_fonction(lang_typo($lang), 'typographie');
    }
    $t = $typographie[$idxl]($t);
    // Les citations en une autre langue, s'il y a lieu
    if (!$e) {
        $t = echappe_retour($t, 'multi');
    }
    // Retablir les caracteres proteges
    $t = strtr($t, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
    // pipeline
    $t = pipeline('post_typo', $t);
    # un message pour abs_url - on est passe en mode texte
    $GLOBALS['mode_abs_url'] = 'texte';
    return $t;
}
Exemple #15
0
/**
 * Envoie le courrier pret au depart
 *
 * Prend dans le panier des courriers a envoyer (spip_courriers) les encours
 * - formate le titre, texte pour l'envoi
 *
 * 
 * les etiquettes sont dans la queue d'envois (spip_auteurs_courriers)
 * - id_auteur (pour reprendre l'adresse mail de id_auteur)
 * - id_courrier (le courrier a dupliquer/envoyer)
 * 
 * la queue (spip_auteurs_courriers) a ete remplie par cron_spiplistes_cron()
 * se sert de la queue pour ventiler les envois par lots

 * le courrier (spip_courriers) doit avoir date <= time() et statut 'encour'
 * si email_test, la meleuse envoie le courrier a email_test, 
 *  supprime email_test du courrier 
 *  et repositionne le statut du courrier en 'redac'
 * si pas email_test mais id_liste, 
 *  regarde la queue d'envois (spip_auteurs_courriers) 
 *  et passe le statut du courrier (spip_courriers) a :
 *		'publie' si type == 'nl' (newsletter)
 *		'auto' si type == 'auto' (liste programmee)
 * 	et envoie les courriers precises aux abonnes de cette liste
 * 	et supprime l'identifiant du courrier dans la queue d'envois (spip_auteurs_courriers)

 * renvoie:
 * - nul, si la tache n'a pas a etre effectuee
 * - positif, si la tache a ete effectuee
 * - negatif, si la tache doit etre poursuivie ou recommencee
 *
 * @package spiplistes
 * @param int $last_time
 * @return int
 */
function spiplistes_meleuse ($last_time) {

	//spiplistes_debug_log('spiplistes_meleuse()');
	
	include_spip('inc/meta');
	include_spip('inc/texte');
	include_spip('inc/filtres');
	include_spip('inc/acces');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier');
	
	include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php');

	// initialise les options (preferences)
	foreach(array(
		'opt_simuler_envoi'
		, 'opt_suspendre_meleuse'
		, 'opt_lien_en_tete_courrier', 'lien_patron'
		, 'opt_ajout_pied_courrier', 'pied_patron'
		, 'opt_ajout_tampon_editeur'
		, 'opt_personnaliser_courrier'
		, 'opt_log_voir_destinataire'
		, 'opt_ajout_lien_desabo'
		) as $key) {
		$$key = spiplistes_pref_lire($key);
	}
	
	$sql_vide = sql_quote('');
	$nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide);
	
	
	$prefix_log = _SPIPLISTES_PREFIX_LOG;
	
	// si meleuse suspendue, signale en log 
	if($opt_suspendre_meleuse == 'oui') {
		spiplistes_log($prefix_log.'SUSPEND MODE !!!');
		return(0 - $last_time);
	}

	if($nb_etiquettes) {
		
		$eol = "\n";
		$eol2 =$eol.$eol;
		$body_html_debut = '<html>'.$eol2.'<body style="margin:0;padding:0;">'.$eol2;
		$body_html_fin = $eol2.'</body></html>';
		$charset_spip = $GLOBALS['meta']['charset'];
		$charset_dest = $GLOBALS['meta']['spiplistes_charset_envoi'];

		spiplistes_log($prefix_log.$nb_etiquettes.' job(s), distribution...');
		
		$log_voir_destinataire = ($opt_log_voir_destinataire == 'oui');
		$simuler_envoi = ($opt_simuler_envoi == 'oui');
		
		// signale en log si mode simulation
		if($simuler_envoi) {
			spiplistes_log($prefix_log.'SIMULATION MODE !!!');
		}

		// prepare le tampon editeur
		if($opt_ajout_tampon_editeur == 'oui')
		{
			list($tampon_html, $tampon_texte) = spiplistes_tampon_assembler_patron();
		}
		else {
			$tampon_html = $tampon_texte = '';
		}
		
		// prendre la premiere etiquette sur le tas et traiter son courrier
		$sql_courrier_select = array(
			'titre', 'texte', 'message_texte', 'type'
			, 'id_courrier', 'id_liste', 'email_test', 'total_abonnes', 'date_debut_envoi'
			);
		if($id_courrier = 
			intval(spiplistes_courriers_en_queue_premier('id_courrier', 'etat='.$sql_vide))
		) {
			$sql_courrier_a_traiter = spiplistes_courriers_casier_premier(
				  $sql_courrier_select
				, 'id_courrier='.sql_quote($id_courrier)
			);
			spiplistes_debug_log ($prefix_log.'etiquette en cours pour id_courrier #'.$id_courrier);
		} else {
			// un vieux bug dans une ancienne version, eradique depuis (j'espere ;-)
			//spiplistes_log($prefix_log."premiere etiquette en erreur. id_courier = 0. Supprimer cette etiquette manuellement !");
			spiplistes_log(_T('spiplistes:erreur_queue_supprimer_courrier'
							  , array('s' => $prefix_log))
						   );
		}
		
		// boucle (sur LIMIT 1) pour pouvoir sortir par break si erreur
		while($row = sql_fetch($sql_courrier_a_traiter)) {
		
			foreach($sql_courrier_select as $key) {
				$$key = $row[$key];
			}
			foreach(array('id_courrier','id_liste','total_abonnes') as $key) {
				$$key = intval($$key);
			}
			// objet (subject) ne peut pas être en html ?!
			// sauf pour le webmail (et encore)
			$objet_html = filtrer_entites(typo(spiplistes_calculer_balise_titre(extraire_multi($titre))));
			$page_html = stripslashes($texte);
			$message_texte = stripslashes($message_texte);
			
			$nb_emails = array();
			
			// compteur pour la session uniquement
			// le total de chaque sera ajoute en fin de session
			$nb_emails_envoyes =
				$nb_emails_echec = 
				$nb_emails_non_envoyes = 
				$nb_emails['texte'] = 
				$nb_emails['html'] = 0
				;
			
			$str_log = 'id_courrier #'.$id_courrier;
			
			//////////////////////////
			// Determiner email de l emetteur
			if($is_a_test = email_valide($email_test)) {
				// courrier a destination adresse email de test
				$str_log .= ' TO: '.$email_test.' (TEST)';
			} 
			else if($id_liste > 0) {
				// courrier a destination des abonnes d'une liste
				$total_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste);
				$str_log .= ' TO id_liste #'.$id_liste.' ('.$total_abonnes.' users)';
	
				$lang = spiplistes_listes_langue($id_liste);

				if($lang != '') {
					$GLOBALS['spip_lang'] = $lang;
				}
				
				$contexte = array('lang' => $lang);
				
				list($pied_html, $pied_texte) = spiplistes_pied_page_assembler_patron($id_liste, $lang);
			}
			else {
				// erreur dans un script d'appel ? Ou url ? Ou base erreur ?
				$str_log .= ' [ERROR] MISSING PARAMS (id_liste AND email_test)';
				spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR);
				// quitte while() principal
				break;
			}
			
			//////////////////////////////
			// email emetteur
			$email_envoi = spiplistes_listes_email_emetteur($id_liste);
			if(!$is_a_test && !($email_envoi)) { 
				$str_log .= ' [ERROR] ID_LISTE #'.$id_liste.' or from email MISSING'; 
				spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR);
				// quitte while() principal
				break;
			}
			$from = $email_envoi;
			if($from_valide = email_valide($from)) {
				if(strpos($from, '<') === false) {
					$fromname = spiplistes_nom_site_texte ($lang);
					$fromname = extraire_multi($GLOBALS['meta']['nom_site']);
					if ($charset_dest!=$charset_spip)
					{
						include_spip('inc/charsets');
						$fromname = unicode2charset(charset2unicode($fromname),$charset_dest);
					}
				}
			}
			else {
				spiplistes_log('[ERROR] from address incorrect: '.$from);
				if($is_a_test) {
					spiplistes_courriers_statut_redac ($id_courrier);
				}
				// break; // garder pour incrementer les erreurs des listes
			}
			
			$email_reply_to = spiplistes_pref_lire_defaut('email_reply_to', $from);
			
			$return_path = spiplistes_pref_lire_defaut('email_return_path_defaut', $from);
			
			////////////////////////////////////
			// Prepare la version texte
			$objet_texte = $titre;
			$page_texte = ($message_texte !='')
				? $message_texte
				: spiplistes_courrier_version_texte($page_html)
				;
			
			////////////////////////////////////
			// Ajoute lien tete de courrier
			if(
				($opt_lien_en_tete_courrier == 'oui') 
				&& !empty($lien_patron)
			) {
				list($lien_html, $lien_texte) = spiplistes_courriers_assembler_patron (
					_SPIPLISTES_PATRONS_TETE_DIR . $lien_patron
					, array('id_courrier' => $id_courrier
							, 'lang' => $lang)
					);
				$page_html = $lien_html . $page_html;
				$page_texte = $lien_texte . $page_texte;
			}

			////////////////////////////////////
			// La petite ligne du renvoi du cookie pour modifier son abonnement
			//$pied_rappel_html = _T('spiplistes:modif_abonnement_html');
			//$pied_rappel_texte = _T('spiplistes:modif_abonnement_text');
			
			// transcrire le contenu
			if($charset_dest != $charset_spip){
				include_spip('inc/charsets');
				foreach(array(
					  'objet_html', 'objet_texte'
					, 'page_html', 'page_texte'
					, 'pied_html', 'pied_texte'
					//, 'pied_rappel_html', 'pied_rappel_texte'
					, 'tampon_html', 'tampon_texte') as $key) 
				{
					if(!empty($$key)) {
						$$key = spiplistes_translate_2_charset(
							$$key
							, $charset_dest
							, (strpos($key, 'texte') === false)
							);
					}
				}
			}
			
			// corrige les liens relatifs (celui de texte a deja ete corrige par la trieuse (cron)
			foreach(array('pied_html', 'pied_texte'
				//, 'pied_rappel_html', 'pied_rappel_texte'
				, 'tampon_html', 'tampon_texte') as $key) {
				if(!empty($$key)) {
					$$key = spiplistes_liens_absolus ($$key);
				}
			}
			
			$email_a_envoyer = array();
			$email_a_envoyer['texte'] = new phpMail('', $objet_texte, ''
													, $page_texte, $charset_dest);
			$email_a_envoyer['texte']->From = $from ; 
			if($fromname) $email_a_envoyer['texte']->FromName = $fromname ;
			// Errors-To:,    Non-standard @see: http://www.ietf.org/rfc/rfc2076.txt
			//$email_a_envoyer['texte']->AddCustomHeader('Errors-To: '.$return_path); 
			$email_a_envoyer['texte']->AddCustomHeader('Reply-To: '.$email_reply_to); 
			$email_a_envoyer['texte']->AddCustomHeader('Return-Path: '.$return_path); 
			$email_a_envoyer['texte']->SMTPKeepAlive = true;

			//$email_a_envoyer['html'] = new phpMail('', $objet_html, $page_html, $page_texte, $charset_dest);
			$email_a_envoyer['html'] = new phpMail(''
												   , $objet_html
												   , $page_html
												   , $page_texte
												   , $charset_dest
												   );
			$email_a_envoyer['html']->From = $from ; 
			if($fromname) {
				$email_a_envoyer['html']->FromName = $fromname ;
			}
			//$email_a_envoyer['html']->AddCustomHeader('Errors-To: '.$return_path); 
			$email_a_envoyer['html']->AddCustomHeader('Reply-To: '.$email_reply_to); 
			$email_a_envoyer['html']->AddCustomHeader('Return-Path: '.$return_path); 	
			$email_a_envoyer['html']->SMTPKeepAlive = true;
		
			$str_log .= ' REPLY-TO: '.$email_reply_to.' RETURN-PATH: '.$return_path;
			
			if($total_abonnes) {
		
				$limit = intval($GLOBALS['meta']['spiplistes_lots']); // nombre de messages envoyes par boucles.	
				
				if($is_a_test) {
					$sql_adresses_dest = sql_select('id_auteur,nom,email', 'spip_auteurs'
						, 'email='.sql_quote($email_test).' LIMIT 1');
				}
				else {
					// Pour memo: les etiquettes sont creees par la trieuse
					// ou directement en backoffice 
					// - pour les envois de test
					// - pour les envoyer maintenant des courriers
					
					// Traitement d'une liasse d'etiquettes
					// un id pour ce processus (le tampon est unique par liasse)
					$id_process = intval(substr(creer_uniqid(),0,5));
					$prefix_log .= '['.$id_process.'] ';
			
					// un coup de tampon sur les etiquettes 
					// des courriers qui vont partir
					spiplistes_courriers_en_queue_modifier(
						array(
							  'etat' => sql_quote($id_process))
							, 'etat='.$sql_vide.' AND id_courrier='.sql_quote($id_courrier).' LIMIT '.$limit
					);
					
					// prendre la liasse des etiquettes tamponnees
					$sql_adresses_dest = sql_select(
						  array('a.nom', 'a.id_auteur', 'a.email')
						, array('spip_auteurs AS a', 'spip_auteurs_courriers AS b')
						, array(
							'etat='.sql_quote($id_process)
							, 'a.id_auteur=b.id_auteur'
							, 'b.id_courrier='.sql_quote($id_courrier)
							)
						, 'a.email'
					);
				}
					
				$nb_destinataires = sql_count($sql_adresses_dest);
				spiplistes_log($prefix_log.'nb etiquettes a traiter: '.$nb_destinataires);
				if($nb_destinataires > 0) {

					spiplistes_debug_log($prefix_log.'total_abos: '.$total_abonnes.', en cours: '.$nb_destinataires.', limit: '.$limit);

/*
// CP:20100215: inutile de compter AVANT
// si process en //, le chiffre est faux
					// replacer les compteurs
					if($row = sql_fetch(sql_select(
						"nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html"
						, 'spip_courriers'
						, 'id_courrier='.sql_quote($id_courrier)
						, '', '', 1
						))
					) {
						$nb_emails_envoyes = intval($row['nb_emails_envoyes']);
						$nb_emails_echec = intval($row['nb_emails_echec']);
						$nb_emails_non_envoyes = intval($row['nb_emails_non_envoyes']);
						$nb_emails['texte'] = intval($row['nb_emails_texte']);
						$nb_emails['html'] = intval($row['nb_emails_html']);
					}
*/

					//envoyer le lot d'emails selectionne' (la liasse)
					while($adresse = sql_fetch($sql_adresses_dest)) {

						if($log_voir_destinataire) {
							$str_temp = '';
						}

						$id_auteur = intval($adresse['id_auteur']);
						$nom_auteur = $adresse['nom'];
						$email = $adresse['email'];

						// Marquer le debut de l'envoi
						if(!intval($date_debut_envoi)) {
							spiplistes_courrier_modifier ($id_courrier, array('date_debut_envoi' => 'NOW()'), false);
						}
				
						$format_abo = spiplistes_format_abo_demande($id_auteur);

						$total++;
						if($log_voir_destinataire) {
							$str_temp .= $nom_auteur.'('.$format_abo.') - '.$email;
						}
						unset ($cookie);
		
						if(($format_abo=='html') || ($format_abo=='texte')) {
							$cookie = creer_uniqid();
							spiplistes_auteurs_cookie_oubli_updateq($cookie, $email);
		
							if($from_valide) {
								//$_url = generer_url_public('abonnement','d='.$cookie);
								
								if($opt_personnaliser_courrier == 'oui') {
									list($ventre_html, $ventre_texte) = spiplistes_personnaliser_courrier(
																			$page_html
																			, $page_texte
																			, $id_auteur
																			, $format_abo
																		);
								}
								else {
									$ventre_html = $page_html;
									$ventre_texte = $page_texte;
								}
								// le &amp; semble poser probleme sur certains MUA. A suivre...
								//$_url = preg_replace(',(&amp;),','&', $_url);
								
								// Pour le moment (27/03/2011), un seul patron connu
								$lien_rappel = 'lien_standard';
								
								list($pied_rappel_html, $pied_rappel_texte) = spiplistes_courriers_assembler_patron (
									_SPIPLISTES_PATRONS_LIEN_DIR . $lien_rappel
									, array('id_courrier' => $id_courrier
											, 'id_liste' => $id_liste
											, '_url' => generer_url_public()
											, 'lang' => $lang
											, 'd' => $cookie
											, 'lien_desabo' => ($opt_ajout_lien_desabo == 'oui')
											)
								);
								$pied_rappel_texte = spiplistes_translate_2_charset ($pied_rappel_texte
																					 , $charset_dest
																					 , true);
								
								switch($format_abo) {
									case 'html':
										// Si on ne trouve pas les tags HTML alors on les ajoutes
										if (FALSE === strpos($ventre_html, '</html>')) {
											$email_a_envoyer[$format_abo]->Body =
												  $body_html_debut . $eol
												. $ventre_html . $eol
												. $pied_html . $eol
												. $pied_rappel_html . $eol
												. $tampon_html . $eol
												. $body_html_fin
												;										
										} else {
											// Si on trouve les tags HTML cela veut dire que l'auteur
											// veut pouvoir gerer lui meme la partie <head> ainsi que le lien de desabonnement
											// donc on ne prend en compte que la partie ventre_html.
											$tags_perso = array('http://%URL_ABONNEMENT%' => generer_url_public('abonnement','d='.$cookie),);
											$email_a_envoyer[$format_abo]->Body = str_replace(array_keys($tags_perso), array_values($tags_perso), $ventre_html);
										}
										// la version alternative texte 
										$email_a_envoyer[$format_abo]->AltBody = 
											$ventre_texte .$eol2
											. $pied_texte . $eol2
											. $pied_rappel_texte . $eol2
											. $tampon_texte
											;
										break;
									case 'texte':
										$email_a_envoyer[$format_abo]->Body =
											$ventre_texte .$eol2
											. $pied_texte . $eol2
											. $pied_rappel_texte . $eol2
											. $tampon_texte
											;
										break;
								}

								$email_a_envoyer[$format_abo]->SetAddress($email, $nom_auteur);
								// envoie le mail																
								if($simuler_envoi || $email_a_envoyer[$format_abo]->send()) {
									$nb_emails_envoyes++;
									$nb_emails[$format_abo]++;
									if($log_voir_destinataire) {
										$str_temp .= '  [OK]';
									}
								}
								else {
									$nb_emails_echec++;
									if($log_voir_destinataire) {
										$str_temp .= _T('spiplistes:erreur_mail');
									}
								}
							}
							else {
								$nb_emails_echec++;
								if($log_voir_destinataire) {
									$str_temp .= _T('spiplistes:sans_adresse');
								}
							} 
							
						} // end if(($format_abo=='html') || ($format_abo=='texte'))
						else {  
							$nb_emails_non_envoyes++; 
							if($log_voir_destinataire) {
								$str_temp .= ' '._T('spiplistes:msg_abonne_sans_format');
							}
							// prevenir qu'il manque le format
							spiplistes_log($prefix_log.' destination format MISSING FOR ID_AUTEUR #'.$id_auteur);
						} /* fin abo*/
						
						if($log_voir_destinataire) {
							spiplistes_log($prefix_log.$str_temp);
						}
						
					} // fin while
					
					// supprime la liasse de la queue d'envois
					spiplistes_debug_log($prefix_log."envoi OK. Supprimer queue $id_process");
					spiplistes_courriers_en_queue_supprimer('etat='.sql_quote($id_process));
					
					// si c'est un test on repasse le courrier en redac
					if($is_a_test) {
						spiplistes_courriers_statut_redac ($id_courrier);
					}
					$email_a_envoyer['texte']->SmtpClose();
					$email_a_envoyer['html']->SmtpClose();
				} // end if 
			}
			else {
				//aucun destinataire connu pour ce message
				spiplistes_debug_log($prefix_log._T('spiplistes:erreur_sans_destinataire')
									 . '---' . _T('spiplistes:envoi_annule')
									 );
				spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_IGNORE);
				spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier);
				$str_log .= ' END #'.$id_courrier;
				// 
				break;
			}

			if(!$is_a_test) {
				// faire le bilan apres l'envoi d'un lot
				$sql_set_array = array(
					  'nb_emails_envoyes' => sql_quote('nb_emails_envoyes').'+'.$nb_emails_envoyes
					, 'nb_emails_texte' => sql_quote('nb_emails_texte').'+'.$nb_emails['texte']
					, 'nb_emails_html' => sql_quote('nb_emails_html').'+'.$nb_emails['html']
				);
				if($nb_emails_echec) {
					$sql_set_array['nb_emails_echec'] = sql_quote('nb_emails_echec').'+'.$nb_emails_echec;
				}
				if($nb_emails_non_envoyes) {
					$sql_set_array['nb_emails_non_envoyes'] = sql_quote('nb_emails_non_envoyes').'+'.$nb_emails_non_envoyes;
				}

				spiplistes_log($prefix_log.$str_log);
				
				$str_log = spiplistes_trace_compteur ($id_courrier
												   , $nb_emails_envoyes
												   , $nb_emails['html']
												   , $nb_emails['texte']
												   , $nb_emails_non_envoyes
												   , $nb_emails_echec
												   , 'SESSION');

				// si courrier pas termine, redemande la main au CRON, sinon nettoyage.
				if($t = spiplistes_courriers_en_queue_compter('id_courrier='.sql_quote($id_courrier))) {
					$str_log .= ' LEFT '.$t.' jobs'; 
				}
				else {
					$statut = ($type == _SPIPLISTES_COURRIER_TYPE_NEWSLETTER) ? _SPIPLISTES_COURRIER_STATUT_PUBLIE : _SPIPLISTES_COURRIER_STATUT_AUTO;
					spiplistes_debug_log($prefix_log."nouveau statut $statut");
					$sql_set_array['statut'] = sql_quote($statut);
					$sql_set_array['date_fin_envoi'] = 'NOW()';
					$str_log .= ' END #'.$id_courrier;
				}
				spiplistes_courrier_modifier($id_courrier, $sql_set_array, false);
				
				// placer en log le suivi des compteurs si mode debug
				if (spiplistes_debug_log())
				{					
					if ($row = sql_fetch(sql_select(
						'nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html'
						, 'spip_courriers'
						, 'id_courrier='.sql_quote($id_courrier)
						, '', '', 1
						))
					) {
						spiplistes_log($prefix_log.$str_log);
						
						$str_log = spiplistes_trace_compteur ($id_courrier
												   , $row['nb_emails_envoyes']
												   , $row['nb_emails_html']
												   , $row['nb_emails_texte']
												   , $row['nb_emails_non_envoyes']
												   , $row['nb_emails_echec']
												   , 'FROM_DB')
												. ' END #'.$id_courrier;
												;
					}
				}
				
			}
		} // end while()
	} // end if($nb_etiquettes)
	else {
		$str_log = 'no job'; 
	}

	spiplistes_log($prefix_log.$str_log);

	if(($ii = spiplistes_courriers_total_abonnes()) > 0) {
		// il en reste apres la meleuse ? Signale au CRON tache non terminee
		$nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide);
		spiplistes_log($prefix_log.'courriers prets au depart ('.$nb_etiquettes.'/'.$ii.')');
		$last_time = -$last_time;
	}
	
	return($last_time);
} // end spiplistes_meleuse()
Exemple #16
0
/**
 * Retourne un texte HTML présentant la liste des dépendances d'un plugin 
 *
 * Des liens vers les plugins dépendants sont présents lorsque les plugins
 * en dépendance sont connus dans notre base.
 * 
 * @param string $balise_serialisee
 *     Informations des dépendances (tableau sérialisé) tel que stocké
 *     en base dans la table spip_paquets
 * @param string $dependance
 *     Type de dépendances à afficher (necessite ou utilise).
 *     Une autre valeur indique qu'on demande la liste des librairies dépendantes.
 * @param string $sep
 *     Séparateur entre les noms de dépendances
 * @param string $lien
 * 	   Type de lien affecté au plugin référencé dans la base locale. Prend les valeurs :
 *
 * 		- local : le lien pointe vers la page publique du plugin sur le site lui-même. Il faut
 * donc que le site propose des pages publiques pour les plugins sinon une 404 sera affichée;
 * 		- pluginspip : le lien pointe vers la page du plugin sur le site de référence Plugins SPIP;
 * 		- non : aucun lien n'est affiché.
 * @return string
 *     Texte informant des dépendances
**/
function svp_afficher_dependances($balise_serialisee, $dependance = 'necessite', $sep = '<br />', $lien = 'local')
{
    $texte = '';
    $t = unserialize($balise_serialisee);
    $dependances = $t[$dependance];
    if (is_array($dependances)) {
        ksort($dependances);
        foreach ($dependances as $_compatibilite => $_dependance) {
            $compatibilite = $_compatibilite !== 0 ? _T('svp:info_compatibilite_dependance', array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP'))) : '';
            if ($compatibilite) {
                $texte .= ($texte ? str_repeat($sep, 2) : '') . $compatibilite;
            }
            foreach ($_dependance as $_plugin) {
                if ($texte) {
                    $texte .= $sep;
                }
                if ($dependance == 'necessite' or $dependance == 'utilise') {
                    if ($plugin = sql_fetsel('id_plugin, nom', 'spip_plugins', 'prefixe=' . sql_quote($_plugin['nom']))) {
                        $nom = extraire_multi($plugin['nom']);
                        if ($lien == 'non') {
                            $logiciel = $nom;
                        } else {
                            $url = $lien == 'local' ? generer_url_entite($plugin['id_plugin'], 'plugin') : "http://plugins.spip.net/{$_plugin['nom']}.html";
                            $bulle = _T('svp:bulle_aller_plugin');
                            $logiciel = '<a href="' . $url . '" title="' . $bulle . '">' . $nom . '</a>';
                        }
                    } else {
                        // Cas ou le plugin n'est pas encore dans la base SVP.
                        // On affiche son préfixe, cependant ce n'est pas un affichage devant perdurer
                        $logiciel = $_plugin['nom'];
                    }
                    $intervalle = '';
                    if (isset($_plugin['compatibilite'])) {
                        $intervalle = svp_afficher_intervalle($_plugin['compatibilite'], $logiciel);
                    }
                    $texte .= $intervalle ? $intervalle : $logiciel;
                } else {
                    // On demande l'affichage des librairies
                    $texte .= '<a href="' . $_plugin['lien'] . '" title="' . _T('svp:bulle_telecharger_librairie') . '">' . $_plugin['nom'] . '</a>';
                }
            }
        }
    }
    return $texte;
}
function exec_spiplistes_liste_gerer () {

	include_spip('inc/autoriser');
	include_spip('inc/mots');
	include_spip('inc/lang');
	include_spip('inc/editer_auteurs');
	include_spip('base/spiplistes_tables');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_presentation');
	include_spip('inc/spiplistes_dater_envoi');
	include_spip('inc/spiplistes_naviguer_paniers');
	include_spip('inc/spiplistes_listes_selectionner_auteur');
	
	global $meta
		, $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		, $spip_lang_left
		, $spip_lang_right
		, $couleur_claire
		;

	// initialise les variables postees par le formulaire
	foreach(array(
		'new'	// nouvelle liste si 'oui'
		, 'id_liste'// si modif dans l'editeur
		, 'btn_liste_edit', 'titre', 'texte', 'pied_page' // renvoyes par l'editeur
		, 'btn_modifier_diffusion', 'changer_lang', 'statut' // local
		, 'btn_modifier_replyto', 'email_envoi' // local
		, 'btn_modifier_courrier_auto', 'message_auto' // local
			, 'auto_chrono', 'auto_weekly', 'auto_mois'
			, 'titre_message', 'patron', 'periode', 'envoyer_maintenant'
			, 'jour', 'mois', 'annee', 'heure', 'minute'
		, 'btn_patron_pied', 'btn_grand_patron' // boites gauches
		, 'btn_valider_forcer_abos', 'forcer_abo', 'forcer_format_abo', 'forcer_format_reception'
		, 'btn_supprimer_liste' //local
		) as $key) {
		$$key = _request($key);
	}
	foreach(array('id_liste', 'periode') as $key) {
		$$key = intval($$key);
	}
	foreach(array('titre', 'texte', 'pied_page') as $key) {
		$$key = trim(corriger_caracteres($$key));
	}
	$lang = $changer_lang;

	$cherche_auteur = _request('cherche_auteur');
	$debut = _request('debut');

	$envoyer_maintenant = ($envoyer_maintenant == 'oui');
	
	$boite_pour_confirmer_envoi_maintenant = 
		$grosse_boite_moderateurs = 
		$message_erreur =
		$page_result = "";

	if(!$id_liste)
	{
	//////////////////////////////////////////////////////
	// Creer une liste
	////
		// admin lambda peut creer une liste
		$flag_editable = ($connect_statut == "0minirezo");
		
		if ($btn_liste_edit && ($new=='oui')) {
			
			if ($titre == '') {
				$titre = _T('spiplistes:liste_sans_titre');
			}
			
			$pied_page = _SPIPLISTES_PATRON_PIED_DEFAUT;
			
			if($id_liste = spiplistes_listes_liste_creer(_SPIPLISTES_LIST_PRIVATE, $GLOBALS['spip_lang']
				, $titre, $texte, $pied_page)) {
					spiplistes_log("id_liste #$id_liste added by id_auteur #$connect_id_auteur");
			}
		} 	
	}
	else if($id_liste > 0)
	{
	//////////////////////////////////////////////////////
	// Modifier une liste
	////
		// les admins toutes rubriques et le moderateur seuls peuvent modifier la liste
		$flag_editable = autoriser('moderer', 'liste', $id_liste);

		if($flag_editable)
		{
		
			// Recupere les donnees de la liste courante pour optimiser l'update
			$sql_select = "statut,titre,date,lang";
			$sql_result = sql_select($sql_select, "spip_listes", "id_liste=".sql_quote($id_liste), "", "", "1");
			if($row = sql_fetch($sql_result)) {
				foreach(explode(",", $sql_select) as $key) {
					$current_liste[$key] = $row[$key];
				}
			}
			
			///////////////////////////////////
			// Les modifications (sql_upadteq)
			// A noter, ne pas preparer les valeurs par sql_quote()
			//  sql_upadteq() s'en occupe
			
			$sql_champs = array();

			// Retour de l'editeur ?
			if($btn_liste_edit) {
				$titre = corriger_caracteres($titre);
				$texte = corriger_caracteres($texte);
				if(empty($titre)) {
					$titre = filtrer_entites(_T('spiplistes:Nouvelle_liste_de_diffusion'));
				}
				$sql_champs['titre'] = $titre;
				$sql_champs['texte'] = $texte;
			}
			
			// Modifier le grand patron ?
			// a partir de 2.0049, le patron de pied est construit par la meleuse
			// afin de permettre _texte et multilingue
			if($btn_grand_patron && $patron) {
				$sql_champs['patron'] = $patron;
			}
			
			// Modifier patron de pied ?
			if($btn_patron_pied && $patron) {
				$sql_champs['pied_page'] = $patron;
			}
			
			// Modifier diffusion ?
			if($btn_modifier_diffusion)
			{
				$current_statut = ($statut)
					? $statut
					: $current_liste['statut']
					;
					
				spiplistes_debug_log ('Modification diffusion statut: '.$current_statut);
				
				// Modifier le statut ?
				if(in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_TOUS)) 
					&& ($statut != $current_liste['statut'])
				) {
					spiplistes_debug_log ('Modification statut: '.$statut);
					$sql_champs['statut'] = $statut;
					// si la liste passe en privee, retire les invites
					if($statut == _SPIPLISTES_LIST_PRIVATE) {
						$auteur_statut = '6forum';
						spiplistes_abonnements_auteurs_supprimer($auteur_statut);
						spiplistes_log("AUTEURS ($auteur_statut) REMOVED FROM LISTE #$id_liste ($statut) BY ID_AUTEUR #$connect_id_auteur");
					}
				}
				// Modifier la langue ?
				if(!empty($lang) && ($lang!=$current_liste['lang'])) {
					$sql_champs['lang'] = $lang;
				}
			}
			
			// Modifier l'adresse email de reponse ?
			if($btn_modifier_replyto && email_valide($email_envoi) && ($email_envoi!=$current_liste['email_envoi'])) {
				$sql_champs['email_envoi'] = $email_envoi;
			}

			////////////////////////////////////
			// Modifier message_auto ?
			// bloc "courriers automatiques"
			if($btn_modifier_courrier_auto)
			{
				$current_statut = ($statut)
					? $statut
					: $current_liste['statut']
					;
					
				spiplistes_debug_log ('Modification periodicite statut: '.$current_statut);
				
				$envoyer_quand = spiplistes_formate_date_form($annee, $mois, $jour, $heure, $minute);
			
				if(time() > strtotime($envoyer_quand)) {
				// envoi dans le passe est considere comme envoyer maintenant
					$envoyer_maintenant = true;
					$date_depuis = $envoyer_quand;
					$envoyer_quand = false;
				}
				// spiplistes_debug_log("nb vrais abos : ".spiplistes_listes_vrais_abos_compter($id_liste));
				if($envoyer_maintenant && ($message_auto != 'non')) {
					if(!spiplistes_listes_vrais_abos_compter($id_liste)) {
						$boite_pour_confirmer_envoi_maintenant .= 
							spiplistes_boite_alerte(_T('spiplistes:boite_alerte_manque_vrais_abos'), true);
					}
					else {
						$boite_pour_confirmer_envoi_maintenant = ""
							. debut_cadre_couleur('', true)
							// formulaire de confirmation envoi
							. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTES_LISTE), true)
							. "<p style='text-align:center;font-weight:bold;' class='verdana2'>"
							. _T('spiplistes:boite_confirmez_envoi_liste') . "</p>"
							. "<input type='hidden' name='id_liste' value='$id_liste' />\n"
							. spiplistes_form_bouton_valider('btn_confirmer_envoi_maintenant')
							. spiplistes_form_fin(true)
							. fin_cadre_couleur(true)
							;
					}
					$date_prevue = normaliser_date(time());
				}

				if($message_auto == 'oui') {
				
					$sql_champs['message_auto'] = 'oui';
					$sql_champs['titre_message'] = $titre_message;
					$sql_champs['date'] = (!$envoyer_maintenant) ? $envoyer_quand : '';
					
					switch($auto_chrono) {
						case 'auto_jour':
							$sql_champs['statut'] =
								($current_statut == _SPIPLISTES_LIST_PRIVATE)
								? _SPIPLISTES_LIST_PRIV_DAILY
								: _SPIPLISTES_LIST_PUB_DAILY
								;
							// force au minimum 1 jour
							$sql_champs['periode'] = (($periode > 0) ? $periode : 1);
							break;
						case 'auto_hebdo':
							if($auto_weekly == 'oui') {
								// debut de semaine ?
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_WEEKLY
									: _SPIPLISTES_LIST_PUB_WEEKLY
									;
								// corrige la date pour le lundi de la semaine
								$time = strtotime($envoyer_quand);
								$time = mktime(0,0,0,date("m", $time),date("d", $time)-date("w", $time)+1,date("Y", $time));
    							$envoyer_quand = date("Y-m-d H:i:s", $time);
	 							$sql_champs['date'] = $envoyer_quand;
							} else {
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_HEBDO
									: _SPIPLISTES_LIST_PUB_HEBDO
									;
							}
							$sql_champs['periode'] = 0;
							break;
						case 'auto_mensuel':
							if($auto_mois == 'oui') {
								// debut du mois ?
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_MONTHLY
									: _SPIPLISTES_LIST_PUB_MONTHLY
									;
								// corrige la date, 1' du mois
								$envoyer_quand = substr($envoyer_quand, 0, 8)."01 00:00:00";
								$sql_champs['date'] = $envoyer_quand;
							} else {
								$sql_champs['statut'] =
									($current_statut == _SPIPLISTES_LIST_PRIVATE)
									? _SPIPLISTES_LIST_PRIV_MENSUEL
									: _SPIPLISTES_LIST_PUB_MENSUEL
									;
							}
							$sql_champs['periode'] = 0;
							break;
						case 'auto_an':
							$sql_champs['statut'] =
								($current_statut == _SPIPLISTES_LIST_PRIVATE)
								? _SPIPLISTES_LIST_PRIV_YEARLY
								: _SPIPLISTES_LIST_PUB_YEARLY
								;
							$sql_champs['periode'] = 0;
							break;
					}
				}
				else if($message_auto == 'non') {
					$sql_champs['message_auto'] = 'non';
					$sql_champs['date'] = '';
					$sql_champs['periode'] = 0;
				}
			} // end if($btn_modifier_courrier_auto)
			
			// Enregistre les modifs pour cette liste
			if(count($sql_champs))
			{
				sql_updateq('spip_listes', $sql_champs, 'id_liste='.sql_quote($id_liste).' LIMIT 1');
			}
			
			// Forcer les abonnements
			if($btn_valider_forcer_abos && $forcer_abo && in_array($forcer_abo, array('tous', 'auteurs', '6forum', 'aucun'))) {
				
				$forcer_format_reception = 
					(($forcer_format_abo == 'oui') && in_array($forcer_format_reception, spiplistes_formats_autorises()))
					? $forcer_format_reception
					: false
					;
				include_spip('inc/spiplistes_listes_forcer_abonnement');
				
				if(spiplistes_listes_forcer_abonnement ($id_liste, $forcer_abo, $forcer_format_reception) ===  false) {
					$message_erreur .= spiplistes_boite_alerte(_T('spiplistes:Forcer_abonnement_erreur'), true);
				}
			}
			
		} // end if($flag_editable)
	}

	//////////////////////////////////////////////////////
	// Recharge les donnees la liste

	$sql_select_array = array('id_liste', 'titre', 'texte'
			, 'titre_message', 'pied_page', 'date', 'statut', 'maj'
			, 'email_envoi', 'message_auto', 'periode', 'patron', 'lang');

	if($row = spiplistes_listes_liste_fetsel($id_liste, $sql_select_array)) {
		foreach($sql_select_array as $key) {
			// initialise les variables du resultat SQL
			$$key = $row[$key];
		}
	}

	// les supers-admins et le moderateur seuls peuvent modifier la liste
	$flag_editable = autoriser('moderer', 'liste', $id_liste);

	if (empty($titre_message))
	{
		$titre_message = $titre;
		if (spiplistes_pref_lire_defaut('opt_completer_titre_nom_site', 'oui') == 'oui')
		{
			$titre_message .= _T('spiplistes:_de_')
				. spiplistes_nom_site_texte($lang);
		}
	}
	
	$nb_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste);

	// preparation des boutons 
	if($flag_editable) {
		// Propose de modifier la liste 
		$gros_bouton_modifier = 
			icone (
				_T('spiplistes:Modifier_cette_liste') // legende bouton
				, generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_EDIT,'id_liste='.$id_liste) // lien
				, _DIR_PLUGIN_SPIPLISTES_IMG_PACK."reply-to-all-24.gif" // image du fond
				, "edit.gif" // image de la fonction. Ici, le crayon
				, '' // alignement
				, false // pas echo, demande retour
				)
			;
		// Propose de supprimer la liste 
		$gros_bouton_supprimer = 
			icone (
					_T('spiplistes:Supprimer_cette_liste')
					, generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "btn_supprimer_liste=$id_liste&id_liste=$id_liste")
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'poubelle_msg.gif'
					, ""
					, "right"
					, false
					)
			;
			
		// la grosse boite des abonnes
		$tri = _request('tri') ? _request('tri') : 'nom';
		//
		// CP-20101017: Si trop d'elligibles, ca gele.
		// @todo: revoir la boite/liste des abonnes/elligibles
		// En attendant ...
		//if(spiplistes_auteurs_elligibles_compter() < 1000)
		//{
			$boite_liste_abonnes = spiplistes_listes_boite_abonnements(
				$id_liste, $statut, $tri, $debut, _SPIPLISTES_EXEC_LISTE_GERER
			);
		//}
		//else
		//{
		//	$boite_liste_abonnes = _T('spiplistes:code_en_travaux');
		//}
		
		
		// @see http://www.spip-contrib.net/SPIP-Listes#comment444314
		
		
		
		$titre_boite = _T('spiplistes:abos_cette_liste');
		$legend = '<small id="legend-abos1">'
			. spiplistes_nb_abonnes_liste_str_get($id_liste)
			. '</small>'.PHP_EOL
			;
		$grosse_boite_abonnements = ''
			. '<!-- boite abonnes/elligibles -->'.PHP_EOL
			. debut_cadre_enfonce('auteur-24.gif', true, '', $titre_boite)
			. spiplistes_bouton_block_depliable($legend
				, false, md5('abonnes_liste'))
			. (spiplistes_spip_est_inferieur_193() ? $legend : '')
			. spiplistes_debut_block_invisible(md5('abonnes_liste'))
			. debut_cadre_relief('', true)
			. $boite_liste_abonnes
			. fin_cadre_relief(true)
			. fin_block()
			. fin_cadre_enfonce(true)
			. '<!-- fin boite abonnes/elligibles -->'.PHP_EOL
			;

		// la grosse boite des moderateurs
		$boite_liste_moderateurs = spiplistes_listes_boite_moderateurs(
			$id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'mods-conteneur'
			);
		$titre_boite = _T('spiplistes:mods_cette_liste');
		$nb = spiplistes_mod_listes_compter($id_liste);
		$legend = '<small>'
			. spiplistes_nb_moderateurs_liste_str_get($nb)
			. '</small>'.PHP_EOL
			;
		$grosse_boite_moderateurs = ''
			. '<!-- boite moderateurs -->'.PHP_EOL
			. debut_cadre_enfonce('redacteurs-24.gif', true, '', $titre_boite)
			. spiplistes_bouton_block_depliable($legend
				, false, md5('mods_liste'))
			. (spiplistes_spip_est_inferieur_193() ? $legend : '')
			. spiplistes_debut_block_invisible(md5('mods_liste'))
			. debut_cadre_relief('', true)
			. '<div id="mods-conteneur">'.PHP_EOL
			. $boite_liste_moderateurs
			. '</div>'.PHP_EOL
			. fin_cadre_relief(true)
			. fin_block()
			. fin_cadre_enfonce(true)
			. '<!-- fin boite moderateurs -->'.PHP_EOL
			;

	}
	else {
		$gros_bouton_modifier = $gros_bouton_supprimer = $grosse_boite_abonnements = '';
	}

////////////////////////////////////
// PAGE CONTENU
////////////////////////////////////

	$titre_page = _T('spiplistes:gestion_dune_liste');
	// Permet entre autres d'ajouter les classes a la page : <body class='$rubrique $sous_rubrique'>
	$rubrique = _SPIPLISTES_PREFIX;
	$sous_rubrique = 'liste_gerer';

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . ' - ' . $titre_page, $rubrique, $sous_rubrique));

	// la gestion des listes de courriers est reservee aux admins 
	if($connect_statut != '0minirezo') {
		die (spiplistes_terminer_page_non_autorisee() . fin_page());
	}

	$page_result .= ''
		. '<br /><br /><br />' . PHP_EOL
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. spiplistes_boite_info_id(_T('spiplistes:liste_numero'), $id_liste, true)
		. spiplistes_naviguer_paniers_listes(_T('spiplistes:aller_aux_listes_'), true)
		. spiplistes_boite_patron($flag_editable, $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'btn_grand_patron'
			, _SPIPLISTES_PATRONS_DIR, _T('spiplistes:Patron_grand_')
			, ($patron ? $patron : '')
			, $patron)
		. spiplistes_boite_patron($flag_editable, $id_liste, _SPIPLISTES_EXEC_LISTE_GERER, 'btn_patron_pied'
			, _SPIPLISTES_PATRONS_PIED_DIR, _T('spiplistes:Patron_de_pied_')
			, ((($ii = strlen($pied_page)) > _SPIPLISTES_PATRON_FILENAMEMAX) 
				? _T('taille_octets',array('taille'=>$ii)) . _T('spiplistes:conseil_regenerer_pied')
				: $pied_page)
			, $pied_page)
		. pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		//. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
		. spiplistes_boite_raccourcis(true)
		. spiplistes_boite_autocron()
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		. $message_erreur
		;

	changer_typo('','liste'.$id_liste);

	// message alerte et demande de confirmation si supprimer liste
	if(($btn_supprimer_liste > 0) && ($btn_supprimer_liste == $id_liste)) {
		$page_result .= ''
			. spiplistes_boite_alerte (_T('spiplistes:Attention_suppression_liste').'<br />'._T('spiplistes:Confirmez_requete'), true)
			. '<form name="form_suppr_liste" id="form_suppr_liste" method="post"
				action="'.generer_url_ecrire(_SPIPLISTES_EXEC_LISTES_LISTE, '').'">' . PHP_EOL
			. "<div class='verdana2' style='text-align:right;'>\n"
			. "<input type='hidden' name='id_liste' value='$id_liste' />\n"
   		. "<label>"._T('spiplistes:Confirmer_la_suppression_de_la_liste')."# $id_liste : \n"
   		. "<input class='fondo' type='submit' name='btn_supprimer_liste_confirme' value='"._T('bouton_valider')."' /></label>\n"
			. "</div>\n"
			. "</form>\n"
			. "<br />\n"
		;
	}

	$page_result .= ""
		. debut_cadre_relief("", true)
		. "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n"
		. "<tr><td valign='top'>\n"
		. spiplistes_gros_titre(spiplistes_bullet_titre_liste('puce', $statut, '', true)." "
			. spiplistes_calculer_balise_titre(extraire_multi($titre))
			, '', true)
		. "</td>"
		. "<td rowspan='2'>"
		// le gros bouton modifier si besoin
		. $gros_bouton_modifier
		. "</td></tr>\n"
		. "<tr><td width='100%'>\n"
		. "<div align='$spip_lang_left' style='padding: 5px; border: 1px dashed #aaa; ' class='verdana1 spip_small'>\n"
		. propre($texte."~")
		. "</div>\n"
		. "</td>\n"
		. "</tr></table>\n"
		;

	
	//////////////////////////////////////////////////////
	// Modifier le statut de la liste
	//$email_defaut = entites_html($meta['email_webmaster']);
	$email_defaut = ($m = email_valide($GLOBALS['meta']['email_defaut']))
		? $m
		: $GLOBALS['meta']['email_webmaster']
		;
	$email_envoi = ($m = email_valide($email_envoi))
		? $email_envoi
		: $email_defaut
		;

	$page_result .= ""
		//. debut_cadre_relief("racine-site-24.gif", true)
		. debut_cadre_relief("racine-site-24.gif", true, '', _T('spiplistes:Diffusion').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "diffusion"))
		//
		////////////////////////////
		// Formulaire diffusion
		.	(
			($flag_editable)
			? ''
				. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,'id_liste='.$id_liste), true)
				. '<input type="hidden" name="exec" value="listes" />' . PHP_EOL
				. '<input type="hidden" name="id_liste" value="'.$id_liste.'" />' . PHP_EOL
			: ''
			)
		. '<span class="verdana2">'
			. _T('spiplistes:cette_liste_est_'
			 	, array('s' => spiplistes_bullet_titre_liste ('puce', $statut, 'img_statut', true)))
		. '</span>' . PHP_EOL
		;

		$sel_private = ' value="' . _SPIPLISTES_LIST_PRIVATE . '" ' 
			. 	(
					in_array ($statut, array(
									_SPIPLISTES_LIST_PRIVATE
									, _SPIPLISTES_LIST_PRIV_DAILY
									, _SPIPLISTES_LIST_PRIV_HEBDO
									, _SPIPLISTES_LIST_PRIV_WEEKLY
									, _SPIPLISTES_LIST_PRIV_MENSUEL
									, _SPIPLISTES_LIST_PRIV_MONTHLY
									, _SPIPLISTES_LIST_PRIV_YEARLY
									)
						 )
					? ' selected="selected"' 
					: ''
				)
				;
		$sel_publique = ' value="' . _SPIPLISTES_LIST_PUBLIC . '" ' 
			. 	(
					in_array ($statut, array(
									_SPIPLISTES_LIST_PUBLIC
									, _SPIPLISTES_LIST_PUB_DAILY
									, _SPIPLISTES_LIST_PUB_HEBDO
									, _SPIPLISTES_LIST_PUB_WEEKLY
									, _SPIPLISTES_LIST_PUB_MENSUEL
									, _SPIPLISTES_LIST_PUB_MONTHLY
									, _SPIPLISTES_LIST_PUB_YEARLY
									)
						 )
					? ' selected="selected"' 
					: ''
				)
				;
	$page_result .= PHP_EOL
		.	(
			($flag_editable)
			? ''
				. '<select class="verdana2 fondl" name="statut" size="1" id="change_statut">' . PHP_EOL
				. '<option' . $sel_private . ' style="background-color:#fff">'
					. _T('spiplistes:statut_interne')
					. '</option>' . PHP_EOL
				. '<option' . $sel_publique . ' style="background-color:#B4E8C5">'
					. _T('spiplistes:statut_publique')
					. '</option>' . PHP_EOL
				. '<option' . mySel(_SPIPLISTES_TRASH_LIST, $statut)
					. ' style="background:url(' . _DIR_IMG_PACK.'rayures-sup.gif)">'
					. _T('texte_statut_poubelle').'</option>' . PHP_EOL
				. '</select>' . PHP_EOL
			: '<span class="verdana2" style="font-weight:bold;">'
				. spiplistes_items_get_item('alt', $statut)
				. '</span>'. PHP_EOL
			)
		. '<div style="margin:10px 0px;">' . PHP_EOL
		.	(
			($flag_editable && strpos($GLOBALS['meta']['langues_multilingue'], ','))
			? ''
				. '<label class="verdana2" for="changer_lang">'
					. _T('info_multi_herit').' : </label>' . PHP_EOL
				. '<select name="changer_lang" class="fondl" id="changer_lang">' . PHP_EOL
				. liste_options_langues('changer_lang', $lang , _T('spiplistes:langue_'), '', '')
				. '</select>' . PHP_EOL
			: ''
				//. "<span class='verdana2'>". _T('info_multi_herit')." : "
				//. "<span class='verdana2' style='font-weight:bold;'>".traduire_nom_langue($lang)."</span>\n"
			)
		. '</div>' . PHP_EOL
		.	(
				($flag_editable)
				? spiplistes_form_bouton_valider('btn_modifier_diffusion')
					. spiplistes_form_fin(true)
				: ''
			)
		. fin_cadre_relief(true)
		;

		////////////////////////////
		// Formulaire adresse email pour le reply-to
	$page_result .= ''
		. debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."reply_to-24.png"
							, true
							, ''
							, _T('spiplistes:adresse_de_reponse').spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE
								, "replyto")
							)
		. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste"), true)
		. "<p class='verdana2'>\n"
		. _T('spiplistes:adresse_mail_retour').":<br />\n"
		.	(
			($flag_editable)
			? _T('spiplistes:adresse')."</p>\n"
				. "<div style='text-align:center'>\n"
				. "<input type='text' name='email_envoi' value=\"".$email_envoi."\" size='40' class='fondl' /></div>\n"
				. spiplistes_form_bouton_valider('btn_modifier_replyto')
			: "</p><p style='font-weight:bold;text-align:center;'>$email_envoi</p>\n"
			)
		. spiplistes_form_fin(true)
		. fin_cadre_relief(true)
		;
		
		////////////////////////////
		// Formulaire planifier un courrier automatique
	$page_result .= ""
		. "<a name='form-programmer' id='form-programmer'></a>\n"
		. debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."stock_timer.png", true, '', _T('spiplistes:messages_auto')
			. spiplistes_plugin_aide(_SPIPLISTES_EXEC_AIDE, "temporiser"))
		;
	$page_result .= ""
		. $boite_pour_confirmer_envoi_maintenant
		. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste")."#form-programmer", true)
		. "<table border='0' cellspacing='1' cellpadding='3' width='100%'>\n"
		. "<tr><td align='$spip_lang_left' class='verdana2'>\n"
		;
	if(empty($patron)) {
		$page_result .= ""
			. (
				$flag_editable
				? spiplistes_boite_alerte(_T('spiplistes:patron_manquant_message'), true)
				: "<p class='verdana2'>" . _T('spiplistes:liste_sans_patron') . "</p>\n"
			  )
			. "</td>\n"
			. "</tr>\n"
			. "<tr><td align='$spip_lang_left' class='verdana2'>\n"
			;
	}
	if ($message_auto != "oui") {
		$page_result .= "<div class='verdana2'>"._T('spiplistes:pas_denvoi_auto_programme')."</div>\n";
	}
	else {
		$page_result .= ""
			// petite ligne d'info si envoi programme
			. "<p class='verdana2'>"._T('spiplistes:sujet_courrier_auto')."<br />\n"
			. "<span class='spip_large'> "
				. spiplistes_calculer_balise_titre(extraire_multi($titre_message))
				. "</span></p>\n"
			. "<p class='verdana2'>"
			. spiplistes_items_get_item('alt', $statut)."<br />\n"
			.	(	
					($statut == _SPIPLISTES_LIST_PUB_MONTHLY)
					?	"<strong>" . spiplistes_items_get_item("tab_t", $statut) . "</strong><br />"
					:	""
				)
			.	(
					($periode > 0)
					? _T('spiplistes:periodicite_tous_les_n_s'
						, array('n' => "  <strong>".$periode."</strong>  "
							, 's' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours'), false)
							)
						)
					: ""
				)
			.	(
					(!in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_PERIODIQUES)))
					? " <strong>"._T('spiplistes:Pas_de_periodicite')."</strong><br />"
						._T('spiplistes:Ce_courrier_ne_sera_envoye_qu_une_fois')
					: ""
				)
			.	"<br />"
			.	(
				(intval($maj))
				? _T('spiplistes:Dernier_envoi_le_') . " <strong>" . affdate_heure($maj) . "</strong>"
					.	(
						($last =  round((time() - strtotime($maj)) / _SPIPLISTES_TIME_1_DAY))
							? " (".spiplistes_singulier_pluriel_str_get($last, _T('spiplistes:jour'), _T('spiplistes:jours')).")"
							: ""
					). "<br />"
				: ""
				)
			.	(
				($date_prevue || (intval($date) && (time() < strtotime($date))))
				? _T('spiplistes:prochain_envoi_prevu')." : <strong>" . affdate_heure($date_prevue ? $date_prevue : $date) . "</strong>"
					.	(
						(!$date_prevue && ($next = round((strtotime($date) - time()) / _SPIPLISTES_TIME_1_DAY)))
							? " (".spiplistes_singulier_pluriel_str_get($next, _T('spiplistes:jour'), _T('spiplistes:jours')).")"
							: ""
						)
				: ""
				)
			. "</p>\n"
			;
		if($btn_modifier_courrier_auto) {
			$page_result .= ""
				. "<p class='verdana2'>"._T('spiplistes:date_act')."<br />"
				. _T('spiplistes:env_esquel')." <em>".$patron."</em>"
				. "</p>\n"
				;
		}
	}
	$date_debut_envoi = (!empty($date_prevue) ? $date_prevue : (($date && intval($date)) ? $date : normaliser_date(time())));

	$page_result .= ""
		. "</td>\n"
		. "</tr>\n"
		;
	if($flag_editable) {
		$page_result .= ""
			. "<tr><td align='$spip_lang_left' class='verdana2'>"
			. "<input type='radio' name='message_auto' value='oui' id='auto_oui' "
				. (empty($patron) ? " disabled='disabled' " : "")
				. ($auto_checked = ($message_auto=='oui' ? "checked='checked'" : ""))
				. " />"
			. "<label for='auto_oui' ".($auto_checked ? "style='font-weight:bold;'" : "").">"
				. _T('spiplistes:prog_env')."</label>\n"
			. "<div id='auto_oui_detail' "
				.((empty($patron) || !$auto_checked) ? "style='display:none;'" : "")
				.">"
			. "<ul style='list-style-type:none;'>\n"
			. "<li>"._T('spiplistes:message_sujet')
			. ': <input type="text" name="titre_message" value="'.$titre_message.'" size="50" class="fondl" /> </li>'."\n"
			;
			// 
			// chrono jour
			$ii = ($periode > 0) ? $periode : 1;
		$page_result .= ""
			. "<li style='margin-top:0.5em'>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_jour'
					, ''
					, ($statut == _SPIPLISTES_LIST_PUB_DAILY)
					, true, false
					)
				. _T('spiplistes:Tous_les')
				. " <input type='text' name='periode' value='".$ii."' size='4' maxlength='4' class='fondl' /> "
				. _T('info_jours')
				. "</li>\n"
			// chrono hebdo
			. "<li>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_hebdo'
					, _T('spiplistes:Toutes_les_semaines')
					, (($statut == _SPIPLISTES_LIST_PUB_HEBDO) || ($statut == _SPIPLISTES_LIST_PUB_WEEKLY))
					, true, false)
				. spiplistes_form_input_checkbox('auto_weekly', 'oui'
					, _T('spiplistes:en_debut_de_semaine'), ($statut == _SPIPLISTES_LIST_PUB_WEEKLY), true, false)
				. "</li>\n"
			// chrono mois
			. "<li>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_mensuel'
					, _T('spiplistes:Tous_les_mois')
					, (($statut == _SPIPLISTES_LIST_PUB_MENSUEL) || ($statut == _SPIPLISTES_LIST_PUB_MONTHLY))
					, true, false)
				. spiplistes_form_input_checkbox('auto_mois', 'oui'
					, _T('spiplistes:en_debut_de_mois'), ($statut == _SPIPLISTES_LIST_PUB_MONTHLY), true, false)
				. "</li>\n"
			// chrono annee
			. "<li>"
				. spiplistes_form_input_radio ('auto_chrono', 'auto_an'
					, _T('spiplistes:Tous_les_ans')
					, ($statut == _SPIPLISTES_LIST_PUB_YEARLY)
					, true, false)
				. "</li>\n"
			. "<li style='margin-top:0.5em'>"._T('spiplistes:A_partir_de')." : <br />\n"
			//
			. spiplistes_dater_envoi(
				'liste', $id_liste, $statut
				, $flag_editable
				, _T('spiplistes:date_expedition_')
				, $date_debut_envoi, 'btn_changer_date'
				, false
				)
			. "</li>\n"
			.	(
				(!$envoyer_maintenant)
				? " <li>"
					. spiplistes_form_input_checkbox('envoyer_maintenant', 'oui'
						, _T('spiplistes:env_maint'), false, true)
					. "</li>\n"
				: ""
				)
			. "</ul></div>\n"
			;
		$checked = ($message_auto=='non') ? "checked='checked'" : "";
		$class = $checked ? "class='bold'" : "";
		$disabled = (empty($patron) ? " disabled='disabled' " : "");
		$page_result .= ""
			. "<br /><input type='radio' name='message_auto' value='non' id='auto_non' $disabled $checked />"
			. "<span $class >"
			. " <label for='auto_non'>"._T('spiplistes:prog_env_non')."</label> "
			. "</span>\n"
			. "</td></tr>\n"
			;

		$page_result .= ""
			. "<tr><td style='text-align:$spip_lang_right;'>"
			. 	(
				($id_liste)
				? "<input type='hidden' name='id_liste' value='$id_liste' />"
				: ""
				)
			.	(
				($new)
				? "<input type='hidden' name='new' value='$new' />"
				: ""
				)
			// bouton de validation
			. (!empty($patron) 
				? spiplistes_form_bouton_valider('btn_modifier_courrier_auto', _T('bouton_valider'), true)
				: "")
			. "</td></tr>"
			;
	}
	$page_result .= ""
		. "</table>\n"
		. spiplistes_form_fin(true)
		. fin_cadre_relief(true)
		;
		// fin formulaire planifier
		
	$page_result .= ""
		. fin_cadre_relief(true)
		. $grosse_boite_abonnements
		. $grosse_boite_moderateurs
		;
	
	// le super-admin peut abonner en masse
	if($connect_toutes_rubriques) {
		$page_result .= ""
			. "\n<!-- forcer abo -->\n"
			. debut_cadre_enfonce(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."abonner-24.png", true, '', _T('spiplistes:forcer_les_abonnement_liste').spiplistes_plugin_aide("forcerliste"))."\n"
			. "<p class='verdana2'>\n"
			. _T('spiplistes:forcer_abonnement_desc')
			. "</p>\n"
			. "<p class='verdana2' style='margin-bottom:1em'><em>"
			. _T('spiplistes:forcer_abonnement_aide', array('lien_retour' => generer_url_ecrire(_SPIPLISTES_EXEC_ABONNES_LISTE)))
			. "</em></p>\n"
			. "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER,"id_liste=$id_liste#auteurs")."' id='form_forcer_abo' name='form_forcer_abo' method='post'>\n"
			. debut_cadre_relief("", true)."\n"
			//
			//////////////////////////
			// propose de forcer les membres sauf invites si la liste est privee
			.	(
					($statut==_SPIPLISTES_LIST_PRIVATE)
					? "<div class='verdana2'><input type='radio' name='forcer_abo' value='auteurs' id='forcer_abo_tous' />\n"
						. "<label for='forcer_abo_tous'>"._T('spiplistes:Abonner_tous_les_inscrits_prives')."</label>"
						. "</div>\n"
						. spiplistes_boutons_forcer_format('forcer_format', _T('spiplistes:forcer_abonnements_nouveaux'))
					: ""
				)
			//
			// propose de forcer les invites si la liste est publique ou periodique
			.	(
					(($statut!=_SPIPLISTES_LIST_PRIVATE) && ($statut!=_SPIPLISTES_TRASH_LIST))
					? "<div class='verdana2'><input type='radio' name='forcer_abo' value='6forum' id='forcer_abo_6forum' />\n"
						. "<label for='forcer_abo_6forum'>"._T('spiplistes:Abonner_tous_les_invites_public')."</label></div>\n"
						. spiplistes_boutons_forcer_format('forcer_format', _T('spiplistes:forcer_abonnements_nouveaux'))
					: ""
				)
			. (
				($nb_abonnes)
				? "<hr />\n"
					. "<div class='verdana2'><input type='radio' name='forcer_abo' value='aucun' id='forcer_desabo' />\n"
					. "<label for='forcer_desabo'>"._T('spiplistes:Forcer_desabonner_tous_les_inscrits')."</label></div>\n"
				: ""
				)
			. fin_cadre_relief(true)."\n"
			. "<div style='text-align:right;'><input type='submit' name='btn_valider_forcer_abos' value='"._T('bouton_valider')."' class='fondo' /></div>\n"
			. "</form>\n"
			. fin_cadre_enfonce (true)."\n"
		;
	}
	//
	$page_result .= ""
		. $gros_bouton_supprimer
		;
	
	echo($page_result);

	echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		, spiplistes_html_signature(_SPIPLISTES_PREFIX)
		, fin_gauche(), fin_page();

} // end exec_spiplistes_liste_gerer()
function spiplistes_lister_courriers_listes (
	$titre_tableau
	, $image
	, $element='listes'
	, $statut=''
	, $apres_maintenant=false
	, $nom_position='position'
	, $exec
	, $id_auteur=0
	, $pas=10
	, $return=true) {

	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier'); 

	$position = intval($_GET[$nom_position]);
	$pas = intval($pas);
	$id_auteur = intval($id_auteur);
	//$retour = _DIR_RESTREINT_ABS.self();
	$clause_where = '';
	
	//////////////////////////////////
	// requete
	// construction de la requete SQL
	// sera (en partie) utilisee plus bas pour compter et pagination
	switch($element) { 
		case 'abonnements':
			$sql_select = "listes.id_liste,listes.titre,listes.statut,listes.date,abos.id_auteur";
			$sql_from = "spip_auteurs_listes AS abos LEFT JOIN spip_listes AS listes ON abos.id_liste=listes.id_liste";
			$sql_where = "abos.id_auteur=".sql_quote($id_auteur);
			$sql_order = "listes.titre";
			break;
		case 'courriers':
			$sql_select = "id_courrier, titre, date, date_debut_envoi,date_fin_envoi, nb_emails_envoyes,total_abonnes,email_test";
			$sql_from = "spip_courriers";
			$sql_where = "statut=".sql_quote($statut);
			$sql_order = "date";
			break;
		case 'listes':
			if (
				// pour lister les listes programmees dans un futur 
				in_array($statut, explode(";", _SPIPLISTES_LISTES_STATUTS_OK)) 
				&& ($apres_maintenant == true)
			) {
				$clause_where.= " AND (maj NOT BETWEEN 0 AND NOW())";
			}
			$sql_select = "id_liste,titre,date,patron,maj,periode,statut";
			$sql_from = "spip_listes";
			$sql_where = "statut=".sql_quote($statut)." $clause_where";
			$sql_order = "date";
			break;
	}
	//
	$resultat_aff = sql_select($sql_select, $sql_from, $sql_where, '', array($sql_order." DESC "), $position.",".$pas);
	
	//////////////////////
	if (($nb_ = @sql_count($resultat_aff)) > 0) {
		
		// titre du tableau
		$en_liste = ""
			. "<div class='liste'>\n"
			. "<div style='position: relative;'>\n"
			. "<div style='position: absolute; top: -12px; left: 3px;'>\n"
			. "<img src='$image' alt='' width='24' height='24' />\n"
			. "</div>\n"
			. "<div style='background-color:white; color:black; padding:3px; padding-left:30px; border-bottom:1px solid #444;' class='verdana2'>\n"
			. "<strong>\n"
			. $titre_tableau
			. "</strong>\n"
			. "</div>\n"
			. "</div>\n"
			. "<table width='100%' cellpadding='2' cellspacing='0' border='0'>\n"
			;
		
		while ($row = sql_fetch($resultat_aff)) {
		
			$titre = $row['titre'];
			$date = $row['date'];
						
			switch ($element){
				case 'abonnements':
					$id_row = $row['id_liste'];
					$url_row	= generer_url_ecrire($exec, 'id_liste='.$id_row);
					$retour = self();
					$url_desabo = generer_action_auteur(_SPIPLISTES_ACTION_CHANGER_STATUT_ABONNE
											, $row['id_auteur'].'-listedesabo-'.$id_row
											, $retour);
					spiplistes_debug_log('desabo: '.$url_desabo);
					spiplistes_debug_log('retour: '.$retour);
					$statut = $row['statut'];
					break;
				case 'courriers':
					$id_row	= $row['id_courrier'];			
					$nb_emails_envoyes	= $row['nb_emails_envoyes'];
					$date_debut_envoi	= $row['date_debut_envoi'];
					$date_fin_envoi	= $row['date_fin_envoi'];
					$total_abonnes	= $row['total_abonnes'];
					$email_test	= $row['email_test'];
					$url_row	= generer_url_ecrire($exec, 'id_courrier='.$id_row);
					break;
				case 'listes':
					$id_row = $row['id_liste'];
					$url_row	= generer_url_ecrire($exec, 'id_liste='.$id_row);
					$patron = $row['patron'];
					$maj = $row['maj'];
					$periode = $row['periode'];
					break;
			}
			
			$en_liste.= ""
				. "<tr class='tr_liste'>\n"
				. "<td width='11' style='vertical-align:top;'>"
				. "<img src='".spiplistes_items_get_item("puce", $statut)."' alt=\""
					. spiplistes_items_get_item("alt", $statut)."\" border='0' style='margin: 3px 1px 1px;' />"
				. "</td>"
				. "<td class='arial2'>\n"
				. "<div>\n"
				. "<a href=\"".$url_row."\" dir='ltr' style='display:block;'>\n"
				. spiplistes_calculer_balise_titre(extraire_multi($titre))
				;
			
			switch($element) {
			// si courriers, donne le nombre de destinataires
				case 'courriers':
					$nb_abo = "";
					if(empty($email_test)) {
						$nb_abo = spiplistes_nb_destinataire_str_get($total_abonnes);
					}
					else {
						$nb_abo = _T('spiplistes:email_adresse');
					}
					if($nb_abo) {
						$en_liste .=
							" <span class='spiplistes-legend-stitre' dir='ltr'>($nb_abo)</span>\n"
							;
					}
					break;
			// si liste, donne le nombre d'abonnes
				case 'listes':
					//$nb_abo = spiplistes_nb_abonnes_liste($id_row);
					// affiche infos complementaires pour les listes
					$en_liste .= ""
						. " <span style='font-size:100%;color:#666666' dir='ltr'>\n"
						. "<span class='spiplistes-legend-stitre'>".spiplistes_nb_abonnes_liste_str_get($id_row)."</span>"
						. "<br />"
						. (
							empty($patron) 
							? "<span class='texte-alerte'>" . _T('spiplistes:liste_sans_patron') . "</span>"
							: _T('spiplistes:patron_') . " <strong>".$patron."</strong>" 
						  )
						 ;
					if (!empty($date) && intval($date)) {
						if($periode) {
							$en_liste .= "<br />"
								. _T('spiplistes:periodicite_tous_les_n_s'
								, array('n' => "  <strong>".$periode."</strong>  "
									, 's' => spiplistes_singulier_pluriel_str_get($periode, _T('spiplistes:jour'), _T('spiplistes:jours'), false)
									)
								)
								;
						}
						else {
							// inutile de preciser le statut, c'est dans le titre du bloc
						}
						$en_liste .= ""
							. ""
							. "<br />" . _T('spiplistes:Prochain_envoi_')
							. " : <strong>".affdate_heure($date)."</strong>"
							;
					}
					$en_liste .= ""
						. "</span>\n"
						;
						break;
			}
								
		//////////////////////
			$en_liste .= ""
				. "</a>\n"
				. "</div>\n"
				. "</td>\n"
				. "<td width='120' class='arial1'>"
				;
			switch($element) {
				case 'abonnements':
					$en_liste .= ""
						. "<a href=\"$url_desabo\" dir='ltr' style='display:block;'>"._T('spiplistes:desabonnement')."</a>\n"
						;
					break;
				case 'courriers':
					// - date debut envoi si encour, sinon date de publication
					if(!in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_REDAC, _SPIPLISTES_COURRIER_STATUT_READY))) {
						$en_liste .= ""
							.	(
								($statut==_SPIPLISTES_COURRIER_STATUT_ENCOURS)
								? _T('spiplistes:envoi_en_cours')
								: affdate_heure($date_fin_envoi)
								)
							;
					}
					break;
			}
			$en_liste .= ""
				. "</td>\n"
				. "<td width='50' class='arial1'><strong>"._T('info_numero_abbreviation').$id_row."</strong></td>\n"
				. "</tr>\n"
				;
		}
		$en_liste.= "</table>\n";
		
		//////////////////////
		// Pagination si besoin
		switch ($element){
			case 'abonnements':
				$sql_select = "COUNT(listes.id_liste) AS n";
				$param = "&id_auteur=$id_auteur";
				break;
			case 'courriers':
				$sql_select = "COUNT(id_courrier) AS n";
				$param = "&statut=$statut";
				break;
			case 'listes':
				$sql_select = "COUNT(id_liste) AS n";
				$param = "";
				break;
		}
		
		$sql_result = sql_select($sql_select, $sql_from, $sql_where);
		
		if(
			$sql_result
			&& ($row = sql_fetch($sql_result)) && ($total = $row['n'])
		) {
			$retour = _request('exec');
			$en_liste .= spiplistes_afficher_pagination($retour, $param, $total, $position, $nom_position, $pas);
		}

		$en_liste .= ""
			. "</div>\n"
			. "<br />\n"
			;
	}

	if($return) return($en_liste);
	else echo($en_liste);
}
Exemple #19
0
	/**
	 * @param $email
	 * @param $objet
	 * @param $message_html
	 * @param $message_texte
	 * @param array $options
	 *
	 */
	public function __construct($email, $objet, $message_html, $message_texte, $options = array()) {
		// On récupère toutes les options par défaut depuis le formulaire de config
		$defaut = array();
		foreach (array(
			'adresse_envoi', 'adresse_envoi_email', 'adresse_envoi_nom', 'forcer_from',
			'cc', 'bcc',
			'smtp', 'smtp_host', 'smtp_port', 'smtp_auth',
			'smtp_username', 'smtp_password', 'smtp_secure', 'smtp_sender',
			'filtre_images', 'filtre_iso_8859',
		) as $config) {
			$defaut[$config] = isset($GLOBALS['meta']["facteur_$config"]) ? $GLOBALS['meta']["facteur_$config"] : '';
		}
		// On fusionne les options avec d'éventuelles surcharges lors de l'appel
		$options = array_merge($defaut, $options);

		// par defaut on log rien car tres verbeux
		// on utilise facteur_log_debug qui filtre log SPIP en _LOG_DEBUG
		$this->SMTPDebug = 0;
		$this->Debugoutput = "facteur_log_debug";
		// Il est possible d'avoir beaucoup plus de logs avec 2, 3 ou 4, ce qui logs les échanges complets avec le serveur
		// utiliser avec un define('_MAX_LOG',1000); car sinon on est limite a 100 lignes par hit et phpMailer est tres verbeux
		if (defined('_FACTEUR_DEBUG_SMTP')) {
			$this->SMTPDebug = _FACTEUR_DEBUG_SMTP ;
		}
		$this->exceptions = false;


		if (
			$options['adresse_envoi'] == 'oui'
			and $options['adresse_envoi_email']
		) {
			$this->From = $options['adresse_envoi_email'];
		}
		else {
			$this->From = (isset($GLOBALS['meta']["email_envoi"]) AND $GLOBALS['meta']["email_envoi"]) ?
				$GLOBALS['meta']["email_envoi"]
				: $GLOBALS['meta']['email_webmaster'];
		}

		// Si plusieurs emails dans le from, pas de Name !
		if (strpos($this->From,",") === false) {
			if (
				$options['adresse_envoi'] == 'oui'
				and $options['adresse_envoi_nom']
			) {
				$this->FromName = $options['adresse_envoi_nom'];
			}
			// Par défaut, l'envoyeur est le nom du site
			else {
				$this->FromName = strip_tags(extraire_multi($GLOBALS['meta']['nom_site']));
			}
		}

		// si forcer_from, on sauvegarde le From et FromName par defaut, qui seront utilises
		// si From n'est pas dans le meme domaine
		// (utiliser le facteur avec un service externe qui necessite la validation des domaines d'envoi)
		if ($options['forcer_from']=='oui'){
			$this->ForceFrom = $this->From;
			$this->ForceFromName = $this->FromName;
		}

		$this->CharSet = "utf-8";
		$this->Mailer = 'mail';
		$this->Subject = unicode_to_utf_8(charset2unicode($objet,$GLOBALS['meta']['charset']));

		//Pour un envoi multiple de mail, $email doit être un tableau avec les adresses.
		if (is_array($email)) {
			foreach ($email as $cle => $adresseMail) {
				if (!$this->AddAddress($adresseMail)) {
					spip_log("Erreur AddAddress $adresseMail : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR);
				}
			}
		}
		elseif (!$this->AddAddress($email)) {
			spip_log("Erreur AddAddress $email : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR);
		}

		// Retour des erreurs
		if (!empty($options['smtp_sender'])) {
			$this->Sender = $options['smtp_sender'];
			$this->AddCustomHeader("Errors-To: ".$this->Sender);
		}

		// Destinataires en copie, seulement s'il n'y a pas de destinataire de test
		if (!defined('_TEST_EMAIL_DEST')){
			if (!empty($options['cc'])) {
				$this->AddCC($options['cc']);
			}
			if (!empty($options['bcc'])) {
				$this->AddBCC($options['bcc']);
			}
		}

		// Si on envoie avec un SMTP explicite
		if (isset($options['smtp']) AND $options['smtp'] == 'oui') {
			$this->Mailer	= 'smtp';
			$this->Host 	= $options['smtp_host'];
			$this->Port 	= $options['smtp_port'];

			// SMTP authentifié
			if ($options['smtp_auth'] == 'oui') {
				$this->SMTPAuth = true;
				$this->Username = $options['smtp_username'];
				$this->Password = $options['smtp_password'];
			}
			else {
				$this->SMTPAuth = false;
			}

			if ($options['smtp_secure'] == 'ssl') {
				$this->SMTPSecure = 'ssl';
			}
			if ($options['smtp_secure'] == 'tls') {
				$this->SMTPSecure = 'tls';
			}

			// Pour le moment on remet l'ancien fonctionnement :
			// on ne doit pas tester les certificats si pas demandé explicitement avec l'option TLS !
			$this->SMTPAutoTLS = false;
		}

		// S'il y a un contenu HTML
		if (!empty($message_html)) {
			$message_html = unicode_to_utf_8(charset2unicode($message_html, $GLOBALS['meta']['charset']));

			$this->Body = $message_html;
			$this->IsHTML(true);
			if ($options['filtre_images']) {
				$this->JoindreImagesHTML();
			}

			$this->UrlsAbsolues();
		}

		// S'il y a un contenu texte brut
		if (!empty($message_texte)) {
			$message_texte = unicode_to_utf_8(charset2unicode($message_texte, $GLOBALS['meta']['charset']));

			// Si pas de HTML on le remplace en tant que contenu principal
			if (!$this->Body) {
				$this->IsHTML(false);
				$this->Body = $message_texte;
			}
			// Sinon on met le texte brut en contenu alternatif
			else {
				$this->AltBody = $message_texte;
			}
		}

		if ($options['filtre_iso_8859']) {
			$this->ConvertirUtf8VersIso8859();
		}
	}
Exemple #20
0
/**
 * CP-20110321
 * Retourne une version texte pure du nom du site
 * @return string
 */
function spiplistes_nom_site_texte ($lang = '') {
	
	static $nom_site;
	$lang = trim ($lang);
	if (empty($lang)) {
		$lang = $GLOBALS['meta']['langue_site'];
	}
	
	if ($nom_site === null) 
	{
		$nom_site = array();
	}
	if (!isset($nom_site[$lang]))
	{
		$n = strip_tags(html_entity_decode(extraire_multi($GLOBALS['meta']['nom_site'])));
		
		// incorrect avec utf-8. Abime les diacritiques
		//$n = preg_replace ('@\s*@', ' ', $n);
		
		$nom_site[$lang] = trim($n);
	}
	return ($nom_site[$lang]);
}
/**
 * Calcule une liste des paquets en fonctions de critères de recherche
 *
 * Cette liste :
 * - est sans doublons, ie on ne garde que la version la plus récente
 * - correspond aux critères
 * - est compatible avec la version SPIP installée sur le site
 * - ne liste pas ceux étant déjà installés (ces paquets peuvent toutefois être affichés)
 * - est triée par nom ou score
 *
 * @uses  liste_des_champs()
 * @uses  recherche_en_base()
 *
 * @param string $phrase
 *     Texte de la recherche
 * @param string $categorie
 *     Type de catégorie de plugin (auteur, date...)
 * @param string $etat
 *     État de plugin (stable, test...)
 * @param string|int $depot
 *     Identifiant de dépot
 * @param string $version_spip
 *     Version de SPIP dont le paquet doit être compatible
 * @param array $exclusions
 *     Liste d'identifiants de plugin à ne pas intégrer dans la liste
 * @param bool $afficher_exclusions
 *     Afficher aussi les paquets déjà installés (true)
 *     ou ceux qui ne le sont pas (false) ?
 * @param bool $doublon
 *     Afficher toutes les versions de paquet (true)
 *     ou seulement la plus récente (false) ?
 * @param string $tri
 *     Ordre du tri : nom | score
 *
 * @return array
 *     Tableau classé par pertinence de résultat
 *     - 'prefixe' => tableau de description du paquet (si pas de doublons demandé)
 *     - n => tableau de descriptions du paquet (si doublons autorisés)
 **/
function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $version_spip = '', $exclusions = array(), $afficher_exclusions = false, $doublon = false, $tri = 'nom')
{
    include_spip('inc/rechercher');
    $plugins = array();
    $scores = array();
    $ids_paquets = array();
    // On prepare l'utilisation de la recherche en base SPIP en la limitant aux tables spip_plugins
    // et spip_paquets  si elle n'est pas vide
    if ($phrase) {
        $liste = liste_des_champs();
        $tables = array('plugin' => $liste['plugin']);
        $options = array('jointures' => true, 'score' => true);
        // On cherche dans tous les enregistrements de ces tables des correspondances les plugins qui
        // correspondent a la phrase recherchee
        // -- On obtient une liste d'id de plugins et d'id de paquets
        $resultats = array('plugin' => array(), 'paquet' => array());
        $resultats = recherche_en_base($phrase, $tables, $options);
        // -- On prepare le tableau des scores avec les paquets trouves par la recherche
        if ($resultats) {
            // -- On convertit les id de plugins en id de paquets
            $ids = array();
            if (isset($resultats['plugin']) and $resultats['plugin']) {
                $ids_plugin = array_keys($resultats['plugin']);
                $where[] = sql_in('id_plugin', $ids_plugin);
                $ids = sql_allfetsel('id_paquet, id_plugin', 'spip_paquets', $where);
            }
            // -- On prepare les listes des id de paquet et des scores de ces memes paquets
            if (isset($resultats['paquet']) and $resultats['paquet']) {
                $ids_paquets = array_keys($resultats['paquet']);
                foreach ($resultats['paquet'] as $_id => $_score) {
                    $scores[$_id] = intval($resultats['paquet'][$_id]['score']);
                }
            }
            // -- On merge les deux tableaux de paquets sans doublon en mettant a jour un tableau des scores
            foreach ($ids as $_ids) {
                $id_paquet = intval($_ids['id_paquet']);
                $id_plugin = intval($_ids['id_plugin']);
                if (array_search($id_paquet, $ids_paquets) === false) {
                    $ids_paquets[] = $id_paquet;
                    $scores[$id_paquet] = intval($resultats['plugin'][$id_plugin]['score']);
                } else {
                    $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score']) + intval($resultats['plugin'][$id_plugin]['score']);
                }
            }
        }
    } else {
        if ($ids_paquets = sql_allfetsel('id_paquet', 'spip_paquets')) {
            $ids_paquets = array_map('reset', $ids_paquets);
            foreach ($ids_paquets as $_id) {
                $scores[$_id] = 0;
            }
        }
    }
    // Maintenant, on continue la recherche en appliquant, sur la liste des id de paquets,
    // les filtres complementaires : categorie, etat, exclusions et compatibilite spip
    // si on a bien trouve des resultats precedemment ou si aucune phrase n'a ete saisie
    // -- Preparation de la requete
    if ($ids_paquets) {
        $from = array('spip_plugins AS t1', 'spip_paquets AS t2', 'spip_depots AS t3');
        $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe', 't1.id_plugin AS id_plugin', 't2.id_paquet AS id_paquet', 't2.description AS description', 't2.compatibilite_spip AS compatibilite_spip', 't2.lien_doc AS lien_doc', 't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat', 't2.logo AS logo', 't2.version AS version', 't2.nom_archive AS nom_archive', 't3.url_archives AS url_archives');
        $where = array('t1.id_plugin=t2.id_plugin', 't2.id_depot=t3.id_depot');
        if ($ids_paquets) {
            $where[] = sql_in('t2.id_paquet', $ids_paquets);
        }
        if ($categorie and $categorie != 'toute_categorie') {
            $where[] = 't1.categorie=' . sql_quote($categorie);
        }
        if ($etat and $etat != 'tout_etat') {
            $where[] = 't2.etat=' . sql_quote($etat);
        }
        if ($depot and $depot != 'tout_depot') {
            $where[] = 't2.id_depot=' . sql_quote($depot);
        }
        if ($exclusions and !$afficher_exclusions) {
            $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT');
        }
        if ($resultats = sql_select($select, $from, $where)) {
            while ($paquets = sql_fetch($resultats)) {
                $prefixe = $paquets['prefixe'];
                $version = $paquets['version'];
                $nom = extraire_multi($paquets['nom']);
                $slogan = extraire_multi($paquets['slogan']);
                $description = extraire_multi($paquets['description']);
                if (svp_verifier_compatibilite_spip($paquets['compatibilite_spip'], $version_spip)) {
                    // Le paquet remplit tous les criteres, on peut le selectionner
                    // -- on utilise uniquement la langue du site
                    $paquets['nom'] = $nom;
                    $paquets['slogan'] = $slogan;
                    $paquets['description'] = $description;
                    // -- on ajoute le score si on a bien saisi une phrase
                    if ($phrase) {
                        $paquets['score'] = $scores[intval($paquets['id_paquet'])];
                    } else {
                        $paquets['score'] = 0;
                    }
                    // -- on construit l'url de l'archive
                    $paquets['url_archive'] = $paquets['url_archives'] . '/' . $paquets['nom_archive'];
                    // -- on gere les exclusions si elle doivent etre affichees
                    if ($afficher_exclusions and in_array($paquets['id_plugin'], $exclusions)) {
                        $paquets['installe'] = true;
                    } else {
                        $paquets['installe'] = false;
                    }
                    // -- On traite les doublons (meme plugin, versions differentes)
                    if ($doublon) {
                        $plugins[] = $paquets;
                    } else {
                        // ajout
                        // - si pas encore trouve
                        // - ou si sa version est inferieure (on garde que la derniere version)
                        if (!isset($plugins[$prefixe]) or !$plugins[$prefixe] or $plugins[$prefixe] and spip_version_compare($plugins[$prefixe]['version'], $version, '<')) {
                            $plugins[$prefixe] = $paquets;
                        }
                    }
                }
            }
        }
        // On trie le tableau par score décroissant ou nom croissant
        $fonction = 'svp_trier_par_' . $tri;
        if ($doublon) {
            usort($plugins, $fonction);
        } else {
            uasort($plugins, $fonction);
        }
    }
    return $plugins;
}
Exemple #22
0
function picker_identifie_id_rapide($ref,$rubriques=0,$articles=0){
	include_spip("inc/json");
	include_spip("inc/lien");
	if (!($match = typer_raccourci($ref)))
		return json_export(false);
	@list($type,,$id,,,,) = $match;
	if (!in_array($type,array($rubriques?'rubrique':'x',$articles?'article':'x')))
		return json_export(false);
	$table_sql = table_objet_sql($type);
	$id_table_objet = id_table_objet($type);
	if (!$titre = sql_getfetsel('titre',$table_sql,"$id_table_objet=".intval($id)))
		return json_export(false);
	$titre = attribut_html(extraire_multi($titre));
	return json_export(array('type'=>$type,'id'=>"$type|$id",'titre'=>$titre));
}
Exemple #23
0
function filtre_introduction_dist($descriptif, $texte, $longueur, $connect)
{
    // Si un descriptif est envoye, on l'utilise directement
    if (strlen($descriptif)) {
        return propre($descriptif, $connect);
    }
    // De preference ce qui est marque <intro>...</intro>
    $intro = '';
    $texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte);
    // minuscules
    while ($fin = strpos($texte, "</intro>")) {
        $zone = substr($texte, 0, $fin);
        $texte = substr($texte, $fin + strlen("</intro>"));
        if ($deb = strpos($zone, "<intro>") or substr($zone, 0, 7) == "<intro>") {
            $zone = substr($zone, $deb + 7);
        }
        $intro .= $zone;
    }
    // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
    // qui inclus raccourcis et modeles
    // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
    // par ailleurs le nettoyage des raccourcis ne tient pas compte
    // des surcharges et enrichissement de propre
    // couper doit se faire apres propre
    //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
    // Cependant pour des questions de perfs on coupe quand meme, en prenant
    // large et en se mefiant des tableaux #1323
    if (strlen($intro)) {
        $texte = $intro;
    } else {
        if (strpos("\n" . $texte, "\n|") === false and strlen($texte) > 2.5 * $longueur) {
            if (strpos($texte, "<multi") !== false) {
                $texte = extraire_multi($texte);
            }
            $texte = couper($texte, 2 * $longueur);
        }
    }
    // ne pas tenir compte des notes
    if ($notes = charger_fonction('notes', 'inc', true)) {
        $notes('', 'empiler');
    }
    // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
    // dans l'introduction.
    $texte = supprime_img($texte, '');
    $texte = propre($texte, $connect);
    if ($notes) {
        $notes('', 'depiler');
    }
    if (!defined('_INTRODUCTION_SUITE')) {
        define('_INTRODUCTION_SUITE', '&nbsp;(...)');
    }
    $texte = couper($texte, $longueur, _INTRODUCTION_SUITE);
    // et reparagrapher si necessaire (coherence avec le cas descriptif)
    if ($GLOBALS['toujours_paragrapher']) {
        // Fermer les paragraphes
        $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
    }
    return $texte;
}
Exemple #24
0
/**
 * Trouver le titre d'un objet publie
 *
 * @param string $objet
 * @param int $id_objet
 * @param int $id_forum
 * @param bool $publie
 * @return bool|string
 */
function forum_recuperer_titre_dist($objet, $id_objet, $id_forum = 0, $publie = true)
{
    include_spip('inc/filtres');
    $titre = "";
    if ($f = charger_fonction($objet . '_forum_extraire_titre', 'inc', true)) {
        $titre = $f($id_objet);
    } else {
        include_spip('base/objets');
        if ($publie and !objet_test_si_publie($objet, $id_objet)) {
            return false;
        }
        $titre = generer_info_entite($id_objet, $objet, 'titre', '*');
    }
    if ($titre and $id_forum) {
        $titre_m = sql_getfetsel('titre', 'spip_forum', "id_forum = " . intval($id_forum));
        if (!$titre_m) {
            return false;
            // URL fabriquee
        }
        $titre = $titre_m;
    }
    $titre = supprimer_numero($titre);
    $titre = str_replace('~', ' ', extraire_multi($titre));
    return $titre;
}
Exemple #25
0
function initiale($nom)
{
    return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1);
}
/**
 * Formulaire de selection destinataire
 * 
 * $flag_admin: si true, possibilite de modifier le destinataire
 * sinon, ne fait qu'afficher l'etat
 * 
 * Renvoie :
 * $$nom_bouton_validation: si bouton de validation presse
 * $radio_destination: determine le choix
 * -> soit 'email_test' si adresse mail choisie
 * -> soit 'id_liste' si c'est une liste qui est choisie
 * $email_test: adresse email de test
 * $id_liste: id de la liste choisie
 */
function spiplistes_destiner_envoi (
	$id_courrier, $id_liste
	, $flag_admin
	, $flag_moderateur
	, $listes_moderees
	, $statut, $type, $nom_bouton_validation, $email_test = "") {

	include_spip('inc/presentation');
	include_spip('inc/texte');
	include_spip('inc/actions');
	include_spip('inc/date');

	global $spip_lang_left
		, $spip_lang_right
		, $options
		;

	$id_liste = intval($id_liste);
	
	$result = 
		$destinataire = "";
	
	if($id_liste) {
		if($row = sql_fetsel("titre", "spip_listes", "id_liste=".sql_quote($id_liste))) {
			$destinataire = $row['titre'];
		}
	}
	else if (!empty($email_test)) {
		$destinataire = $email_test;
	}

	if(empty($destinataire)) {
		$destinataire = "<span style='color:gray;font-size:90%;'>"._T('spiplistes:Choix_non_defini')."</span>";
	}

	$invite =  "<strong><span class='verdana1' style='text-transform: uppercase;'>"
		. _T('spiplistes:Destination')
		. ' : </span> '
		.  $destinataire
		.  "</strong>"
		;
			
	if(
		($flag_admin || $flag_moderateur)
		&& (($statut == _SPIPLISTES_COURRIER_STATUT_REDAC) || ($statut == _SPIPLISTES_COURRIER_STATUT_READY))
	) {

			$adresse_test = $GLOBALS['auteur_session']['email'];
			$listes_abos = spiplistes_listes_lister_abos();
			$liste_disabled = $listes_abos ? "" : " disabled='disabled'";
			// propose l'envoi en test
			$masque = ""
				. "<ul class='verdana2' style='list-style-type:none;padding-left:0;'>"
				. "<li> <input type='radio' name='radio_destination' value='email_test' checked='checked' id='desttest' />"
				. "<label for='desttest'>"._T('spiplistes:email_tester')."</label> : "
				. "<input type='text' name='email_test' value='$adresse_test' class='fondo' size='35' />\n"
				. "</li>"
				. "<li> <input type='radio' name='radio_destination' value='id_liste' id='destlist' $liste_disabled />"
				. "<label for='destlist'>"._T('spiplistes:listes_de_diffusion_')."</label> : "
				;
			// propose les listes
			if($listes_abos) {
				$masque .= ""
					. "<select class='verdana2' name='id_liste' onchange='document.getElementById(\"destlist\").checked=true;' >\n"
					;
				foreach($listes_abos as $row) {
					if(
						($row['nb_abos']  > 0)
						&& (
								$flag_admin
								|| ($flag_moderateur && in_array($row['id_liste'], $listes_moderees))
							)
					) {
						$checked = ($id_liste == $row['id_liste']) ? "checked='checked'" : "";
						$nb_abos = spiplistes_singulier_pluriel_str_get(
							$row['nb_abos']
							, _T('spiplistes:nb_abonnes_sing')
							, _T('spiplistes:nb_abonnes_plur')
							)
							;
						$masque .= "<option value='" . $row['id_liste'] . "' $checked >" 
							. spiplistes_calculer_balise_titre(extraire_multi($row['titre'])) 
							. " (" . $nb_abos . ")</option>\n";
					}
				}
				$masque .= ""
					. "</select>\n"
					;
			}
			else {
				$masque .= _T('spiplistes:aucune_liste_dispo');
			}
			$masque .= ""
				. "</li>"
				. "</ul>"
				. "<div style='text-align:right;'>"
				. "<input type='submit' name='$nom_bouton_validation' value=\""._T('bouton_valider')."\" class='fondo' /></div>\n"
				;
		
		// enveloppe dans un formulaire
		$masque = ""
				. "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_GERER,'id_courrier='.$id_courrier)."' method='post'>\n"
				. $masque
				. "</form>\n"
				;
		
		$result = block_parfois_visible('destinerblock', $invite, $masque, 'text-align: left');
	}
	else {
		$result = $invite;
	}

	if(!empty($result)) {
		$result =  "<div style='margin-top:1ex;'>" . debut_cadre_couleur('',true) . $result .  fin_cadre_couleur(true) ."</div>\n";
	}

	return ($result);
}