/**
 * Permet de forcer l'abonnement a une liste
 * $statut = "tous" => '6forum' + '1comite' + '0minirezo'
 * si statut == 'aucun', desabonne tous
 * @global string $connect_id_auteur
 * @global boolean $connect_toutes_rubriques
 * @global int $connect_id_auteur
 * @param int $id_liste
 * @param string $statut
 * @param boolean $forcer_format_reception
 * @return boolean
 */
function spiplistes_listes_forcer_abonnement ($id_liste, $statut, $forcer_format_reception) {

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		;

	$id_liste = intval($id_liste);
	
	if ($id_liste <= 0) {
		return(false);
	}
	
	$sql_where = '';
	
	if($statut=="tous") {
		$sql_where = " (statut=".sql_quote('6forum')." OR statut=".sql_quote('1comite')." OR statut=".sql_quote('0minirezo').")";
	}
	if($statut=="auteurs") {
		$sql_where = " (statut=".sql_quote('1comite')." OR statut=".sql_quote('0minirezo').")";
	}
	else if(in_array($statut, array('6forum', '1comite', '0minirezo'))) {
		$sql_where = " statut=".sql_quote($statut)."";
	}
	
	if(!empty($sql_where)) {
		
		// cherche les non-abonnes
		/*
		 * "SELECT id_auteur FROM spip_auteurs WHERE $sql_where AND LENGTH(email) AND id_auteur NOT IN ($selection)"
		 */
		$selection =
			(spiplistes_spip_est_inferieur_193())
			? "SELECT id_auteur FROM spip_auteurs_listes WHERE id_liste=".sql_quote($id_liste)
			: sql_select("id_auteur", "spip_auteurs_listes", "id_liste=".sql_quote($id_liste),'','','','','',false)
			;
		$sql_result = sql_select(
			  'id_auteur'
			, 'spip_auteurs'
			, array(
				  $sql_where
				, "LENGTH(email)"
				, "id_auteur NOT IN ($selection)"
			)
		);

		if($sql_result) {

			$sql_values = $elargis = "";
			$nb = sql_count($sql_result);

			if($nb > 0) {
				while($row = sql_fetch($sql_result)) {
					$sql_values .= 
						" (".sql_quote(intval($row['id_auteur']))
						. ", $id_liste, NOW()"
						// rajoute le format si force'
						. (($forcer_format_reception) ? "," . sql_quote($forcer_format_reception) : "")
						. "),";
					$elargis .= sql_quote(intval($row['id_auteur']));
				}

				if(!empty($sql_values)) {
					$sql_values = rtrim($sql_values, ",");
					$sql_result = sql_insert('spip_auteurs_listes'
						, "(id_auteur, id_liste, date_inscription" . ($forcer_format_reception ? ",format" : "") . ")"
						, $sql_values
						);
					if($sql_result === false) {
						spiplistes_sqlerror_log("listes_forcer_abonnement");
						return(false);
					}
					else {
						spiplistes_log($nb . " AUTEURS ($statut) ADDED TO LISTE #$id_liste BY ID_AUTEUR #$connect_id_auteur");
						
						if($forcer_format_reception) {
							// le format est demande' force'.
							// rajouter les abonnes manquants a spip_auteurs_elargis
							$sql_insert = "
								INSERT INTO spip_auteurs_elargis (id_auteur,`spip_listes_format`)
								SELECT l.id_auteur,l.format FROM spip_auteurs_listes AS l
									WHERE l.id_liste=" . sql_quote($id_liste) . " 
										AND NOT EXISTS (SELECT NULL FROM spip_auteurs_elargis AS e
											WHERE l.id_auteur = e.id_auteur)
								";
							if(sql_query($sql_insert) === false) {
								spiplistes_sqlerror_log("listes_forcer_abonnement");
							}
							else {
								spiplistes_log("RECEPT. FORMAT MODIFIED FOR ID_LISTE #$id_liste BY ID_AUTEUR #$connect_id_auteur");
							}
						}
						return($nb);
					}
				} 
			}
			return(0); // pas d'abo a rajouter. Pas une erreur.
		}
		return(false);
	}
	else if($statut == "aucun") {
	// desabonner tous

		$result = 0;
		$sql_result = sql_delete('spip_auteurs_listes', "id_liste=".sql_quote($id_liste));
		if($sql_result) {
			spiplistes_log("auteurs (tous) removed from id_liste #$id_liste by id_auteur #$connect_id_auteur");
			$result++;
			return($result);
		}
	}
	return(false);
} // end spiplistes_listes_forcer_abonnement()
Exemplo n.º 2
0
function spiplistes_import(
	$filename
	, $realname
	, $abos_liste
	, $format_abo = 'non'
	, $separateur = "\t"
	, $flag_admin
	, $listes_autorisees
	, $forcer_abo = false
) {
	$result_affiche = '';
	
	if(is_readable($filename))
	{
		// abonner les adresses importees
		// aux listes...
		if(!is_array($abos_liste))
		{
			if(($ii = intval($abos_liste)) <= 0)
			{
				return(false);
			}
			$abos_liste = array($ii);
		}
		else
		{
			$abos_liste = array_map('intval', $abos_liste);
		}
		
		// recupere les logins et mails existants dans la base
		// pour eviter les doublons
		
		$current_entries = array();
		$sql_result = sql_select(array('id_auteur', 'login', 'email', 'nom'), 'spip_auteurs');
		
		while($row = spip_fetch_array($sql_result))
		{
			// ne prendre que les comptes qui ont un email
			if($m = $row['email']) {
				$m = strtolower($m);
				$current_entries[$m] = array('login' => strtolower($row['login'])
										   , 'id_auteur' => $row['id_auteur']
										   , 'nom' => $row['nom']
										   );
			}
		}
		//syslog(LOG_NOTICE, 'memory_get_usage[2]: ' . memory_get_usage());
		
		//
		spiplistes_log('import fichier '.$filename);
		$new_entries = file($filename);
		
		//syslog(LOG_NOTICE, 'memory_get_usage[3]: ' . memory_get_usage());
		
		$nb_new_entries = count($new_entries);
		
		$bad_dupli = $bad_email = 0;
		$statuts_auteurs = array('6forum', '1comite', '0minirezo');
		
		// charger la table des abonnements en ram afin d'eviter les petites requettes
		$abonnements = array();
		if(($sql_result = sql_select('id_auteur,id_liste'
									, 'spip_auteurs_listes')
			) !== false)
		{
			while($row = sql_fetch($sql_result)) {
				if(!isset($abonnements[$row['id_liste']])) {
					$abonnements[$row['id_liste']] = array();
				}
				$abonnements[$row['id_liste']][] = $row['id_auteur'];
			}
		}
		else {
			spiplistes_sqlerror_log('module import (abonnements)');
		}
		
		if($forcer_abo)
		{
			$auteurs_format = array();
			// charger la table des formats afin d'eviter les petites requettes
			if(($sql_result = sql_select("id_auteur,`spip_listes_format` AS format"
										, 'spip_auteurs_elargis')) !== false)
			{
				while($row = sql_fetch($sql_result)) {
					$auteurs_format[$row['id_auteur']] = $row['format'];
				}
			}
			else
			{
				spiplistes_sqlerror_log("module import (format)");
			}
		}
		
		// les formats
		$modifier_format = array();
		
		$err_import = _T('spiplistes:erreur_import_base');
		
		//syslog(LOG_NOTICE, 'memory_get_usage[2]: ' . memory_get_usage());
		//syslog(LOG_NOTICE, 'memory_get_peak_usage[2]: ' . memory_get_peak_usage());
		
		$start_time = microtime(1);
		
		$stack_new_auteurs = array();
		
		// statut temporaire
		$tmp_statut = '6abo'.date('YmdGis');
		
		for($jj = 0; $jj < $nb_new_entries; $jj++)
		{
			$nouvelle_entree = trim($new_entries[$jj]);
			
			if(!empty($nouvelle_entree)
			   // ni une ligne de commentaire
			   && !ereg("^[/#]", $nouvelle_entree))
			{
				list($email, $login, $nom) = explode($separateur, $nouvelle_entree);
				
				$email = strtolower(trim($email));
				
				$mail_exist = false;
				
				if(($email = email_valide($email))
				   &&	(
						!($mail_exist = array_key_exists($email, $current_entries))
						|| $forcer_abo
						)
				)
				{
					if(!$mail_exist)
					{
						// si le compte n'existe pas, le creer
						
						// commencer par calculer le login
						$login = trim($login);
						if(empty($login))
						{
							$login = spiplistes_login_from_email($email);
						}
						else
						{
							$login = strtolower($login);
						}
						// puis le nom
						$nom = trim($nom);
						if(empty($nom))
						{
							$nom = ucfirst($login);
						}
						
						// ajoute l'invite' dans la table des auteurs
						$pass = creer_pass_aleatoire(8, $email);
					
						// nouvel abo dans la pile des "a creer"
						$stack_new_auteurs[] = array(
							'nom' => $nom
							, 'email' => $email
							, 'login' => $login
							, 'pass' => md5($pass)
							, 'statut' => $tmp_statut
							, 'htpass' => generer_htpass($pass)
						);
					} // end if(!$mail_exist)
					
					// adresse mail existe dans la base
					// si on passe par ici, c'est sous-entendu $forcer_abo (abonne' un compte existant)
					else
					{
						$id_auteur = intval($current_entries[$email]['id_auteur']);
						
						// forcer le format dans la foulee
						if(!isset($auteurs_format[$id_auteur]))
						{
							$modifier_format[] = '(' . sql_quote($id_auteur) . ',' . sql_quote($format_abo) . ')';
						}
					}
					// est-ce vraiment utile (voir plus bas)
				}
				else
				{
					if($mail_exist) {
						$bad_dupli++;
						spiplistes_log('import dupli: '.$mail);
					}
					else {
						$bad_email++;
						spiplistes_log('import bad: '.$mail);
					}
				}
			}
		} // end for($jj = 0; $jj < $nb_new_entries; $jj++)
				
		// importer les nouveaux abonnés
		if(count($stack_new_auteurs))
		{
			$sql_col_names = '('.implode(',', array_keys($stack_new_auteurs[0])).')';
			$sql_col_values = '';
			
			//syslog(LOG_NOTICE, 'memory_get_usage[5]: ' . memory_get_usage());
			
			foreach($stack_new_auteurs as $auteur)
			{
				$values = array_map('sql_quote', $auteur);
				$sql_col_values .= '('.implode(',', $values).'),';
			}
			$sql_col_values = rtrim($sql_col_values,',');
			
			$r = sql_insert('spip_auteurs', $sql_col_names, $sql_col_values);
			
			spiplistes_debug_log ('size of imported values: ' . strlen($sql_col_values));
			
			//syslog(LOG_NOTICE, 'memory_get_usage[6]: ' . memory_get_usage());
			
			// nouveaux abonnements
			foreach($abos_liste as $id_liste)
			{
				// un INSERT sans VALUES
				// @todo: vérifier compatibilite sqlite et pg
				if(sql_query(
					'INSERT INTO spip_auteurs_listes
								(id_auteur,id_liste) SELECT a.id_auteur,'.$id_liste
									.' FROM spip_auteurs AS a WHERE a.statut='.sql_quote($tmp_statut))
				   === false
				)
				{
					spiplistes_sqlerror_log('import nouveaux abos dans spip_auteurs_listes');
				}
			}
			
			// format pour les nouveaux auteurs
				// un INSERT sans VALUES
				// @todo: vérifier compatibilite sqlite et pg
			if(sql_query(
				'INSERT INTO spip_auteurs_elargis
						(id_auteur,`spip_listes_format`) SELECT a.id_auteur,'.sql_quote($format_abo)
								.' FROM spip_auteurs AS a WHERE a.statut='.sql_quote($tmp_statut))
			   === false
			)
			{
				spiplistes_sqlerror_log('import nouveauxformats dans spip_auteurs_elargis');
			}
		
		}
		
		// Comptes deja existants, inclus dans le fichier import
		// - changer son format de réception ?
		// - l'ajouter aux listes sélectionnées ?
		// - ou ignorer ?
		if(count($modifier_format))
		{
			// pour l'instant: ignorer !
			// 
		}
		
		// redonner le bon statut visiteur aux nouveaux
		sql_update(array('spip_auteurs'), array('statut' => sql_quote('6forum')), array('statut='.sql_quote($tmp_statut)));

		// fin des req

		$result_affiche .=
			($tt = ($ii = count($stack_new_auteurs)) + ($jj = count($modifier_format)))
			?	'<ul>'.PHP_EOL
				. '<li class="verdana2">'._T('spiplistes:nb_comptes_importees_en_ms_dont_'
										 , array('nb' => $tt, 'ms' => (microtime(1) - $start_time)))
				. '<ul>'.PHP_EOL
					. '<li>'._T('spiplistes:nb_fiches_crees', array('nb' => $ii)).'</li>'.PHP_EOL
					//. '<li>'._T('spiplistes:nb_comptes_modifies', array('nb' => $jj)).'</li>'.PHP_EOL
					. '<li>'._T('spiplistes:nb_comptes_ignores', array('nb' => $jj)).'</li>'.PHP_EOL
				. '</ul>'.PHP_EOL
				. '</li>'.PHP_EOL
				. '</ul>'.PHP_EOL
			: '<br />'._T('spiplistes:pas_dimport').PHP_EOL
			;

		
		if($bad_dupli) {
			$result_affiche .= '<br />'._T('pass_erreur').' email: '._T('spiplistes:n_duplicata_mail', array('n' => $bad_dupli)).PHP_EOL;
		}
		if($bad_email) {
			$result_affiche .= '<br />'._T('pass_erreur').' email: '._T('spiplistes:n_incorrect_mail', array('n' => $bad_email)).PHP_EOL;
		}
		$result_affiche = _T('spiplistes:fichier_') . ' : <strong>'.$realname.'</strong><br />'.PHP_EOL
			. _T('spiplistes:' . ((count($abos_liste) > 1) ? 'Listes_de_destination_s' : 'Liste_de_destination_s')
				 , array('s' => '#' . implode(',#', $abos_liste))) .'<br />'.PHP_EOL
			. $result_affiche
			;
	}
	return($result_affiche);
}
Exemplo n.º 3
0
function spiplistes_auteurs_auteur_valider ($id_auteur, $as_redact = false) {
	if($id_auteur = intval($id_auteur)) {
		if(($result = sql_update(
						"spip_auteurs_listes"
						, array('statut' => sql_quote('valide'))
						, "id_auteur=$id_auteur LIMIT 1"
					)) === false) {
			spiplistes_sqlerror_log("auteurs_auteur_valider");
		}
		else {
			
		}
	}
	return($result);
}
function spiplistes_listes_selectionner_elligibles (
	$non_abonnes
	, $nb_non_abonnes
	, $id_liste
	, $tri
	, $script_action
	, $script_exec
	, $id_grosse_boite
	, $args_action = ''
	, $retour_ajax = false
) {
	static $bouton_id;
	$bouton_id++;
	$type_ajout = ($script_action == _SPIPLISTES_ACTION_MOD_GERER) ? "mod" : "abo";
	
	// si retour de formulaire, les vars sont dans le $_POST
	$cherche_auteur = trim(urldecode(_request('cherche_auteur')));
	$icone_loupe = trim(urldecode(_request('icone_loupe')));
	if(empty($icone_loupe)) {
		// En ajax, find_in_path() ne trouve pas le chemin correct.
		// Oblige' de le noter au premier appel
		// et le transmettre dans le form.
		$icone_loupe = find_in_path('images/loupe.png');
	}
	foreach(array('id_grosse_boite', 'script_exec', 'script_action') as $key) {
		if(empty($$key)) {
			$$key = urldecode(_request($key));
		}
	}

	$select_abo = "";
	$btn_ajouter = ""
		. "<span><input type='submit' value='"._T('bouton_ajouter')."' "
		. " onclick=\"return AjaxSqueeze(this.form, '$id_grosse_boite')\" "
		. " class='fondo' id='btn_ajouter_id_".$type_ajout."'/></span>\n"
		;
	if(empty($args_action)) {
		$args_action = "id_liste=$id_liste";
	}
	$action = generer_action_auteur($script_action, $args_action);
	$exec = generer_url_ecrire($script_exec, $args_action);
	
	// retour de formulaire ?
	if(!empty($cherche_auteur) && $id_liste) {

		$statut_liste = spiplistes_listes_liste_statut($id_liste);
		
		$nb_elligibles = 0;
		$sql_from = "spip_auteurs AS a";
		$sql_where = array(
			"a.nom LIKE '%$cherche_auteur%'"
			, "LENGTH(a.email)"
			, "(statut=".sql_quote('0minirezo')." OR statut=".sql_quote('1comite')
				// si pas une liste privée, complète le where
				. (($statut_liste != _SPIPLISTES_LIST_PRIVATE) ? " OR statut=".sql_quote('6forum') : "")
				. ")"
			, "NOT EXISTS (SELECT NULL FROM spip_auteurs_listes AS l WHERE l.id_auteur = a.id_auteur AND l.id_liste = ".sql_quote($id_liste).")"
			);
		/*
		 * la requete ci-dessus en + clair
		 *//*
		$sql_query = "SELECT id_auteur,nom,statut FROM spip_auteurs AS a
			WHERE nom LIKE '%$cherche_auteur%'
				AND LENGTH(a.email)
				AND (statut='0minirezo' OR statut='1comite' OR statut='6forum')
				AND NOT EXISTS (SELECT NULL FROM spip_auteurs_listes AS l WHERE l.id_auteur = a.id_auteur AND l.id_liste = $id_liste)";
		*/
		
		// demande la liste des elligibles recherches
		$sql_result = sql_select("id_auteur,nom,statut", $sql_from, $sql_where, '', array('statut','nom'));

		if($sql_result) {
			$elligibles = array();
			while($row = spip_fetch_array($sql_result)) {
				if(!isset($elligibles[$row['statut']])) {
					$elligibles[$row['statut']] = array();
				}
				$elligibles[$row['statut']][$row['id_auteur']] = $row['nom'];
				$nb_elligibles++;
			}
			$select_abo = spiplistes_elligibles_select ($elligibles, $nb_elligibles, $type_ajout) . $btn_ajouter;
		}
		else {
			spiplistes_sqlerror_log("listes_selectionner_elligibles");
		}
		
	}
	
	if(empty($select_abo) && ($nb_non_abonnes <= _SPIPLISTES_SELECT_MIN_AUTEURS)) {
		$select_abo = spiplistes_elligibles_select ($non_abonnes, $nb_non_abonnes, $type_ajout) . $btn_ajouter;
	}
	// au dela de _SPIPLISTES_SELECT_MIN_AUTEURS, afficher la boite de recherche. 
	else {
		  $select_abo = ""
		  	. "<div>"
		  	. "<label id='spiplistes_l_recherche'>"
			// en ajax, http_img_pack() ne retrouve pas son petit
		 	//. http_img_pack("loupe.png", _T('info_rechercher'), "width='26' height='20'")
			. "<img src='$icone_loupe' alt='"._T('info_rechercher')."' width='26' height='20' />"
			. "<input type='text' name='cherche_auteur' id='in_cherche_auteur' class='fondl' value='' size='20' style='margin:0 4px' />\n"
			. "</label>\n"
			. "<span><input type='submit' value='"._T('bouton_chercher')."' "
				. " id='btn_chercher_id' name='spiplistes_bouton_chercher'"
				// recherche ne rafraichit que ce formulaire
				. " onclick=\"return AjaxSqueeze(this.form, '"._SPIPLISTES_ID_FROM_ELLIGIBL."$bouton_id')\" "
				. " class='fondo' /></span>\n"
			. "</div>"
			. $select_abo
		  	;
	} 
	
	$result = ""
		// si retour ajax, ne pas ajouter le conteneur dans le conteneur ;-)
		. (($retour_ajax) ? "" : "<div id='"._SPIPLISTES_ID_FROM_ELLIGIBL."$bouton_id'>\n")
		. "<form style='margin:0px; border:0px' action='$action' method='post'>\n"
		. "<div id='boite_selection_elligibles_$bouton_id' style='padding:0;margin:0.5em 0 0'>\n"
		. $select_abo
		. "</div>\n"
		. "<input name='arg' type='hidden' value='$id_liste' />\n"
		. "<input name='action' type='hidden' value='".$script_action."' />\n"
		. "<input name='redirect' type='hidden' value='".$exec."' />\n"
		. "<input name='id_liste' type='hidden' value='$id_liste' />\n"
		. "<input name='tri' type='hidden' value='$tri' />\n"
		. "<input name='script_action' type='hidden' value='$script_action' />\n"
		. "<input name='script_exec' type='hidden' value='$script_exec' />\n"
		. "<input name='id_grosse_boite' type='hidden' value='$id_grosse_boite' />\n"
		. "<input name='icone_loupe' type='hidden' value='$icone_loupe' />\n"
		. "</form>\n"
		. (($retour_ajax) ? "" : "</div>\n")
		;
	
	return($result);
}