From e9900a75aefa848ab9dcd5b625e294a2d4817b84 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Tue, 30 Oct 2007 12:17:01 +0000
Subject: [PATCH] enregistrement et affichage des deplacements d'articles
 (corrige #848)

---
 ecrire/exec/articles_versions.php | 67 +++++++++++++++++++++----------
 ecrire/inc/revisions.php          | 18 ++++-----
 ecrire/inc/suivi_versions.php     | 40 ++++++++++++++----
 ecrire/inc/urls.php               | 14 +++----
 4 files changed, 94 insertions(+), 45 deletions(-)

diff --git a/ecrire/exec/articles_versions.php b/ecrire/exec/articles_versions.php
index bc7695eb88..2e1bc133de 100644
--- a/ecrire/exec/articles_versions.php
+++ b/ecrire/exec/articles_versions.php
@@ -25,17 +25,18 @@ function exec_articles_versions_args($id_article, $id_version, $id_diff)
 {
 	global $les_notes, $champs_extra, $spip_lang_left, $spip_lang_right;
 
-	$row = sql_fetsel("*", "spip_articles", "id_article=$id_article");
-
 	if (!autoriser('voirrevisions', 'article', $id_article) 
-		OR !$row) {
+	OR !$row = sql_fetsel("*", "spip_articles", "id_article="._q($id_article))){
 		include_spip('inc/minipres');
 		echo minipres();
-	} else {
+		return;
+	}
+
 	include_spip('inc/suivi_versions');
 	include_spip('inc/presentation');
 	include_spip('inc/revisions');
-	$commencer_page = charger_fonction('commencer_page', 'inc');
+
+	// recuperer les donnees actuelles de l'article
 	$id_article = $row["id_article"];
 	$id_rubrique = $row["id_rubrique"];
 	$titre_defaut = $titre = $row["titre"];
@@ -57,20 +58,8 @@ function exec_articles_versions_args($id_article, $id_version, $id_diff)
 	$id_trad = $row["id_trad"];
 	$lang = $row["lang"];
 
-	$last_version = false;
-	if (!$id_version) {
-		$id_version = $row['id_version'];
-		$last_version = true;
-	}
-
-	$textes = revision_comparee($id_article, $id_version, 'complet', $id_diff);
-	if (is_array($textes)) foreach ($textes as $var => $t) 
-	  { 
-	    //	cles de $textes = array('surtitre', 'titre', 'soustitre', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps');
-	    // defini dans suivi_versions.
-	    // Suicidaire. A reerire.
-	    $$var = $t;}
-
+	// Afficher le debut de la page (y compris rubrique)
+	$commencer_page = charger_fonction('commencer_page', 'inc');
 	echo $commencer_page(_T('info_historique')." &laquo; $titre &raquo;", "naviguer", "articles", $id_rubrique);
 
 	echo debut_grand_cadre(true);
@@ -101,15 +90,46 @@ function exec_articles_versions_args($id_article, $id_version, $id_diff)
 
 	echo debut_cadre_relief('', true);
 
+
+//
+// recuperer les donnees versionnees
+//
+	$last_version = false;
+	if (!$id_version) {
+		$id_version = $row['id_version'];
+		$last_version = true;
+	}
+	$textes = revision_comparee($id_article, $id_version, 'complet', $id_diff);
+
+	unset($id_rubrique); # on n'en n'aura besoin que si on affiche un diff
+
+	if (is_array($textes)) foreach ($textes as $var => $t) 
+	  { 
+	    //	cles de $textes = array('surtitre', 'titre', 'soustitre', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps');
+	    // defini dans suivi_versions.
+	    // Suicidaire. A reerire.
+	    $$var = $t;
+	  }
+
+
+
+
 //
 // Titre, surtitre, sous-titre
 //
 
 	echo "\n<table id='diff' cellpadding='0' cellspacing='0' border='0' width='100%'>";
 	echo "<tr><td style='width: 100%' valign='top'>";
+
+	if (isset($id_rubrique)) {
+		echo "<div dir='$lang_dir' class='arial1 spip_x-small'>",
+		$id_rubrique,
+		"</div>\n";
+	}
+
 	if ($surtitre) {
 		echo "<span  dir='$lang_dir'><span class='arial1 spip_medium'><b>", propre_diff($surtitre), "</b></span></span>\n";
-}
+	}
 	echo gros_titre(propre_diff($titre), puce_statut($statut_article, " style='vertical-align: center'") . " &nbsp; ", false);
 
 	if ($soustitre) {
@@ -149,7 +169,10 @@ function exec_articles_versions_args($id_article, $id_version, $id_diff)
 //
 
 
-	$result = sql_select("id_version, titre_version, date, id_auteur	", "spip_versions", "id_article=$id_article", "", "id_version DESC");
+	$result = sql_select("id_version, titre_version, date, id_auteur",
+		"spip_versions",
+		"id_article="._q($id_article)." AND  id_version>0",
+		"", "id_version DESC");
 
 	$zap = sql_count($result);
 
@@ -268,7 +291,7 @@ echo fin_cadre_relief(true);
 
 
 echo  fin_gauche(), fin_page();
-	}
+
 }
 
 ?>
diff --git a/ecrire/inc/revisions.php b/ecrire/inc/revisions.php
index b1057a5346..a4e804c262 100644
--- a/ecrire/inc/revisions.php
+++ b/ecrire/inc/revisions.php
@@ -28,22 +28,22 @@ function separer_paras($texte, $paras = "") {
 
 // http://doc.spip.org/@replace_fragment
 function replace_fragment($id_article, $version_min, $version_max, $id_fragment, $fragment) {
-	global $flag_gz;
-
 	$fragment = serialize($fragment);
 	$compress = 0;
-	/* pour le portage en PG il faut l'equivalente au mysql_escape_string
-	 et deporter son appel dans les fonctions d'abstraction. A revoir.
-		if ($flag_gz) {
+
+	// pour le portage en PG il faut l'equivalente au mysql_escape_string
+	// et deporter son appel dans les fonctions d'abstraction.
+	if ($GLOBALS['flag_gz']
+	AND $GLOBALS['connexions'][0]['type'] == 'mysql') {
 		$s = gzcompress($fragment);
 		if (strlen($s) < strlen($fragment)) {
-			//spip_log("gain gz: ".(100 - 100 * strlen($s) / strlen($fragment)));
+			# spip_log("gain gz: ".intval(100 - 100 * strlen($s) / strlen($fragment)));
 			$compress = 1;
 			$fragment = $s;
 		}
-	// Attention a bien echapper le $fragment qui est en binaire
-		} */
+	}
 
+	// Attention a echapper $fragment, binaire potentiellement gz
 	return array(
 		     'id_article' => intval($id_article),
 		     'id_fragment' => intval($id_fragment),
@@ -588,7 +588,7 @@ function propre_diff($texte) {
 function liste_champs_versionnes($table) {
 	if ($table == 'spip_articles')
 		return array('surtitre', 'titre', 'soustitre', 'descriptif',
-		'nom_site', 'url_site', 'chapo', 'texte', 'ps');
+		'nom_site', 'url_site', 'chapo', 'texte', 'ps', 'id_rubrique');
 	else
 		return array();
 }
diff --git a/ecrire/inc/suivi_versions.php b/ecrire/inc/suivi_versions.php
index 16d35034cb..94fd22cc4c 100644
--- a/ecrire/inc/suivi_versions.php
+++ b/ecrire/inc/suivi_versions.php
@@ -30,6 +30,19 @@ function afficher_para_modifies ($texte, $court = false) {
 	return $texte;
 }
 
+
+// Retourne le titre de la rubrique demandee, pour affichage de la chaine
+// "deplace de XX vers YY"
+// http://doc.spip.org/@titre_rubrique
+function titre_rubrique($id_rubrique) {
+	if (!$id = intval($id_rubrique))
+		return _T('info_sans_titre');
+
+	$t = sql_fetsel('titre', 'spip_rubriques', "id_rubrique=$id");
+	return typo($t['titre']);
+}
+
+
 // http://doc.spip.org/@afficher_suivi_versions
 function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = false, $lang = "", $court = false, $rss = false) {
 	
@@ -212,7 +225,7 @@ function revision_comparee($id_article, $id_version, $format='diff', $id_diff=NU
 		// Mode "complet": on veut afficher tous les champs
 		switch ($format) {
 			case 'complet':
-				$champs = array('surtitre', 'titre', 'soustitre', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps');
+				$champs = liste_champs_versionnes('spip_articles');
 				break;
 			case 'diff':
 			case 'apercu':
@@ -242,13 +255,26 @@ function revision_comparee($id_article, $id_version, $format='diff', $id_diff=NU
 			// si on a les deux, le diff nous interesse, plus ou moins court
 			if (isset($new[$champ])
 			AND isset($old[$champ])) {
-				$diff = new Diff(new DiffTexte);
-				$n = preparer_diff($new[$champ]);
-				$o = preparer_diff($old[$champ]);
-				$textes[$champ] = afficher_diff($diff->comparer($n,$o));
+				// cas particulier : id_rubrique
+				if (in_array($champ, array('id_rubrique'))) {
+					$textes[$champ] = _L("D&#233;plac&#233; de <b>&#171;&nbsp;"
+						. titre_rubrique($old[$champ])
+						. "&nbsp;&#187;</b> vers <b>&#171;&nbsp;"
+						. titre_rubrique($new[$champ])
+						. "&nbsp;&#187;</b>."
+					);
+				}
+				
+				// champs textuels
+				else {
+					$diff = new Diff(new DiffTexte);
+					$n = preparer_diff($new[$champ]);
+					$o = preparer_diff($old[$champ]);
+					$textes[$champ] = afficher_diff($diff->comparer($n,$o));
 
-				if ($format == 'diff' OR $format == 'apercu')
-					$textes[$champ] = afficher_para_modifies($textes[$champ], ($format == 'apercu'));
+					if ($format == 'diff' OR $format == 'apercu')
+						$textes[$champ] = afficher_para_modifies($textes[$champ], ($format == 'apercu'));
+				}
 			}
 		}
 	}
diff --git a/ecrire/inc/urls.php b/ecrire/inc/urls.php
index 81a9734098..d94a9b7d52 100644
--- a/ecrire/inc/urls.php
+++ b/ecrire/inc/urls.php
@@ -24,7 +24,7 @@ function generer_url_ecrire_article($id, $suite='', $ancre='', $statut='', $conn
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		$a .= "&ancre=" . $ancre;
+		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 		return generer_url_action('redirect', $a);
 	} else	return generer_url_ecrire('articles', $a) . ($ancre ? "#$ancre" : '');
 }
@@ -38,7 +38,7 @@ function generer_url_ecrire_rubrique($id, $suite='', $ancre='', $statut='', $con
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		$a .= "&ancre=" . $ancre;
+		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 		return generer_url_action('redirect', $a);
 	} else	return generer_url_ecrire('naviguer',$a) . ($ancre ? "#$ancre" : '');
 }
@@ -52,7 +52,7 @@ function generer_url_ecrire_breve($id, $suite='', $ancre='', $statut='', $connec
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		$a .= "&ancre=" . $ancre;
+		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 		return generer_url_action('redirect', $a);
 	} else	return generer_url_ecrire('breves_voir',$a) . ($ancre ? "#$ancre" : '');
 }
@@ -62,7 +62,7 @@ function generer_url_ecrire_mot($id, $suite='', $ancre='', $statut='', $connect=
 	$a = "id_mot=" . intval($id);
 	if ($suite) $a .= "&$suite";
 	if (!$statut) {
-		$a .= "&ancre=" . $ancre;
+		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 		return generer_url_action('redirect', $a);
 	} else	return generer_url_ecrire('mots_edit',$a) . ($ancre ? "#$ancre" : '');
 }
@@ -72,7 +72,7 @@ function generer_url_ecrire_site($id, $suite='', $ancre='', $statut='', $connect
 	$a = "id_syndic=" . intval($id);
 	if ($suite) $a .= "&$suite";
 	if (!$statut) {
-		$a .= "&ancre=" . $ancre;
+		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 		return generer_url_action('redirect', $a);
 	} else	return generer_url_ecrire('sites',$a) . ($ancre ? "#$ancre" : '');
 }
@@ -82,7 +82,7 @@ function generer_url_ecrire_auteur($id, $suite='', $ancre='', $statut='', $conne
 	$a = "id_auteur=" . intval($id);
 	if ($suite) $a .= "&$suite";
 	if (!$statut) {
-		$a .= "&ancre=" . $ancre;
+		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 		return generer_url_action('redirect', $a);
 	} else	return generer_url_ecrire('auteur_infos',$a) . ($ancre ? "#$ancre" : '');
 }
@@ -91,7 +91,7 @@ function generer_url_ecrire_auteur($id, $suite='', $ancre='', $statut='', $conne
 function generer_url_ecrire_forum($id, $suite='', $ancre='', $statut='', $connect='') {
 	$a = "id_forum=" . intval($id);
 	if ($suite) $a .= "&$suite"; 
-	$a .= "&ancre=" . $ancre;
+	if (strlen($ancre)) $a .= "&ancre=" . $ancre;
 	return generer_url_action('redirect', $a);
 }
 
-- 
GitLab