function exec_spiplistes_courriers_casier () {
	
	include_spip ('inc/acces');
	include_spip ('inc/filtres');
	include_spip ('inc/config');
	include_spip ('inc/barre');
	
	include_spip ('inc/mots');
	include_spip ('inc/documents');
	
	include_spip('inc/spiplistes_api_globales');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_presentation');
	include_spip('inc/spiplistes_naviguer_paniers');

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		, $supp_dest
		;

	///////////////////////////
	// initialise les variables postées par formulaire (formulaire gerer)
	foreach(array(
		'btn_confirmer_envoi', 'id_courrier', 'id_liste', 'id_auteur_test', 'btn_annuler_envoi'
		, 'statut'
		, 'btn_supprimer_courrier'
		, 'btn_arreter_envoi' // si valide, contient id du courrier
		) as $key) {
		$$key = _request($key);
	}
	foreach(array('id_courrier', 'id_liste', 'id_auteur_test'
		, 'btn_supprimer_courrier', 'btn_arreter_envoi'
		) as $key) {
		$$key = intval($$key);
	}

	$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)));

	$flag_modifiable = ($flag_admin || $flag_moderateur || $flag_createur);

	if($flag_modifiable) {

		// annuler le destinataire d'un courrier (retour de courrier_gerer)
		// repasse le courrier en mode 'redac'
		if($btn_annuler_envoi) {
			spiplistes_courrier_modifier(
				$id_courrier
				, array(
					'email_test' => ''
					, 'id_liste' => 0
					, 'total_abonnes' => 0
					, 'statut' => _SPIPLISTES_COURRIER_STATUT_REDAC
				)						
			);
		}

		// confirmer l'envoi d'un courrier
		if($btn_confirmer_envoi) {
			// passe le courrier directement a la meleuse
			if($id_liste >= 0) {
				// destinataire(s) = abonnés à une liste
				// si id_liste == 0, destinataire = adresse email de test
				spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier);
				spiplistes_courrier_remplir_queue_envois($id_courrier, $id_liste, $id_auteur_test);
				if($id_liste > 0) {
					spiplistes_debug_log('SEND id_courrier #'.$id_courrier
										. ' ON id_liste #'.$id_liste
										. ' BY id_auteur #'.$connect_id_auteur
										);
				} else {
					spiplistes_debug_log('SEND id_courrier #'.$id_courrier
										 . ' TO id_auteur #'.$id_auteur_test
										 . ' TEST BY id_auteur #'.$connect_id_auteur
										 );
				}
			}
			spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ENCOURS);
		}
	
		// supprimer un courrier des cases
		if($btn_supprimer_courrier) {
			sql_delete("spip_courriers", "id_courrier=".sql_quote($btn_supprimer_courrier)." LIMIT 1");
			spiplistes_courrier_supprimer_queue_envois('id_courrier', $btn_supprimer_courrier);
		}
		
		// arreter un courrier en cours d'envoi
		if($btn_arreter_envoi) {
			spiplistes_courrier_modifier(
				$btn_arreter_envoi 
				, array(
					'statut' => _SPIPLISTES_COURRIER_STATUT_STOPE
					, 'date_fin_envoi' => "NOW()"
				)
			);
			spiplistes_courrier_supprimer_queue_envois('id_courrier', $btn_arreter_envoi);
		}
		
	} // end if $flag_modifiable

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

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

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . " - " . $titre_page, $rubrique, $sous_rubrique));
	
	// la gestion des courriers est réservée 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_naviguer_paniers_courriers(_T('spiplistes:aller_au_panier_'), true)
		. 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()
		. spiplistes_boite_info_spiplistes(true)
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		;
			
	$icone = _DIR_PLUGIN_SPIPLISTES_IMG_PACK.'courriers_listes-24.png';
	
	$_skip_statut = "Sauter une table pour afficher chronos";

	// Début de liste
	$listes_statuts = array(
		_SPIPLISTES_COURRIER_STATUT_ENCOURS, _SPIPLISTES_COURRIER_STATUT_REDAC
		, _SPIPLISTES_COURRIER_STATUT_READY
		, $_skip_statut
		, _SPIPLISTES_COURRIER_STATUT_AUTO, _SPIPLISTES_COURRIER_STATUT_PUBLIE
		, _SPIPLISTES_COURRIER_STATUT_VIDE, _SPIPLISTES_COURRIER_STATUT_IGNORE
		, _SPIPLISTES_COURRIER_STATUT_STOPE, _SPIPLISTES_COURRIER_STATUT_ERREUR
		);
	$mes_statuts = ($statut && in_array($statut, $listes_statuts)) ? array($statut) : $listes_statuts;
	foreach($mes_statuts as $statut) {

		if($statut == $_skip_statut) {
			// liste des courriers programmés (des listes)
			$page_result .= ""
				. spiplistes_afficher_pile_messages()
				. "<br />"
				;
		}
		else {
			$page_result .= ""
				. spiplistes_lister_courriers_listes(
					spiplistes_items_get_item("tab_t", $statut)
						.	(
							($desc = spiplistes_items_get_item("desc", $statut))
							? "<br /><span style='font-weight:normal;'>$desc</span>"
							: ""
							)
					, spiplistes_items_get_item("icon", $statut)
					, 'courriers'
					, $statut
					, false
					, 'position'
					, _SPIPLISTES_EXEC_COURRIER_GERER
				)
				;
		}
	}

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

} // exec_spip_listes()
Example #2
0
/**
 * cron_spiplistes_cron() 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
 * @return null|int
 */
function cron_spiplistes_cron ($last_time) { 

	include_spip('inc/utils');
	include_spip('inc/spiplistes_api_globales');
	include_spip('base/spiplistes_tables');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier');
	include_spip('inc/spiplistes_api_abstract_sql');

	$prefix_log = 'CRON: ';

	// initialise les options (prefs spiplistes)
	foreach(array(
		'opt_suspendre_trieuse'
		) as $key) {
		$$key = spiplistes_pref_lire($key);
	}

	if($opt_suspendre_trieuse == 'oui') {
		spiplistes_log($prefix_log.'SUSPEND MODE !!!');
		if(spiplistes_courriers_en_queue_compter('etat='.sql_quote('')) > 0) {
			include_spip('inc/spiplistes_meleuse');
			return(spiplistes_meleuse($last_time));
		}
		else {
			return($last_time);
		}
	}

	$current_time = time();

	$sql_select = array(
		'id_liste', 'titre', 'titre_message', 'date', 'maj'
		, 'message_auto', 'periode', 'lang', 'patron', 'statut'
	);

	// demande les listes auto a' envoyer (date <= maintenant)
	$sql_where = 'message_auto='.sql_quote('oui').'
			AND date > 0  
			AND date <= NOW()
			AND ('.spiplistes_listes_sql_where_or(_SPIPLISTES_LISTES_STATUTS_OK).')
			'
		;
	$listes_privees_et_publiques = sql_select(
		$sql_select
		, 'spip_listes'
		, $sql_where
		);
	
	$nb_listes_ok = sql_count($listes_privees_et_publiques);
	
	spiplistes_debug_log($prefix_log.'nb listes depart: '.$nb_listes_ok);

	if($nb_listes_ok > 0) {
	
		$mod_listes_ids = spiplistes_mod_listes_get_id_auteur('toutes');
		
		while($row = sql_fetch($listes_privees_et_publiques)) {
		
			// initalise les variables
			foreach($sql_select as $key) {
				$$key = $row[$key];
			}
			$id_liste = intval($id_liste);
			$periode = intval($periode);
			$envoyer_quand = $date;
			$dernier_envoi = $maj;
		
			// demande id_auteur de la liste pour signer le courrier
			// si plusieurs moderateurs, prend le premier
			$id_auteur = 
				(isset($mod_listes_ids[$id_liste]) && ($mod_listes_ids[$id_liste][0] > 0))
				? $mod_listes_ids[$id_liste][0]
				: 1 // attribue a l'admin principal si manquant
				;
			
			// Tampon date prochain envoi (dans 'date') et d'envoi (dans 'maj')
			$sql_set = $next_time = false;
			if(in_array($statut, explode(';', _SPIPLISTES_LISTES_STATUTS_PERIODIQUES))) 
			{
				// prendre la date du jour plutot que la dernier date choisie
				// sinon, une lettre quotidienne du mois precedent
				// se verra envoyee autant de fois que de jours en attente
				//$job_time = strtotime($envoyer_quand);
				$job_time = strtotime(spiplistes_sql_now());
					
				$job_heure = date('H', $job_time);
				$job_minute = date('i', $job_time);
				$job_mois = date('m', $job_time);
				$job_jour = (($statut == _SPIPLISTES_LIST_PUB_MONTHLY) ? 1 : date('j', $job_time));
				$job_an = date('Y'); // la date est forcee par celle du systeme (eviter erreurs)
				switch($statut) {
					case _SPIPLISTES_LIST_PRIV_YEARLY:
					case _SPIPLISTES_LIST_PUB_YEARLY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois, $job_jour, $job_an+1);
						break;
					case _SPIPLISTES_LIST_PRIV_MENSUEL:
					case _SPIPLISTES_LIST_PRIV_MONTHLY:
					case _SPIPLISTES_LIST_PUB_MENSUEL:
					case _SPIPLISTES_LIST_PUB_MONTHLY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois+1, $job_jour, $job_an);
						break;
					case _SPIPLISTES_LIST_PRIV_HEBDO:
					case _SPIPLISTES_LIST_PRIV_WEEKLY:
					case _SPIPLISTES_LIST_PUB_HEBDO:
					case _SPIPLISTES_LIST_PUB_WEEKLY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois, $job_jour+7, $job_an);
						break;
					case _SPIPLISTES_LIST_PRIV_DAILY:
					case _SPIPLISTES_LIST_PUB_DAILY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois, $job_jour+$periode, $job_an);
						break;
					default:
						$sql_set = array('date' => sql_quote(''), 'message_auto' => sql_quote('non'));
						break;
				}
			}
			else if($periode) {
				$next_time = time() + (_SPIPLISTES_TIME_1_DAY * $periode);
			}
			else {
				// pas de periode ? c'est un envoyer_maintenant.
				// applique le tampon date d'envoi et repasse la liste en auto non
				$sql_set = array('date' => sql_quote(''), 'message_auto' => sql_quote('non'));
			}
			if($next_time || count($sql_set)) {
				if($next_time) {
					// prochaine date d'envoi dans 'date'
					$sql_set = array('date' => sql_quote(normaliser_date($next_time)));
				}
				$sql_set['maj'] = 'NOW()';
				sql_update(
					'spip_listes'
					, $sql_set
					, 'id_liste='.sql_quote($id_liste).' LIMIT 1'
					);
			}
	
			/////////////////////////////
			// preparation du courrier a placer dans le panier (spip_courriers)
			// en cas de periode, la date est dans le passe'
			// pour avoir les elements publies depuis cette date
			if (
				empty($titre_message)
				&& (spiplistes_pref_lire_defaut('opt_completer_titre_nom_site', 'oui') == 'oui')
			) {
					$titre .= _T('spiplistes:_de_')
						. spiplistes_nom_site_texte($lang);
			}
			else {
				$titre = $titre_message;
			}
			
			spiplistes_debug_log ($prefix_log.'utiliser patron '._SPIPLISTES_PATRONS_DIR.$patron);
			
			list($courrier_html, $courrier_texte) = spiplistes_courriers_assembler_patron (
				_SPIPLISTES_PATRONS_DIR . $patron
				, array('date' => $dernier_envoi, 'patron'=>$patron, 'lang'=>$lang));
			
			//$taille_courrier_ok = (($n = spiplistes_strlen(spiplistes_courrier_version_texte($courrier_html))) > 10);
			$taille_courrier_ok = (($n = strlen($courrier_texte)) > 10);
			
			spiplistes_debug_log($prefix_log.'taille courrier pour la liste #'.$id_liste.' : '.$n);

			if($taille_courrier_ok) {
				include_spip('inc/filtres');
				$courrier_html = spiplistes_liens_absolus ($courrier_html);
				$date_debut_envoi = $date_fin_envoi = "''";
				$statut = _SPIPLISTES_COURRIER_STATUT_ENCOURS;
			}
			else {
				$date_debut_envoi = $date_fin_envoi = 'NOW()';
				$statut = _SPIPLISTES_COURRIER_STATUT_VIDE;
				spiplistes_debug_log($prefix_log.'courrier vide');
			}

			// Place le courrier dans le casier
			$id_courrier = sql_insert(
				'spip_courriers'
				,	'('
					. 'titre
						,date
						,statut
						,type
						,id_auteur
						,id_liste
						,date_debut_envoi
						,date_fin_envoi
						,texte
						,message_texte'
					. ')'
				, 	'('
					. sql_quote($titre)
					. ',NOW()'
					. ','.sql_quote($statut)
					. ','.sql_quote(_SPIPLISTES_COURRIER_TYPE_LISTEAUTO)
					. ','.sql_quote($id_auteur)
					. ','.sql_quote($id_liste)
					. ','.$date_debut_envoi
					. ','.$date_fin_envoi
					. ','.sql_quote($courrier_html)
					. ','.sql_quote($courrier_texte)
					. ')'
			);

			if($taille_courrier_ok) {
				// place les etiquettes
				// (ajout des abonnes dans la queue (spip_auteurs_courriers))
				spiplistes_courrier_remplir_queue_envois($id_courrier, $id_liste);
			} 
		} // end while // fin traitement des listes
	}	
	
	/////////////////////////////
	// Si panier des etiquettes plein, appel de la meleuse
	if(
		$n = 
			spiplistes_courriers_en_queue_compter('etat='.sql_quote(''))
	){

		spiplistes_debug_log($prefix_log.$n.' job(s), appel meleuse');

		include_spip('inc/spiplistes_meleuse');
		return(spiplistes_meleuse($last_time));
	}
	else {
		spiplistes_debug_log($prefix_log.'NO JOB');
	}
	return ($last_time); 
} // cron_spiplistes_cron()