Beispiel #1
0
function formulaires_modif_abonnement2_traiter_dist(){
	spiplistes_debug_log('formulaires_modif_abonnement2_traiter_dist()');
	$d = _request('d');
	$list = _request('list');
	$email_desabo = _request('email_desabo');
	$format = _request('suppl_abo'); 
	
	// cherche l'abonne'
	$sql_select = "id_auteur,statut,nom,email";
	$sql_result = sql_select(
		$sql_select
		, 'spip_auteurs'
		, array(
			"cookie_oubli=".sql_quote($d)
			, "statut<>".sql_quote('5poubelle')
			, "pass<>".sql_quote('')
		)
		, '', '', 1
	);
	$row = sql_fetch($sql_result);
	//print_r($row);
	foreach(explode(",",$sql_select) as $key) {
		$$key = $row[$key];
	}
	$id_auteur = intval($id_auteur);
	$prev_format = spiplistes_format_abo_demande($id_auteur);

	// desabonne l'auteur de toute les listes
	spiplistes_abonnements_desabonner_statut($id_auteur, explode(";", _SPIPLISTES_LISTES_STATUTS_TOUS));
	// re-abonne' l'auteur aux listes demandees
	if(is_array($list) && count($list)) {	
		if(spiplistes_abonnements_ajouter($id_auteur, $list) !== false) {
			$message_formulaire = _T('spiplistes:abonnement_modifie');
		}
	} 

	spiplistes_format_abo_modifier($id_auteur, $format);
	if($format != $prev_format) {
		// affichage des modifs
		if($format == 'non') 
		{
			$message_formulaire = _T('spiplistes:desabonnement_valid').":&nbsp;".$email;  
		}
		else 
		{
			$message_formulaire = _T('spiplistes:abonnement_modifie');
			$message_formulaire .= "<p>"._T('spiplistes:abonnement_nouveau_format').$format."<br />";
			$message_ok = _T('spiplistes:abonnement_modifie');
		}
	}
	// detruire le cookie perso
	//spip_query("UPDATE spip_auteurs SET cookie_oubli='' WHERE cookie_oubli =".sql_quote($d));
	spiplistes_auteurs_cookie_oubli_updateq('', $d, $true);

	$contexte = array(
		'editable' => true
		, 'message_ok' => $message_ok
		, 'message_formulaire' => $message_formulaire
		, 'format' => $format
	);
	
	return ($contexte);
}
function action_spiplistes_changer_statut_abonne_dist () {

	// les globales ne passent pas en action
	//global $connect_id_auteur;
	$connect_id_auteur = $GLOBALS['auteur_session']['id_auteur'];

	include_spip('inc/autoriser');
	include_spip(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_api');

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();
	$redirect = urldecode(_request('redirect'));
	$id_liste = urldecode(_request('id_liste'));
	$tri = urldecode(_request('tri'));
	$debut = urldecode(_request('debut'));

	$arg = explode('-',$arg);
	$id_auteur = intval($arg[0]);
	$action = $arg[1];

	if(($id_auteur > 0) && ($connect_id_auteur > 0)) {
		
		if ($action == 'format') {
			//modification du format abonne ('html', 'texte' ou 'non')
			$statut = _request('statut');
			if(autoriser('modifierformat', 'abonne', $id_auteur)) {
				if(spiplistes_format_abo_modifier($id_auteur, $statut)) {
					if(!$redirect) {
						include_spip('inc/spiplistes_api_presentation');
						include_spip('inc/spiplistes_listes_selectionner_auteur');
						//echo(spiplistes_listes_boite_abonnes($id_liste, $tri, $debut, $script_retour));
						echo(spiplistes_listes_boite_abonnements($id_liste, $statut_liste, $tri, $debut, $redirect, $elligibles, $nb_elligibles));
						exit(0);
					}
				}
			}
		}
		if ($action == 'supprimer') {
			// supprimer un abonne'. Ne supprime pas le compte, juste l'abo dans la liste indiquee.
			include_spip('inc/spiplistes_api_presentation');
			include_spip('inc/spiplistes_listes_selectionner_auteur');
			spiplistes_abonnements_auteur_desabonner ($id_auteur, (($id_liste > 0) ? $id_liste : 'toutes'));
			$statut_liste = sql_getfetsel('statut', 'spip_listes', "id_liste=".sql_quote($id_liste), '', '', 1);
			$scrip_retour = urldecode(_request('scrip_retour'));
			echo(
				spiplistes_listes_boite_abonnes ($id_liste, $statut_liste, $tri, $debut, $scrip_retour)
				. spiplistes_listes_boite_elligibles ($id_liste, $statut_liste, $tri, $debut)
			);
		}
		
		// CP-20080324: l'abonnement par action/ actuellement pas utilise par le formulaire abonnes_tous.
		// A voir si on conserve 
		// CP-20081111: code probablement inutile. Un autre script action fait le meme boulot. A supprimer apres verif
		/* */
		if ($action=='listeabo') {
			//abonne un auteur, force en _SPIPLISTES_FORMAT_DEFAULT si pas de format
			if ($id_auteur 
				&& (($id_liste = intval($arg[2])) > 0)
				&& autoriser('abonnerauteur', 'liste', $id_liste, NULL, array('id_auteur'=>$id_auteur))
				) {
				spiplistes_abonnements_ajouter($id_auteur, $id_liste);
				//attribuer un format de reception si besoin (ancien auteur)
				if(
					(!$abo = spiplistes_format_abo_demande($id_auteur)) 
					|| ($abo == 'non')
				) {
					spiplistes_format_abo_modifier($id_auteur, _SPIPLISTES_FORMAT_DEFAULT);
				}
			}
			spiplistes_log("SUBSCRIBE ID_AUTEUR #$id_auteur to ID_LISTE #$id_liste by ID_AUTEUR #$connect_id_auteur");	
		}
		if ($action=='listedesabo') {
			// desabonne un auteur
			if ($id_liste = intval($arg[2])) {
				if (autoriser('desabonnerauteur', 'liste', $id_liste, NULL, array('id_auteur'=>$id_auteur))) {
					if(spiplistes_abonnements_auteur_desabonner ($id_auteur, $id_liste)) {
						spiplistes_log("UNSUBSCRIBE ID_AUTEUR #$id_auteur from ID_LISTE #$id_liste by ID_AUTEUR #$connect_id_auteur");	
					}
				}
			}
		}
		// CP-20081111: fin de code inutile.
	}
	if ($redirect){
		redirige_par_entete(str_replace("&amp;","&",$redirect)."#abo$id_auteur");
	}
} // action_spiplistes_changer_statut_abonne_dist()
Beispiel #3
0
function spiplistes_format_abo_modifier ($id_auteur, $format = 'non') {

	if($format = spiplistes_format_valide($format)) {
		$sql_table = "spip_auteurs_elargis";
		$sql_champs = array('`spip_listes_format`' => sql_quote($format));
		if($id_auteur == 'tous') {
			// appliquer le meme format a tous les abos
			$sql_result = sql_update($sql_table, $sql_champs, 1);
			$action = "update";
		}
		else if(($id_auteur = intval($id_auteur)) > 0) {
			if(($cur_format = spiplistes_format_abo_demande($id_auteur)) !== false) {
				// si pas d'erreur sql
				if(!$cur_format) {
					// si inexistant faire un insert 
					$sql_champs = array(
						'id_auteur' => $id_auteur
						, '`spip_listes_format`' => $format
					);
					$sql_result = sql_insertq($sql_table, $sql_champs);
					$action = "insert";
				} else {
					// sinon update
					$sql_where = "id_auteur=".sql_quote($id_auteur)." LIMIT 1"; 
					$sql_result = sql_update($sql_table, $sql_champs, $sql_where);
					$action = "update";
				}
			}
		}
		if($sql_result === false) {
			spiplistes_sqlerror_log("spiplistes_format_abo_modifier() $action $id_auteur");
		}
		else {
			$id_auteur = ($id_auteur == 'tous') ? "ALL" :  "id_auteur #$id_auteur";
			spiplistes_log_api("$action format to '$format' for $id_auteur");
		}
	}
	return($sql_result);
}
Beispiel #4
0
function spiplistes_formulaire_abonnement (
											$type
											, $acces_membres
											, $formulaire
											, $nom_site_spip
											, $inscription_redacteur
											, $inscription_visiteur
											) {
	
	$mail_inscription_ = trim(strtolower(_request('mail_inscription_')));
	$nom_inscription_ = trim(_request('nom_inscription_'));
	$type_abo = _request('suppl_abo') ;
	$listes_demande = _request('list');
	$desabo = ($type_abo == 'non') ? 'oui' : 'non';
	
	$adresse_site = $GLOBALS['meta']['adresse_site'];

	$reponse_formulaire = '';
	$email_a_envoyer = $mode_modifier = $sql_where = false;
	$abonne = array();
	
	// traiter d'abord si retour de mail lien cookie
	$d = _request('d');
	if(!empty($d)) {
		$sql_where = array(
				'cookie_oubli='.sql_quote($d)
				, 'statut<>'.sql_quote('5poubelle')
				, 'pass<>'.sql_quote('')
			);
	}
	// ou si identifie'
	else if($connect_id_auteur = intval($GLOBALS['auteur_session']['id_auteur']))
	{
		$sql_where = array("id_auteur=$connect_id_auteur");
	}
	if($sql_where) {
		// cherche les coordonnees de l'abonne'
		$sql_select = 'id_auteur,statut,nom,email,cookie_oubli';
		$sql_result = sql_select(
			$sql_select
			, 'spip_auteurs'
			, $sql_where
			, '', '', 1
		);
		if($row = sql_fetch($sql_result)) {
			foreach(explode(',', $sql_select) as $key) {
				$abonne[$key] = $row[$key];
			}
		}
		$abonne['format'] = spiplistes_format_abo_demande($abonne['id_auteur']);
		
	}
	
	// si identifie' par cookie ou login... effectuer les modifications demandees
	if(count($abonne)) {
		
		
		// toujours rester en mode modif pour permettre la correction
		$mode_modifier = 'oui';
		
		if($desabo == 'oui')
		{
			spiplistes_format_abo_modifier($abonne['id_auteur']);
			$reponse_formulaire = _T('spiplistes:vous_etes_desabonne');
			$email_a_envoyer = true;
		}
		
		else if($listes_demande)
		{
			//spiplistes_debug_log("demande modification abonnements listes " . implode(",", $listes_demande));
			
			if(is_array($listes_demande) && count($listes_demande))
			{
				$listes_ajoutees = spiplistes_abonnements_ajouter($abonne['id_auteur']
															, array_map('intval', $listes_demande)
															);
				$curr_abos_auteur = spiplistes_abonnements_listes_auteur($abonne['id_auteur']);
				
				foreach($curr_abos_auteur as $id_liste) {
					if(!in_array($id_liste, $listes_demande)) {
						spiplistes_abonnements_auteur_desabonner($abonne['id_auteur']
																 , $id_liste
																 );
					}
				}
			}
			
			// modifier le format de reception ?
			if(spiplistes_format_valide($type_abo) && ($type_abo != $abonne['format']))
			{
				spiplistes_format_abo_modifier($abonne['id_auteur'], $abonne['format'] = $type_abo);
				//$abonne['ids_abos'] = spiplistes_abonnements_listes_auteur($abonne['id_auteur']);
				
			}
			
			$reponse_formulaire = _T('spiplistes:demande_enregistree_retour_mail');
			$email_a_envoyer = true;
		}
		else
		{
			//spiplistes_debug_log('pas de demande, afficher formulaire de modif au complet');
			$reponse_formulaire = ''
				. '<span class="nom">' . $abonne['nom'] . "</span>\n"
				. '<span class="souhait">' . _T('spiplistes:effectuez_modif_validez', array('s'=>$abonne['nom'])). "</span>\n"
				;
		}
		
		$id_abonne = $abonne['id_auteur'];
		$objet_email = _T('spiplistes:votre_abo_listes');
		$contexte = array('titre' => $objet_email);
		
	}
	else // non identifie' ? gestion par cookie_oubli.
	{
		$texte_intro = _T('form_forum_message_auto') . '<br /><br />'._T('spiplistes:bonjour') . "<br />\n";
		
		$abonne = array('email' => email_valide($mail_inscription_));
		
		if($abonne['email'])
		{
			// si l'abonne existe deja mais pas d'action demandee,
			// affiche formulaire complet
			//if($row = sql_fetch(
			if ($row = 
				spiplistes_auteurs_auteur_select ('id_auteur,login,nom,statut,lang', 'email='.sql_quote($abonne['email']))
				
			) {
				
				$abonne['id_auteur'] = intval($row['id_auteur']);
				$abonne['statut'] = $row['statut'];
				$abonne['login'] = $row['login'];
				$abonne['nom'] = $row['nom'];
				$abonne['lang'] = $row['lang'];
				$abonne['format'] =
					($f = spiplistes_format_abo_demande($abonne['id_auteur']))
					? $f
					: 'texte'
					;
	
				if($abonne['statut'] == '5poubelle')
				{
					$reponse_formulaire = _T('form_forum_access_refuse');
				}
				// si encore nouveau, c'est qu'il ne s'est jamais identifie'
				else if($abonne['statut'] == 'nouveau')
				{
					// le supprimer. Il sera re-cree plus loin
					spiplistes_auteurs_auteur_delete('id_auteur='.sql_quote($abonne['id_auteur']));
					$abonne['id_auteur'] = false;
				}
				else {
					// demande de modifier l'abonnement ? envoie le cookie de relance par mail
					spiplistes_auteurs_cookie_oubli_updateq($abonne['cookie_oubli'] = creer_uniqid(), $abonne['email']);
					
					$objet_email = _T('spiplistes:abonnement_titre_mail');
					$texte_email = spiplistes_texte_inventaire_abos($abonne['id_auteur'], $type_abo, $nom_site_spip);
					
					
					$contexte = array('titre' => $objet_email);
					$id_abonne = $abonne['id_auteur'];
				}
				
			}
			// l'adresse mail n'existe pas dans la base.
			else 
			{
				
				$abonne['login'] = spiplistes_login_from_email($abonne['email']);
				$abonne['nom'] =
					(($acces_membres == 'non') || empty($nom_inscription_))
					? ucfirst($abonne['login'])
					: $nom_inscription_
					;
				
				// ajouter l'abonne
				$pass = creer_pass_aleatoire(8, $abonne['email']);
				$abonne['zepass'] = $pass;
				$abonne['mdpass'] = md5($pass);
				$abonne['htpass'] = generer_htpass($pass);
				
				$abonne['cookie_oubli'] = creer_uniqid();
				
				$abonne['statut'] = ($inscription_redacteur == 'oui') ? 'nouveau' : '6forum';
	
				// format d'envoi par defaut pour le premier envoi de confirmation
				$abonne['format'] = 'texte'; 
				
				// creation du compte ...
				if($id_abonne = spiplistes_auteurs_auteur_insertq(
						array(
							'nom' => $abonne['nom']
							, 'email' => $abonne['email']
							, 'login' => $abonne['login']
							, 'pass' => $abonne['mdpass']
							, 'statut' => $abonne['statut']
							, 'htpass' => $abonne['htpass']
							, 'cookie_oubli' => $abonne['cookie_oubli']
							)
					)) {
					// creation .htpasswd & LDAP si besoin systeme
					ecrire_acces();
					
					// premier format de reception par defaut
					spiplistes_format_abo_modifier($id_abonne, $abonne['format']);
				}

				$objet_email = _T('spiplistes:confirmation_inscription');
				
				$contexte = array(
								'titre' => $objet_email
								, 'nouvel_inscription' => 'oui'
								, 'inscription_redacteur' => $inscription_redacteur
								, 'inscription_visiteur' => $inscription_visiteur
							);
			}
			
			$email_a_envoyer = true;
			
		}
		else if(!empty($mail_inscription_)) {
			//Non email o non valida
			return(array(true, _T('spiplistes:erreur_adresse'), $mode_modifier, false));
		}
	}
	if($id_abonne && $email_a_envoyer) {
		
		$abonne['ids_abos'] = spiplistes_abonnements_listes_auteur($abonne['id_auteur']);

		$abonne['format'] = spiplistes_format_valide($abonne['format']);
		
		$email_a_envoyer = spiplistes_preparer_message(
					($objet_email = "[$nom_site_spip] " . $objet_email)
					, spiplistes_patron_message()
					, array_merge($contexte, $abonne)
					);
		if(
			spiplistes_envoyer_mail(
				$abonne['email']
				, $objet_email
				, $email_a_envoyer
				, false
				, ''
				, $abonne['format']
			)
		) {
			$reponse_formulaire =
				($acces_membres == 'oui')
				? _T('form_forum_identifiant_mail')
				: _T('spiplistes:demande_enregistree_retour_mail')
				;
		}
		else {
			$reponse_formulaire = _T('form_forum_probleme_mail');
		}
	} 

	return(array(true, $reponse_formulaire, $mode_modifier, $abonne));
} // end spiplistes_formulaire_abonnement()
function spiplistes_auteur_abonnement_details ($id_auteur, $auteur_statut, $email) {
	
	include_spip("inc/spiplistes_api");
	include_spip("inc/spiplistes_api_presentation");

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		;

	$result = "";

	$flag_editable = (
		(($connect_statut == '0minirezo') && $connect_toutes_rubriques)
		|| ($connect_id_auteur == $id_auteur)
		);

	if($flag_editable) {
		
		// recupere la liste des abonnements disponibles
		$sql_where = spiplistes_listes_sql_where_or(_SPIPLISTES_LISTES_STATUTS_PERIODIQUES)
			. " OR statut=".sql_quote(_SPIPLISTES_LIST_PUBLIC);
			
		// les auteurs ont droit aux listes privees (internes)
		if(($auteur_statut == '1comite') || ($auteur_statut == '0minirezo')) {
			$sql_where .= " OR statut=".sql_quote(_SPIPLISTES_LIST_PRIVATE);
		}

		$sql_result = sql_select(
			array('id_liste','titre','texte','date','statut')
			, "spip_listes"
			, $sql_where
			, ''
			, array("titre ASC")
			);

		$nb_listes_dispo = sql_count($sql_result);
//spiplistes_log(gettype($nb_listes_dispo).":".$nb_listes_dispo);

		// si liste disponible, affiche formulaire
		if($sql_result && $nb_listes_dispo) {
			
			// recupere la liste des listes
			$listes = array();
			while($row = sql_fetch($sql_result)) {
				$texte = propre($row['texte']);
				if(strlen($legend = textebrut($texte)) > 40) {
					$texte = couper($texte, 40);
				}
				$texte = strip_tags($texte, '<strong>');
				$listes[] = array(
					'id_liste' => intval($row['id_liste'])
					, 'titre' => $row['titre']
					, 'texte' => $texte
					, 'date' => $row['date']
					, 'statut' => $row['statut']
					, 'legend' => $legend
				);
			} // end while
			
			// si retour de formulaire, ajoute/retire les abonnements
			if(_request('btn_abonnements_valider')) {
				$abos_set = _request('abos_set');
				$abo_ajoute = array();
				// liste des abonnements de id_auteur
				$auteur_abos_current_list = spiplistes_abonnements_listes_auteur($id_auteur);
				// ajoute/retire les abonnements desires
				if(count($abos_set)) {
					// Abonnements ?
					foreach($abos_set as $value) {
						if(!in_array($value, $auteur_abos_current_list)) {
							$abo_ajoute[] = $value;
						}
					}
					if(count($abo_ajoute)) {
						spiplistes_abonnements_ajouter($id_auteur, $abo_ajoute);
					}
					// Desabonnements ?
					foreach($auteur_abos_current_list as $value) {
						if(!in_array($value, $abos_set)) {
							spiplistes_abonnements_auteur_desabonner($id_auteur, $value);
						}
					}
				}
				// desabonne de tout
				else {
					if(spiplistes_abonnements_auteur_desabonner($id_auteur, "toutes") === false) {
						$result .= spiplistes_boite_alerte(_T('spiplistes:Erreur_sur_la_base'), true);
					}
				}
			} // end if
			
			// si retour de formulaire, modifie le format de reception
			if($abo_format = _request('abo_format')) {
				spiplistes_format_abo_modifier($id_auteur, $abo_format);
			}
			
			// recupere le format d'abonnement de id_auteur
			$abo_format = spiplistes_format_abo_demande($id_auteur);		
		
			// recupere la liste ou auteur est abonne
			$auteur_abos_current_list = spiplistes_abonnements_listes_auteur($id_auteur);
			
			$bloc_visible = _request('btn_abonnements_valider');
			
			$debut_block = ($bloc_visible ? "spiplistes_debut_block_visible" : "spiplistes_debut_block_invisible");
			
			$result .= ""
				. "<!-- formulaire abonnement spiplistes -->\n" 
				. "<a name='abonnement'></a>\n"
				. debut_cadre_enfonce(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."courriers_listes-24.png"
					, true, '', _T('spiplistes:listes_de_diffusion_'))
				. spiplistes_bouton_block_depliable(
					_T('spiplistes:abonnements_aux_courriers')
					, $bloc_visible
					, "abos_block")
				. "<div class='verdana2'>"
				;
			if($n = count($auteur_abos_current_list)) {
				$result .= $n."/"
					. spiplistes_nb_listes_str_get ($nb_listes_dispo)
					. ". "
					. _T('spiplistes:format_de_reception')." : "
						.	(
							(in_array($abo_format, array('html', 'texte')))
							? _T('spiplistes:'.$abo_format)
							: "&lt;"._T('spiplistes:aucun')."&gt;"
							)
					;
			} else {
				$result .= _T('spiplistes:Sans_abonnement');
			}
			$result .= ""
				. "</div>\n"
				. $debut_block("abos_block")
				. "<form action='".generer_url_ecrire("auteur_infos", "id_auteur=$id_auteur")."' method='post' style='margin-bottom:0;' name='abos_formulaire'>\n"
				. debut_cadre_formulaire("", true)
				. "\n<p class='verdana2' style='margin-top:0;margin-bottom:0;'>"
				.	(
						($abo_format!='html' && $abo_format!='texte')
						? _T('spiplistes:Alert_abonnement_sans_format')
						: _T('spiplistes:vous_etes_abonne_aux_listes_selectionnees_').":"
					)
				. "</p>\n"
				//
				. "<!-- liste des abonnements -->\n"
				. "<ul class='liste-listes'>\n"
				;
			foreach($listes as $key=>$value) {
				$id_liste = $value['id_liste'];
				$auteur_est_abonne = in_array($id_liste, $auteur_abos_current_list);
				$checked = $auteur_est_abonne ? "checked='checked'" : "";
				$label = $auteur_est_abonne ? "Arreter_abonnement_a" : "Abonner_a";
				$label = _T("spiplistes:".$label)." ".$value['titre'];
				$prochain_envoi = 
					($value['date'] > 0)
					? _T('spiplistes:Prochain_envoi_').": <span style='font-weight:bold;'>".affdate_heure($value['date'])."</span>"
					: _T('spiplistes:envoi_non_programme')
					;
				$result .= ""
					. "<li>\n"
					. "<label>\n"
					. "<input name='abos_set[]' type='checkbox' value='$id_liste' title=\"$label\" $checked />\n"
					. spiplistes_bullet_titre_liste('puce', $value['statut'], '', true)
					. "<span title=\"".$value['legend']."\">\n"
					. "<span class='titre'>".typo($value['titre'])."</span> \n"
					. "<span class='description'>".typo($value['texte'])." </span>\n"
					. "<span class='periodicite'>($prochain_envoi)</span>\n"
					. "</span>\n"
					. "</label></li>\n"
					;
			}
			$result .= ""
				. "</ul>\n"
				. "<!-- fin liste des abonnements -->\n"
				. fin_cadre_formulaire(true)
				//
				// selection du format de reception
				. debut_cadre_formulaire("margin-top:1ex", true)
				. ((empty($abo_format) || ($abo_format=="non")) 
					? "<p>"._T('spiplistes:Format_obligatoire_pour_diffusion')."</p>" : "" )
				. _T('spiplistes:format_de_reception')
				. "<ul class='liste-format'>\n"
				;
			$checked = ($abo_format=="html" ? "checked='checked'" : "");
			$result .= ""
				. "<li style='width:50%;float:left;'>\n"
				. " <input type='radio' name='abo_format' value='html' id='format_rcpt_html' title='"._T('spiplistes:html')."' $checked />"
				. " <label for='format_rcpt_html'>"._T('spiplistes:version_html')."</label></li>\n"
				;
			$checked = ($abo_format=="texte" ? "checked='checked'" : "");
			$result .= ""
				. "<li>\n"
				. " <input type='radio' name='abo_format' value='texte' id='format_rcpt_texte' title='"._T('spiplistes:texte')."' $checked />"
				. " <label for='format_rcpt_texte'>"._T('spiplistes:version_texte')."</label></li>\n"
				. "</ul>\n"
				. fin_cadre_formulaire(true)
				;
			if(spiplistes_format_valide($abo_format) && ($abo_format!="non")) {
				$result .= ""
					. debut_cadre_formulaire("margin-top:1ex", true)
					. "<ul class='liste-format-desabo'>\n"
					. "<li>\n"
					. spiplistes_form_input_radio('abo_format', 'non', _T('spiplistes:Suspendre_abonnements')
						, false, true, false)
					. "</li>\n"
					. "</ul>\n"
					. fin_cadre_formulaire(true)
					;
			}
			$result .= ""
				//
				. "<div style='text-align:right;margin-top:1ex;'><input type='submit' name='btn_abonnements_valider' "
					. " value='"._T('spiplistes:Valider_abonnement')."' class='fondo' /></div>\n"
				. "</form>\n"
				. fin_block()
				. fin_cadre_enfonce(true)
				;
		}
	}
	
	return($result);
}
Beispiel #6
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()
function exec_spiplistes_courrier_gerer () {

	include_spip('inc/barre');
	include_spip('inc/documents');
	include_spip('base/spiplistes_tables');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier');
	include_spip('inc/spiplistes_api_presentation');
	include_spip('inc/spiplistes_destiner_envoi');
	include_spip('inc/spiplistes_naviguer_paniers');

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		, $spip_ecran
		;
	
	$eol = "\n";

	// initialise les variables postees par le formulaire
	foreach(array(
		'type'
		, 'id_courrier'
		, 'btn_courrier_valider', 'titre', 'message', 'message_texte' // (formulaire edition) _SPIPLISTES_EXEC_COURRIER_EDIT
		, 'new' // idem
		, 'btn_changer_destination', 'radio_destination', 'email_test', 'id_liste' // (formulaire local) destinataire
		, 'change_statut' // (formulaire spiplistes_boite_autocron) 'publie' pour annuler envoi par boite autocron
		, 'btn_dupliquer_courrier' // (formulaire local) dupliquer le courrier
		, 'supp_dest'
		, 'id_temp' // pour recuperer les documents joints
		) as $key) {
		$$key = _request($key);
	}
	foreach(array('id_courrier', 'id_liste', 'btn_dupliquer_courrier') as $key) {
		$$key = intval($$key);
	}
	foreach(array('email_test','titre','message','message_texte') as $key) {
		$$key = trim($$key);
	}
	$texte = $message;

	$page_result = $message_erreur = $str_destinataire =
		$boite_confirme_envoi = '';

	$flag_admin = ($connect_statut == "0minirezo") && $connect_toutes_rubriques;
	$flag_moderateur = count($listes_moderees = spiplistes_mod_listes_id_auteur($connect_id_auteur));
	$flag_createur = ($id_courrier && ($connect_id_auteur == spiplistes_courrier_id_auteur_get($id_courrier)));

	// l'edition du courrier est reservee...
	$flag_autorise = (
		// aux super-admins 
		$flag_admin
		// ou a un moderateur
		|| $flag_moderateur
		// ou au createur du courrier
		|| $flag_createur
	);

	if($flag_autorise) {
		// Modification de courrier
	
		if($btn_dupliquer_courrier > 0) {
			$id_courrier = $btn_dupliquer_courrier;
		}

		// effectue les modifications demandees si retour local ou retour editeur
		if($id_courrier > 0) {

			if($btn_dupliquer_courrier > 0)
			{
				if($row = sql_fetsel('titre,texte', 'spip_courriers', 'id_courrier='.sql_quote($id_courrier),'','',1))
				{
					$titre = typo($row['titre']);
					
					$texte = typo($row['texte']);
					//
					// @see: http://www.spip-contrib.net/SPIP-Listes#comment441566
					//$texte = typo($row['message_texte']);
					
					$str_log = "id_courrier #$id_courrier";
					$statut = _SPIPLISTES_COURRIER_STATUT_REDAC;
					$type = _SPIPLISTES_COURRIER_TYPE_NEWSLETTER;
					$id_courrier = sql_insert(
						'spip_courriers'
						, "(titre,texte,message_texte,date,statut,type,id_auteur)"
						, "(".sql_quote($titre).",".sql_quote($texte).",".sql_quote($message_texte)
							.",NOW(),".sql_quote($statut).",".sql_quote($type).",".sql_quote($connect_id_auteur).")"
					);
					spiplistes_log("$str_log DUPLICATED TO #$id_courrier BY ID_AUTEUR #$connect_id_auteur");
				}
				else {
					spiplistes_log("ERR: DUPLICATION FROM id_courrier #$id_courrier (missing ?)");
				}
			}
			
			if($btn_changer_destination) {
				if($radio_destination == 'email_test') {
					
					// demande d'envoi au mail de test (retour formulaire local)
					if(email_valide($email_test)) {
						if(!($id_auteur_test = spiplistes_idauteur_depuis_email($email_test))) {
							// verifie si l'adresse est dans la table des auteurs
							// si inconnue, refuse d'envoyer
							$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_Adresse_email_inconnue'), true);
						}
						else {
							
							$format_abo = spiplistes_format_abo_demande($id_auteur_test);

							/*
							 * meme le compte qui veut recevoir un test doit avoir
							 * un format de reception
							 */
							if(
								in_array($format_abo, spiplistes_formats_autorises())
								&& ($format_abo != 'non')
							) {
								// Ok. Enregistre l'adresse test
								spiplistes_courrier_modifier(
									$id_courrier
									, array(
										  'email_test' => $email_test
										, 'total_abonnes' => 1
										, 'id_liste' => ($id_liste = 0)
										, 'statut' => ($change_statut = _SPIPLISTES_COURRIER_STATUT_READY)
										)
								);
							}
							else {
								$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:destinataire_sans_format_alert'), true);
							}
							
							$str_destinataire = _T('spiplistes:email_adresse') . " : $email_test";
						}
					}
					else {
						$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_Adresse_email_invalide'), true);
					}
				} // end if($radio_destination == 'email_test')
				
				else if($radio_destination == 'id_liste') {
					// demande d'envoi a une liste (retour formulaire local)
					if($id_liste > 0) {
						if(
							($nb_abos = spiplistes_listes_nb_abonnes_compter($id_liste)) > 0
						) {
							$str_destinataire = ""
								. _T('spiplistes:sur_liste') 
								. " : <a href='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "id_liste=$id_liste")."'>"
								. spiplistes_listes_liste_fetsel($id_liste, 'titre')
								. "</a>"
								. " " . spiplistes_nb_abonnes_liste_str_get($id_liste, $nb_abos)
								;
							spiplistes_courrier_modifier(
								$id_courrier
								, array(
									  'email_test' => ""
									, 'total_abonnes' => $nb_abos
									, 'id_liste' => $id_liste
									, 'statut' => ($change_statut = _SPIPLISTES_COURRIER_STATUT_READY)
								)
							);
						}
						else {
							$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_liste_vide'), true);
						}
					}
				} // end if($radio_destination
			} // if($btn_changer_destination
	
			else if($btn_courrier_valider) {
				// retour editeur local
				if(!empty($titre)) {
					$sql_set = array(
							  'titre' => $titre
							, 'texte' => $texte
							, 'message_texte' => $message_texte
						);
					spiplistes_courrier_modifier($id_courrier, $sql_set);
					spiplistes_courrier_attacher_documents($id_courrier, $id_temp);
				}
				else {
					$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_courrier_titre_vide'), true);
				}
			}
			// FIN DES MODIFICATIONS
		}
					
		// Ok. recharge les donnees pour completer le formulaire
		$sql_select_array = array('titre', 'texte', 'email_test', 'statut');
		if($row = spiplistes_courriers_premier($id_courrier, $sql_select_array)) {
			foreach($sql_select_array as $key) {
				$$key = $row[$key];
			}
		} // end if($id_courrier > 0)
	}  // end if($flag_autorise)


	//////////////////////////////////////////////////////
	// Nouveau courrier
	////
	if(($connect_statut == "0minirezo") && ($new == 'oui')) {
		// retour editeur. Creation du courrier
		if(!empty($titre)) {
			$statut = _SPIPLISTES_COURRIER_STATUT_REDAC;
			$type = _SPIPLISTES_COURRIER_TYPE_NEWSLETTER;
			$id_courrier = sql_insert(
				'spip_courriers'
				, "(titre,texte,message_texte,date,statut,type,id_auteur)"
				, "(".sql_quote($titre).",".sql_quote($texte).",".sql_quote($message_texte)
					.",NOW(),".sql_quote($statut).",".sql_quote($type).",".sql_quote($connect_id_auteur).")"
			);
			spiplistes_courrier_attacher_documents($id_courrier, $id_temp);
		}
		else {
			$message_erreur .= spiplistes_boite_alerte (_T('spiplistes:Erreur_courrier_titre_vide'), true);
		}
	}

	//////////////////////////////////////////////////////
	// recharge le courrier pour edition
	if($id_courrier > 0) {
		
		$sql_select_tmp = "email_test,date,titre,texte,message_texte,type,statut,date_debut_envoi,date_fin_envoi";
		$sql_select_int = "id_liste,id_auteur,total_abonnes,nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html";
		$sql_select_str = "titre";
		$sql_select = $sql_select_int.",".$sql_select_str.",".$sql_select_tmp;
		
		if($row = sql_fetsel($sql_select, "spip_courriers", "id_courrier=".sql_quote($id_courrier), '', '', 1)) {
			foreach(explode(",", $sql_select) as $key) {
				$$key = $row[$key];
			}
			foreach(explode(",",$sql_select_int) as $key) {
				$$key = intval($$key);
			}
			foreach(explode(",",$sql_select_str) as $key) {
				$$key = typo($$key);
			}

			if($change_statut == _SPIPLISTES_COURRIER_STATUT_READY) {
				//$titre = propre($titre); // pas de propre ici, ca fait un <p> </p>
				// Le statut n'est modifie ici, mais 
				// par courrier_casier en retour de ce formulaire
				
				// $texte = spiplistes_courrier_propre($texte);
				$texte = spiplistes_texte_propre ($texte);
				
				spiplistes_courrier_modifier(
					$id_courrier
					, array(
						'titre' => $titre
						, 'texte' => $texte
					)
				);
				spiplistes_log("ID_COURRIER #$id_courrier titre,texte MODIFIED BY ID_AUTEUR #$connect_id_auteur");
				$statut = $change_statut;
			}
			else if($change_statut == _SPIPLISTES_COURRIER_STATUT_STOPE){
				spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier);
				spiplistes_log("ID_COURRIER #$id_courrier CANCELLED BY ID_AUTEUR #$connect_id_auteur");
			}
			
			// prepare le texte texte seul
			if(!in_array($statut, array(
					  _SPIPLISTES_COURRIER_STATUT_REDAC
					, _SPIPLISTES_COURRIER_STATUT_READY
					, _SPIPLISTES_COURRIER_STATUT_PUBLIE
					, _SPIPLISTES_COURRIER_STATUT_STOPE
					))
			) {
				
				//$texte = spiplistes_courrier_propre($texte);
				$texte = spiplistes_texte_propre ($texte);
			}
			if(!empty($message_texte)){
				$alt_message_texte = _T('spiplistes:calcul_patron');
			}
			else{
				$alt_message_texte = _T('spiplistes:calcul_html');
				$message_texte = spiplistes_courrier_version_texte($texte);
			}
			// construit la boite de selection destinataire
			$boite_selection_destinataire = 
				(($statut==_SPIPLISTES_COURRIER_STATUT_REDAC) || ($statut==_SPIPLISTES_COURRIER_STATUT_READY))
				? spiplistes_destiner_envoi($id_courrier, $id_liste
						, $flag_admin
						, $flag_moderateur
						, $listes_moderees
						, $statut, $type, 'btn_changer_destination', $email_test)
				: ""
				;
		}
	} // end if()

	//////////////////////////////////////////////////////
	// preparation des boutons si droits
	$gros_bouton_modifier = 
		$gros_bouton_dupliquer = 
		$gros_bouton_supprimer = 
		$gros_bouton_arreter_envoi = '';
	

	if($flag_autorise) {
		
		if(($statut == _SPIPLISTES_COURRIER_STATUT_REDAC) || ($statut == _SPIPLISTES_COURRIER_STATUT_READY)) {
		// Le courrier peut-etre modifie si en preparation 
			$gros_bouton_modifier = "<!-- bouton modifier -->\n" .
				icone (
					_T('spiplistes:Modifier_ce_courrier') // legende bouton
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_EDIT,'id_courrier='.$id_courrier) // lien
					, spiplistes_items_get_item('icon', $statut) // image du fond
					, "edit.gif" // image de la fonction. Ici, le crayon
					, '' // alignement
					, false // pas echo, demande retour
					) 
					. $eol
				;
			
		}
		
		// Le courrier peut-etre supprime si obsolete
		if(in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_REDAC
								   , _SPIPLISTES_COURRIER_STATUT_PUBLIE
								   , _SPIPLISTES_COURRIER_STATUT_AUTO
								   , _SPIPLISTES_COURRIER_STATUT_VIDE
								   , _SPIPLISTES_COURRIER_STATUT_IGNORE
								   , _SPIPLISTES_COURRIER_STATUT_STOPE
								   , _SPIPLISTES_COURRIER_STATUT_ERREUR))
					) {
			$gros_bouton_supprimer = 
				'<div style="margin-top:1ex">'
				. icone (
					_T('spiplistes:Supprimer_ce_courrier')
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIERS_LISTE, 'btn_supprimer_courrier='.$id_courrier)
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'poubelle_msg.gif'
					, ''
					, 'right'
					, false
					)
				. '</div>'.$eol
				;
		}
		// Un courrier publie ou stoppe peut-etre duplique pour edition
		// on revient sur cette page avec le contenu recupere
		if(in_array($statut, array(_SPIPLISTES_COURRIER_STATUT_PUBLIE
								   , _SPIPLISTES_COURRIER_STATUT_AUTO
								   , _SPIPLISTES_COURRIER_STATUT_STOPE))
					) {
			$gros_bouton_dupliquer = 
				"<div style='margin-top:1ex;'>"
				. icone (
					_T('spiplistes:dupliquer_ce_courrier')
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_GERER, "btn_dupliquer_courrier=$id_courrier")
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'stock_mail.gif'
					, _DIR_IMG_PACK."creer.gif"
					, "right"
					, false
					)
				. "</div>\n"
				;
		}
		
		if($statut == _SPIPLISTES_COURRIER_STATUT_ENCOURS) {
		// L'envoi d'un courrier en cours peut etre stoppe
			$gros_bouton_arreter_envoi = 
				icone (
					_T('spiplistes:Arreter_envoi')
					// si arreter envoi, passe la main a exec/spiplistes_courriers_casier
					, generer_url_ecrire(_SPIPLISTES_EXEC_COURRIERS_LISTE, "btn_arreter_envoi=$id_courrier")
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK."courriers_redac-24.png"
					, _DIR_PLUGIN_SPIPLISTES_IMG_PACK."stop-top-right-24.png"
					, "right"
					, false
					)
				. fin_cadre_relief(true)
				;
		}
		if($statut == _SPIPLISTES_COURRIER_STATUT_READY) {
			if(!$id_liste && !$id_auteur_test) {
				// normalement, la validation est locale, mais si l'utilisateur
				// part sur un casier, le retour ici est incomplet...
				// cas particulier d'un appel d'un courrier ready a partir des casiers
				// il faut recreer $id_auteur_test si id_liste == 0
				if(!($id_auteur_test = spiplistes_idauteur_depuis_email($email_test))) {
					spiplistes_log("ERR: id_auteur_test #$id_auteur_test (id_auteur missing ?)");
				}
			}
			if(($id_liste > 0) || ($id_auteur_test > 0)) {
				$boite_confirme_envoi = 
					  debut_cadre_couleur('', true)
					// formulaire de confirmation envoi
					// renvoie sur la page des casiers
					. '<form action="'
						. generer_url_ecrire(_SPIPLISTES_EXEC_COURRIERS_LISTE,'id_courrier='.$id_courrier)
						. '" method="post">'.$eol
					. '<p style="text-align:center;font-weight:bold;" class="verdana2">'
						. _T('spiplistes:confirme_envoi')
						. '</p>'.$eol
					. '<input type="hidden" name="id_liste" value="'.$id_liste.'" />'.$eol
					. '<input type="hidden" name="id_courrier" value="'.$id_courrier.'" />'.$eol
					. '<input type="hidden" name="id_auteur_test" value="'.$id_auteur_test.'" />'.$eol
					. '<div style="text-align:left;">'.$eol
					. '<input type="submit" name="btn_annuler_envoi" value="'
						. _T('spiplistes:annuler_envoi').'" class="fondo" style="float:left" />'.$eol
					. '<div style="text-align:right;width:100%">'.$eol
					. '<input type="submit" name="btn_confirmer_envoi" value="'
						. _T('spiplistes:Envoyer_ce_courrier').'" class="fondo" />'.$eol
					. '</div>'.$eol
					. '</div>'.$eol
					. '</form>'
					. fin_cadre_couleur(true)
					;
			}
		}
	}

	/////////////////////
	// prepare le message statut du courrier
	if($id_courrier > 0) {
		$le_type = _T('spiplistes:message_type');
		
		if($statut != _SPIPLISTES_COURRIER_STATUT_REDAC) {
			if(!empty($email_test)) {
				$str_destinataire = _T('spiplistes:email_adresse') . " : <span style='font-weight:bold;color:gray;'>$email_test</span>";
			}
			else {
				if($row = sql_fetsel('titre', 'spip_listes', "id_liste=".sql_quote($id_liste), '', '', 1)) {
					$str_destinataire = ""
						. _T('spiplistes:Liste_de_destination') 
						. " : <a href='".generer_url_ecrire(_SPIPLISTES_EXEC_LISTE_GERER, "id_liste=$id_liste")."'>"
							. typo($row['titre']) . "</a>"
						. " " . spiplistes_nb_abonnes_liste_str_get($id_liste)
						;
				}
				else {
					$str_destinataire = _T('spiplistes:Courriers_sans_liste');
				}
			}
		} //
		
		$str_statut_courrier = "";
		
		switch($statut) {
			case _SPIPLISTES_COURRIER_STATUT_REDAC:
				$str_statut_courrier = _T('spiplistes:message_en_cours')."<br />"
				.	(
					($flag_autorise)
					? _T('spiplistes:modif_envoi')
					: ""
					)
				;
				break;
			case _SPIPLISTES_COURRIER_STATUT_READY:
				$str_statut_courrier = ""
					. _T('spiplistes:message_presque_envoye') . "<br />"
					. $str_destinataire . "<br />\n"
					;
				break;
			case _SPIPLISTES_COURRIER_STATUT_ENCOURS:
				$str_statut_courrier = ""
					. _T('spiplistes:message_en_cours')."<br />$str_destinataire<br /><br />"
					//. "<a href='?exec=spip_listes'>["._T('spiplistes:voir_historique')."]</a>"
					;
				break;
			case _SPIPLISTES_COURRIER_STATUT_PUBLIE:
			case _SPIPLISTES_COURRIER_STATUT_AUTO:
				$str_statut_courrier = ""
					. "<span>"
					. "<strong>"._T('spiplistes:message_arch')."</strong></span>"
					. "<ul>"
					. " <li>$str_destinataire</li>"
					. " <li>"._T('spiplistes:envoi_date').affdate_heure($date)."</li>"
					. " <ul>"
					. "  <li>"._T('spiplistes:envoi_debut').affdate_heure($date_debut_envoi)."</li>"
					. "  <li>"._T('spiplistes:envoi_fin').affdate_heure($date_fin_envoi)."</li>"
					. " </ul>"
					. " <li>"._T('spiplistes:nbre_abonnes').$total_abonnes."</li>"
					. " <ul>"
					. "  <li>"._T('spiplistes:format_html__n', array('n' => $nb_emails_html))."</li>"
					. "  <li>"._T('spiplistes:format_texte__n', array('n' => $nb_emails_texte))."</li>"
					. "  <li>"._T('spiplistes:desabonnes')." : ".$nb_emails_non_envoyes."</li>"
					. " </ul>"
					. " <li>"._T('spiplistes:erreur_envoi').$nb_emails_echec."</li>"
					. "</ul>"
					;
		} // end switch()
		if(!empty($str_statut_courrier)) {
			$str_statut_courrier = "<span class='verdana2'>".$str_statut_courrier."</span>";
		}
	} // end if()
	
////////////////////////////////////
// PAGE CONTENU
////////////////////////////////////

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

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . " - " . trim($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 />\n"
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. spiplistes_boite_info_id(_T('spiplistes:Courrier_numero_'), $id_courrier, true)
		. spiplistes_naviguer_paniers_courriers(_T('spiplistes:aller_au_panier_'), true)
		//. $boite_documents
		. 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)
		;
		
	if($id_courrier > 0) {
	/////////////////////
	// construction du ventre
		$page_result .= "\n<!-- construction du ventre -->\n"
			. $message_erreur
			. debut_cadre_relief(spiplistes_items_get_item('icon', $statut), true)
			. "<table width='100%'  border='0' cellspacing='0' cellpadding='0'>"
			. "<tr>"
			. "<td>".spiplistes_gros_titre($titre, spiplistes_items_get_item('puce', $statut), true)."</td>"
			. "<td rowspan='2' style='vertical-align:top;width:90px;'>"
				// si besoin, l'un de ces trois boutons apparait
				. $gros_bouton_modifier
				. $gros_bouton_arreter_envoi
				. $gros_bouton_dupliquer
				."</td>"
			. "</tr>\n"
			. "<tr> "
			. "<td>"
			. "<p class='verdana2' style='font-size:120%;color:red;font-weight:bold;'>$le_type</p>\n"
			. "<p class='verdana2'>$str_statut_courrier</p>\n"
			. "</td>"
			. "</tr>\n"
			. "</table>"
			. $boite_confirme_envoi
			. $boite_selection_destinataire
			. "<br />\n"
			;

		function spiplistes_generer_oeil ($params) {
			return(
				"&nbsp;<a href='"
				. generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_PREVUE, $params)
				. "' title='"._T('spiplistes:Apercu_plein_ecran')."' target='_blank'>\n"
				. spiplistes_icone_oeil() . "</a>"
			);
		}

		// previsu
		$params = "id_courrier=$id_courrier&id_liste=$id_liste";
		$oeil_html = spiplistes_generer_oeil($params. "&lire_base=oui&plein_ecran=oui");
		$oeil_texte = spiplistes_generer_oeil($params . "&lire_base=oui&plein_ecran=oui&format=texte");
			
		$page_result .= ""
			. debut_cadre_couleur('', true)
			. "<form id='choppe_patron-1' action='$form_action' method='post' name='choppe_patron-1'>\n"
			. "<div id='previsu-html' class='switch-previsu'>\n"
			. _T('spiplistes:version_html') . $oeil_html
				. " / " . "<a href='javascript:jQuery(this).switch_previsu()'>" 
				. _T('spiplistes:version_texte') . $oeil_texte
			. "<div>\n"
			. "<iframe class='previsu-edit'"
				. " src='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_PREVUE, $params . "&lire_base=oui")
				. "' width='100%' height='500'></iframe>\n"
			. "</div>\n"
			. "</div>\n" // fin id='previsu-html
			. "<div id='previsu-texte' class='switch-previsu' style='display:none;'>\n"
			. "<a href='javascript:jQuery(this).switch_previsu()'>" . _T('spiplistes:version_html') . "</a>\n"
				. $oeil_html
				. " / " 
				. _T('spiplistes:version_texte') . "</a> $oeil_texte\n"
			. "<div>\n"
			//. "<pre>"
			. "<iframe class='previsu-edit'"
				. " src='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_PREVUE, $params . "&format=texte&lire_base=oui")
				."' width='100%' height='500'></iframe>\n"
			//. "</pre>"
			. "</div>\n"
			. "</div>\n" // fin id='previsu-texte
			. "</form>\n"
			. fin_cadre_couleur(true)
			
			//
			// fin de la boite
			. fin_cadre_relief(true)
			//
			. $gros_bouton_supprimer
			;
	} // end if
	else {
		$page_result .= 
			(empty($message_erreur))
			? spiplistes_boite_alerte (_T('spiplistes:Erreur_courrier_introuvable'), true)
			: $message_erreur
			;
	}

	echo($page_result);
	
	// GERER COURRIER: FIN DE PAGE
	
	echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		, spiplistes_html_signature(_SPIPLISTES_PREFIX)
		, fin_gauche(), fin_page();

} // end function exec_spiplistes_courrier_gerer ()
Beispiel #8
0
function formulaires_gestion_abonnement_traiter_dist($id_liste='') {
	//spiplistes_debug_log('formulaires_gestion_abonnement_traiter_dist()');
	
	$d = _request('d');
	$listes = _request('listes');
	$format = _request('suppl_abo');
	$stop = intval(_request('stop'));
	
	if ($auteur = auteur_cookie_ou_session($d))
	{
		$id_auteur = $auteur['id_auteur'];
		$email = $auteur['email'];
		
		// la liste des abonnements en cours
		// pour cet auteur
		$mes_abos = spiplistes_abonnements_listes_auteur ($id_auteur, true);
		
		// demander de stopper une inscription ?
		if ($stop > 0)
		{
			$id_liste = $stop;
			
			if (isset ($mes_abos[$id_liste]))
			{
				spiplistes_abonnements_auteur_desabonner ($id_auteur, $id_liste);
				$contexte = array(
					'message_ok' => _T('spiplistes:vous_etes_desinscrit')
				);
			}
		}
		else
		{
			$prev_format = spiplistes_format_abo_demande($id_auteur);
		
			$listes_souhaitees =
				(is_array($listes) && count($listes))
				? $listes
				: array()
				;
			if (count ($listes_souhaitees))
			{
				$listes_souhaitees = array_flip ($listes_souhaitees);
				
				// abonner aux listes demandées
				foreach (array_keys($listes_souhaitees) as $id_liste)
				{
					if (!isset($mes_abos[$id_liste]))
					{
						spiplistes_abonnements_ajouter ($id_auteur, $id_liste);
						$mes_abos[$id_liste] = '';
					}
				}
				
				// désabonner les listes non souhaitées
				foreach (array_keys($mes_abos) as $id_liste)
				{
					if (!isset ($listes_souhaitees[$id_liste]))
					{
						spiplistes_abonnements_auteur_desabonner ($id_auteur, $id_liste);
					}
				}
				
				// abonner aux listes demandées,
				// si pas déjà abonné
				foreach (array_keys($listes_souhaitees) as $id_liste)
				{
					if (!isset ($mes_abos[$id_liste]))
					{
						if(spiplistes_abonnements_ajouter($id_auteur, $id_liste) !== false)
						{
							// @todo a ameliorer, style une ligne de confirmation par liste ?
							$message_ok = _T('spiplistes:abonnement_modifie');
						}
					}
				}
			}
			else if (count ($mes_abos))
			{
				// tout est déselectionné ?
				// supprimer tout les abonnements !
				spiplistes_abonnements_auteur_desabonner ($id_auteur, 'toutes');
				$mes_abos = array();
			}
			
			if($format != $prev_format)
			{
				if ($format == 'non')
				{
					if (count ($mes_abos))
					{
						spiplistes_abonnements_auteur_desabonner ($id_auteur, 'toutes');
					}
					
					$message_ok = _T('spiplistes:desabonnement_valid').' :&nbsp;'.$email;  
				}
				else {
					spiplistes_format_abo_modifier($id_auteur, $format);
					$message_ok = _T('spiplistes:abonnement_modifie');
					$message_ok .= '<br />'._T('spiplistes:abonnement_nouveau_format').$format;
				}
			}
			
			spiplistes_auteurs_cookie_oubli_updateq ('', $d, $true);
		
			$contexte = array(
				'editable' => true,
				'message_ok' => $message_ok,
				'format' => $format
			);
		}
	}
	
	return ($contexte);
}
function exec_spiplistes_abonne_edit () {

	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_presentation');
	include_spip('inc/spiplistes_lister_courriers_listes');

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		;

	// initialise les variables postees par le formulaire
	foreach(array(
		'id_auteur'
		, 'btn_confirmer_format', 'modif_abo'
		) as $key) {
		$$key = _request($key);
	}
	foreach(array('id_auteur') as $key) {
		$$key = intval($$key);
	}

	$flag_editable = (
		($id_auteur > 0) 
		&& (
			(($connect_statut == "0minirezo") && $connect_toutes_rubriques)
			|| ($connect_id_auteur == $id_auteur)
			)
		);
	
	//////////////////////////////////////////////////////
	// Modifie format si demande
	if($flag_editable && $btn_confirmer_format) {
		switch($modif_abo) {
			case 'html':
			case 'texte':
				spiplistes_format_abo_modifier($id_auteur, $modif_abo);
				break;
			case 'suspend':
				spiplistes_format_abo_modifier($id_auteur, 'non');
				break;
			case 'non':
				spiplistes_abonnements_desabonner_statut($id_auteur, explode(";", _SPIPLISTES_LISTES_STATUTS_TOUS));
				break;
			}
	}

	//////////////////////////////////////////////////////
	// Recharge les donnees de l'auteur
	if($id_auteur > 0) {
	
		$sql_select = "nom,bio,email,nom_site,url_site,login,pass,statut,pgp,messagerie,imessage,low_sec";
		$sql_result = sql_select($sql_select, "spip_auteurs", "id_auteur=".sql_quote($id_auteur)." LIMIT 1");

		if($row = sql_fetch($sql_result)) {
			foreach(explode(",", $sql_select) as $key) {
				$$key = $row[$key];
			}
			$format_id_auteur = spiplistes_format_abo_demande($id_auteur);
		} else {
			$id_auteur = 0;
			$format_id_auteur = false;
		}
	}
	$format_abo = spiplistes_format_abo_demande($id_auteur);

	//////////////////////////////////////////////////////
	// preparation du bouton 
		// Propose de supprimer l'auteur invite 
	$gros_bouton_modifier = 
		($flag_editable)
		? icone (
				_T('admin_modifier_auteur')
				, generer_url_ecrire("auteur_infos", "id_auteur=$id_auteur&edit=oui")
				, 'redacteurs-24.gif'
				, "edit.gif"
				, "right"
				, false
				)
		: ""
		;
		// Propose de supprimer l'auteur invite 
	$gros_bouton_supprimer = 
		($id_auteur && $flag_editable && ($statut=='6forum'))
		? icone (
				_T('spiplistes:Supprimer_ce_contact')
				, generer_action_auteur(_SPIPLISTES_ACTION_SUPPRIMER_ABONNER, $id_auteur, generer_url_ecrire(_SPIPLISTES_EXEC_ABONNES_LISTE))
				, 'redacteurs-24.gif'
				, "supprimer.gif"
				, "right"
				, false
				)
		: ""
		;

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

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

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . " - " . $titre_page, $rubrique, $sous_rubrique));
	
	// la gestion des abonnes est reservee aux admins et a l'auteur
	if(!$flag_editable) {
		// erreur sur appel de page ?
		if(!($id_auteur > 0)) {
			die (spiplistes_terminer_page_donnee_manquante() . fin_page());
		}
		die (spiplistes_terminer_page_non_autorisee() . fin_page());
	}
	
	$page_result = ""
		. "<br /><br /><br />\n"
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. spiplistes_boite_info_id(_T('titre_cadre_numero_auteur'), $id_auteur, true, 'id_auteur')
		//. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
		. spiplistes_boite_raccourcis(true)
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		;
	
	$page_result .= ""
		. debut_cadre_relief(spiplistes_get_icone_auteur($statut), true)
		. "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n"
		. "<tr><td valign='top'>\n"
		. spiplistes_gros_titre($nom, '', true)
		. "<br />\n"
		;
	if(strlen($email) || strlen($nom_site)) {			
		$page_result .= ""
			. "<span class='verdana3'>"
			. (strlen($email) ? _T('email_2')."<strong><a href='mailto:$email'>$email</a></strong><br />\n" : "")
			. (strlen($nom_site) ? _T('info_site_2')."<strong><a href='$url_site'>$nom_site</a></strong>" : "")
			. "</span><br />\n"
			;
	} 
	
	// Si adresse mail, permettre l'abonnement
	if(strlen($email)) {
		$message_alert_abo = 
			(!$format_id_auteur)
			? spiplistes_form_description_alert(_T('spiplistes:abonne_sans_format'), true)
			: ""
			;
		$page_result .= ""
			. "</td>"
			. "<td>"
			// le gros bouton modifier si besoin
			. $gros_bouton_modifier
			. "</td></tr>\n"
			. "<tr><td width='100%' colspan='2'>\n"
			. (strlen($bio) ? "<blockquote class='spip' style='padding:1em;'>".propre($bio)."</blockquote>\n" : "")
			. "</td>\n"
			. "</tr></table>\n"
			. "<br />\n"
			. debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'courriers_listes-24.png', true, '', _T('spiplistes:format_de_reception').":")
			. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_ABONNE_EDIT), true)
			. spiplistes_form_description(_T('spiplistes:format_de_reception_desc'), true)
			. $message_alert_abo
			. debut_cadre_relief('', true)
			. "<table width='100%'  border='0' cellspacing='0' cellpadding='0'><tr>"
			. "<td class='verdana2'>"._T('spiplistes:format_de_reception')."</td>\n"
			. "<td>"
			. spiplistes_form_input_radio ('modif_abo', 'html', _T('spiplistes:html')
				, ($format_abo == 'html'), true, false)
			. "</td>\n"
			. "<td>"
			. spiplistes_form_input_radio ('modif_abo', 'texte', _T('spiplistes:texte')
				, ($format_abo == 'texte'), true, false)
			. "</td>\n"
			. "</tr></table>\n"
			. fin_cadre_relief(true)
			// suspendre les abonnements
			. debut_cadre_relief('', true)
			. spiplistes_form_input_radio ('modif_abo', 'suspend', _T('spiplistes:Desabonner_temporaire')
				, ($modif_abo == 'suspend'), true, false)
			. fin_cadre_relief(true)
			// resilier les abonnements
			. debut_cadre_relief('', true)
			. spiplistes_form_input_radio ('modif_abo', 'non', _T('spiplistes:Desabonner_definitif')
				, (($format_abo == 'non') && ($modif_abo != 'suspend')), true, false)
			. fin_cadre_relief(true)
			. "<input type='hidden' name='id_auteur' value=$id_auteur >\n"
			. spiplistes_form_bouton_valider('btn_confirmer_format')
			. spiplistes_form_fin(true)
			. fin_cadre_relief(true)
			;
	} else {
		$page_result .= ""
			. "</td><td></td></tr></table>\n"
			. "<p>"._T('spiplistes:adresse_mail_obligatoire')."</p>\n"
			. "<p><a href='".generer_url_ecrire("auteur_infos","id_auteur=$id_auteur&edit=oui")."'>"
				._T('spiplistes:editer_fiche_abonne')."</a></p>\n"
			;
	}
	
	$page_result .=
		fin_cadre_relief(true)
		//
		. "<br />\n"
		// Liste des abonnements
		. spiplistes_lister_courriers_listes(
			_T('spiplistes:abonne_listes')
			, _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'courriers_listes-24.png'
			, 'abonnements'
			, ''
			, false
			, 'position'
			, _SPIPLISTES_EXEC_LISTE_GERER
			, $id_auteur
		)
		//
		. $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();
}