From dbb7f98195aed9f573aa3354eb2b647ffe3033a9 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 27 May 2007 12:32:12 +0000
Subject: [PATCH] syndication d'un feed sans link (ou contenant plusieurs fois
 le meme link) ; on se base alors sur le titre comme cle de syndication +
 quelques globales #877

---
 ecrire/exec/sites.php          |  5 ++--
 ecrire/inc/afficher_objets.php |  7 ++++--
 ecrire/inc/syndic.php          | 44 ++++++++++++++++++++++++----------
 ecrire/public.php              |  4 ++--
 4 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/ecrire/exec/sites.php b/ecrire/exec/sites.php
index bb35fa7338..a41c626f5d 100644
--- a/ecrire/exec/sites.php
+++ b/ecrire/exec/sites.php
@@ -22,9 +22,10 @@ function exec_sites_dist()
 {
 	global $spip_lang_left,  $spip_lang_right, $spip_display;
 
-	global $cherche_mot, $select_groupe, $id_syndic;
+	$cherche_mot = _request('cherche_mot');
+	$select_groupe = _request('select_groupe');
+	$id_syndic = intval(_request('id_syndic'));
 
-	$id_syndic = intval($id_syndic);
 	$commencer_page = charger_fonction('commencer_page', 'inc');
 	if (!autoriser('voir','site',$id_syndic)){
 		echo $commencer_page("$titre_page","naviguer","sites", $id_rubrique);
diff --git a/ecrire/inc/afficher_objets.php b/ecrire/inc/afficher_objets.php
index d2cb225c7e..f6c51d22eb 100644
--- a/ecrire/inc/afficher_objets.php
+++ b/ecrire/inc/afficher_objets.php
@@ -126,8 +126,11 @@ function afficher_titre_syndic_article($row){
 	$lesauteurs=typo($row["lesauteurs"]);
 	$statut=$row["statut"];
 	$descriptif=safehtml($row["descriptif"]);
-	
-	$s = "<a href='$url'>$titre</a>";
+
+	if ($url)
+		$s = "<a href='$url'>$titre</a>";
+	else
+		$s = $titre;
 
 	$date = affdate_court($date);
 	if (strlen($lesauteurs) > 0) $date = $lesauteurs.', '.$date;
diff --git a/ecrire/inc/syndic.php b/ecrire/inc/syndic.php
index 1c7800525b..0baa818882 100644
--- a/ecrire/inc/syndic.php
+++ b/ecrire/inc/syndic.php
@@ -377,16 +377,35 @@ function analyser_backend($rss, $url_syndic='') {
 // Insere un article syndique (renvoie true si l'article est nouveau)
 //
 // http://doc.spip.org/@inserer_article_syndique
-function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume, $documents) {
+function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume, $documents, &$faits) {
 	// Creer le lien s'il est nouveau - cle=(id_syndic,url)
-	// On coupe a 255 caracteres pour eviter tout doublon sur une URL de plus de 255 qui
-	// exloserait la base de donnees
+	// On coupe a 255 caracteres pour eviter tout doublon
+	// sur une URL de plus de 255 qui exloserait la base de donnees
 	$le_lien = substr($data['url'], 0,255);
 
-	$s = spip_query("SELECT * FROM spip_syndic_articles WHERE url=" . _q($le_lien) . " AND id_syndic=$now_id_syndic ORDER BY maj LIMIT 0,1");
-	if ($a = spip_fetch_array($s)) {
+	// Chercher les liens de meme cle
+	$s = spip_query("SELECT id_syndic_article,titre FROM spip_syndic_articles WHERE url=" . _q($le_lien) . " AND id_syndic=$now_id_syndic ORDER BY maj DESC");
+
+	// S'il y a plusieurs liens qui repondent, il faut choisir le plus proche
+	// (ie meme titre et pas deja fait), le mettre a jour et ignorer les autres
+	if (spip_num_rows($s) > 1) {
+		while ($a = spip_fetch_array($s))
+			if ($a['titre'] == $data['titre']
+			AND !in_array($a['id_syndic_article'], $faits)) {
+				$id_syndic_article = $a['id_syndic_article'];
+				break;
+			}
+	}
+
+	// Sinon, s'il y en a un, on verifie qu'on ne vient pas de l'ecrire avec
+	// un autre item du meme feed qui aurait le meme link
+	else if ($a = spip_fetch_array($s)
+	AND !in_array($a['id_syndic_article'], $faits)) {
 		$id_syndic_article = $a['id_syndic_article'];
-	} else {
+	}
+
+	// Si l'article n'existe pas, on le cree
+	if (!isset($id_syndic_article)) {
 		if (spip_sql_error()) {
 			return;
 		} else {
@@ -395,6 +414,7 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $u
 			$ajout = true;
 		}
 	}
+	$faits[] = $id_syndic_article;
 
 	// Descriptif, en mode resume ou mode 'full text'
 	// on prend en priorite data['descriptif'] si on est en mode resume,
@@ -482,22 +502,22 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
 	// Les enregistrer dans la base
 	if (is_array($articles)) {
 		$urls = array();
+		$faits = array();
 		foreach ($articles as $data) {
-			inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume'], $row['documents']);
-			$urls[] = $data['url'];
+			inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume'], $row['documents'], $faits);
 		}
 
 		// moderation automatique des liens qui sont sortis du feed
-		if (count($urls) > 0
+		if (count($faits) > 0
 		AND $row['miroir'] == 'oui') {
-			spip_query("UPDATE spip_syndic_articles	SET statut='off', maj=maj WHERE id_syndic=$now_id_syndic AND NOT (url IN ("	. join(",", array_map('_q',$urls))	. "))");
+			spip_query("UPDATE spip_syndic_articles	SET statut='off', maj=maj WHERE id_syndic=$now_id_syndic AND NOT (id_syndic_article IN (" . join(",", $faits) . "))");
 		}
 
 		// suppression apres 2 mois des liens qui sont sortis du feed
-		if (count($urls) > 0
+		if (count($faits) > 0
 		AND $row['oubli'] == 'oui') {
 			$time = date('U') - 61*24*3600; # deux mois
-			spip_query("DELETE FROM spip_syndic_articles WHERE id_syndic=$now_id_syndic AND UNIX_TIMESTAMP(maj) < $time AND UNIX_TIMESTAMP(date) < $time AND NOT (url IN (" . join(",", array_map('_q',$urls)) . "))");
+			spip_query("DELETE FROM spip_syndic_articles WHERE id_syndic=$now_id_syndic AND UNIX_TIMESTAMP(maj) < $time AND UNIX_TIMESTAMP(date) < $time AND NOT (id_syndic_article IN (" . join(",", $faits) . "))");
 		}
 
 
diff --git a/ecrire/public.php b/ecrire/public.php
index 8964516dba..c6c7353f1c 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -56,8 +56,8 @@ if (defined('_INC_PUBLIC')) {
 		include_spip('inc/headers');
 		$var_f = charger_fonction($action, 'action');
 		$var_f();
-		if (isset($redirect) && $redirect)
-			redirige_par_entete(urldecode($redirect));
+		if (_request('redirect'))
+			redirige_par_entete(urldecode(_request('redirect')));
 		if (!headers_sent())
 			http_status(204); // No Content
 		exit;
-- 
GitLab