From 292175e492398daff3fa30f42aadfbe1bf17c158 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Mon, 14 Aug 2006 21:20:32 +0000
Subject: [PATCH] =?UTF-8?q?Gestion=20en=20dehors=20de=20articles.php=20des?=
 =?UTF-8?q?=202=20modifs=20de=20id=5Ftrad.=20Le=20test=20de=20traduction?=
 =?UTF-8?q?=20redondante=20ne=20marche=20pas,=20mais=20il=20semble=20que?=
 =?UTF-8?q?=20cela=20remonte=20=C3=A0=20loin=20(la=20faute=20de=20syntaxe?=
 =?UTF-8?q?=20dans=20les=20attributs=20en=20cas=20de=20message=20d'erreur?=
 =?UTF-8?q?=20en=20est=20un=20autre=20indice).=20A=20noter=20aussi=20que?=
 =?UTF-8?q?=20le=20petit=20triangle=20donnant=20aux=20formulaires=20sur=20?=
 =?UTF-8?q?les=20traductions=20ne=20tourne=20pas.=20Mais=20on=20n'est=20pa?=
 =?UTF-8?q?s=20loin=20de=20la=20mise=20en=20Ajax=20de=20tout=20le=20bloc?=
 =?UTF-8?q?=20sur=20les=20traductions.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes                          |   1 +
 ecrire/action/editer_article.php        |  69 ++++++++++++---
 ecrire/action/referencer_traduction.php |  32 +++++++
 ecrire/exec/articles.php                | 110 ++++++++----------------
 4 files changed, 123 insertions(+), 89 deletions(-)
 create mode 100644 ecrire/action/referencer_traduction.php

diff --git a/.gitattributes b/.gitattributes
index 8b0002f3f1..8fe6c94022 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -43,6 +43,7 @@ ecrire/action/petitionner.php -text
 ecrire/action/poster.php -text
 ecrire/action/purger.php -text
 ecrire/action/redirect.php -text
+ecrire/action/referencer_traduction.php -text
 ecrire/action/supprimer.php -text
 ecrire/action/supprimer_traduction.php -text
 ecrire/action/test_dirs.php -text
diff --git a/ecrire/action/editer_article.php b/ecrire/action/editer_article.php
index da51bc3a64..7064b68617 100644
--- a/ecrire/action/editer_article.php
+++ b/ecrire/action/editer_article.php
@@ -14,6 +14,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 function action_editer_article_dist() {
 
+
 	include_spip('inc/actions');
 	$var_f = charger_fonction('controler_action_auteur', 'inc');
 	$var_f();
@@ -25,17 +26,21 @@ function action_editer_article_dist() {
 	if (!$id_article = intval($arg)) {
 		if ($arg != 'oui') redirige_par_entete('./');
 	        $id_article = insert_article($id_parent);
-	}
+	} 
+	  
+	$err = false;
+
+	// Enregistre l'envoi dans la BD et positionne $err si pb
+
+	articles_set($id_article, $id_parent, $lier_trad, $arg=='oui');
 
 	// id_article_bloque,  globale dans inc/presentation 
-	$redirect = _request('redirect')
-	. "&id_article=$id_article&id_article_bloque=$id_article"
-	  . ($arg=='oui' ? '&new=oui' : '')
-	  . ($lier_trad ? "&lier_trad=$lier_trad" : '') ;  
 
-	articles_set($id_article, $id_parent, $arg=='oui');
+	$redirect = urldecode(_request('redirect'))
+		. "&id_article=$id_article&id_article_bloque=$id_article"
+		. ($GLOBALS['err'] ? '&trad_err=1' : '');
 
-	redirige_par_entete(urldecode($redirect));
+	redirige_par_entete($redirect);
 }
 
 function insert_article($id_parent)
@@ -63,23 +68,30 @@ function insert_article($id_parent)
 	return $id_article;
 }
 
-function articles_set($id_article, $id_rubrique, $new)
+function articles_set($id_article, $id_rubrique, $lier_trad, $new)
 {
-
 	include_spip('inc/filtres');
 	include_spip('inc/rubriques');
-	if (!strlen($titre_article=corriger_caracteres($_POST['titre'])))
-		$titre_article = _T('info_sans_titre');
 
-	revisions_articles($id_article, $id_rubrique, $titre_article, $new);
+	$row = spip_fetch_array(spip_query("SELECT id_trad FROM spip_articles WHERE id_article=$id_article"));
+
+	$id_trad = (!$lier_trad) ? 0 : article_referent ($id_article, $row['id_trad'], $lier_trad);
+
+	if (_request('titre')) // retour de articles_edit.php
+	  revisions_articles($id_article, $id_rubrique, $id_trad, $new);
+	else // retour articles.php
+		spip_query("UPDATE spip_articles SET id_trad = $id_trad WHERE id_article = $id_article");
 }
 
-function revisions_articles ($id_article, $id_rubrique, $titre_article) {
+function revisions_articles ($id_article, $id_rubrique, $id_trad) {
 {
 	global $flag_revisions, $champs_extra;
 
 	$id_auteur =  _request('id_auteur');
 	$texte = trop_longs_articles(_request('texte_plus')) . _request('texte');
+	if (!strlen($titre_article=corriger_caracteres(_request('titre'))))
+		$titre_article = _T('info_sans_titre');
+
 	$champs = array(
 		'surtitre' => corriger_caracteres(_request('surtitre')),
 		'titre' => $titre_article,
@@ -114,7 +126,10 @@ function revisions_articles ($id_article, $id_rubrique, $titre_article) {
 		$champs_extra = extra_recup_saisie("articles", _request('id_secteur'));
 	}
 
-	spip_query("UPDATE spip_articles SET surtitre=" . spip_abstract_quote($champs['surtitre']) . ", titre=" . spip_abstract_quote($champs['titre']) . ", soustitre=" . spip_abstract_quote($champs['soustitre']) . ", id_rubrique=" .			   intval($id_rubrique) .		   ", descriptif=" . spip_abstract_quote($champs['descriptif']) . ", chapo=" . spip_abstract_quote($champs['chapo']) . ", texte=" . spip_abstract_quote($champs['texte']) . ", ps=" . spip_abstract_quote($champs['ps']) . ", url_site=" . spip_abstract_quote($champs['url_site']) . ", nom_site=" . spip_abstract_quote($champs['nom_site']) . ", date_modif=NOW() " . ($champs_extra ? (", extra = " . spip_abstract_quote($champs_extra)) : '') . " WHERE id_article=$id_article");
+	spip_query("UPDATE spip_articles SET id_trad = $id_trad WHERE id_article = $id_article");
+
+
+	spip_query("UPDATE spip_articles SET id_rubrique=$id_rubrique, id_trad=$id_trad, surtitre=" . spip_abstract_quote($champs['surtitre']) . ", titre=" . spip_abstract_quote($champs['titre']) . ", soustitre=" . spip_abstract_quote($champs['soustitre']) . ", descriptif=" . spip_abstract_quote($champs['descriptif']) . ", chapo=" . spip_abstract_quote($champs['chapo']) . ", texte=" . spip_abstract_quote($champs['texte']) . ", ps=" . spip_abstract_quote($champs['ps']) . ", url_site=" . spip_abstract_quote($champs['url_site']) . ", nom_site=" . spip_abstract_quote($champs['nom_site']) . ", date_modif=NOW() " . ($champs_extra ? (", extra = " . spip_abstract_quote($champs_extra)) : '') . " WHERE id_article=$id_article");
 
 	// Stockage des versions
 	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
@@ -164,4 +179,30 @@ function trop_longs_articles($texte_plus)
 	return $texte_ajout;
 }
 
+function article_referent ($id_article, $id_trad, $lier_trad)
+{ 
+	global $err; // pour avertir l'appelant
+
+	$row = spip_fetch_array(spip_query("SELECT id_trad FROM spip_articles WHERE id_article=$lier_trad"));
+
+	$id_lier = $row['id_trad'];
+
+	spip_log("$id_article, $id_trad, $lier_trad, $id_lier");
+// Si l'article vise n'a pas deja de traduction, creer nouveau id_trad
+	if ($id_lier == 0) {
+			$nouveau_trad = $lier_trad;
+			spip_query("UPDATE spip_articles SET id_trad = $lier_trad WHERE id_article = $lier_trad");
+	} else {
+	  // insuffisant pour prevenir les traductions redondantes a mon avis
+		if ($id_lier == $id_trad) $err = true;
+		$nouveau_trad = $id_lier;
+		spip_query("UPDATE spip_articles SET id_trad = $id_lier WHERE id_trad = $id_lier");
+	}
+
+	if ($id_trad > 0)
+		  spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad WHERE id_trad = $id_trad");
+
+	return $nouveau_trad;
+}
+
 ?>
diff --git a/ecrire/action/referencer_traduction.php b/ecrire/action/referencer_traduction.php
new file mode 100644
index 0000000000..84c6bae218
--- /dev/null
+++ b/ecrire/action/referencer_traduction.php
@@ -0,0 +1,32 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/filtres');
+
+
+function action_referencer_traduction_dist() {
+	
+	include_spip('inc/actions');
+	$var_f = charger_fonction('controler_action_auteur', 'inc');
+	$var_f();
+
+	$arg = _request('arg');
+
+	if (!preg_match(",^(\d+)\D(\d+)$,", $arg, $r)) {
+		spip_log("action_referencer_traduction_dist $arg pas compris");
+	} else {
+		spip_query("UPDATE spip_articles SET id_trad = " . $r[2] . " WHERE id_trad =" . $r[1]);
+	}
+}
+?>
diff --git a/ecrire/exec/articles.php b/ecrire/exec/articles.php
index a041a5a340..481c2d8f57 100644
--- a/ecrire/exec/articles.php
+++ b/ecrire/exec/articles.php
@@ -25,11 +25,10 @@ include_spip('base/abstract_sql');
 
 function exec_articles_dist()
 {
-	global $cherche_auteur, $ids, $cherche_mot, $debut, $id_article, $id_article_bloque, $id_parent, $id_rubrique_old, $id_trad_new,  $lier_trad, $new, $nom_select, $nouv_mot, $supp_mot; 
+	global $cherche_auteur, $ids, $cherche_mot, $debut, $id_article, $nouv_mot, $supp_mot, $trad_err; 
+
 	global  $connect_id_auteur, $connect_statut, $options, $spip_display, $spip_lang_left, $spip_lang_right, $dir_lang;
 
-	$id_parent = intval($id_parent);
-	$lier_trad = intval($lier_trad);
 	$supp_mot = intval($supp_mot);
 	$id_article= intval($id_article);
 
@@ -235,7 +234,7 @@ if ($options == 'avancees' AND $GLOBALS['meta']["articles_mots"] != 'non') {
   if (($GLOBALS['meta']['multi_articles'] == 'oui')
 	OR (($GLOBALS['meta']['multi_rubriques'] == 'oui') AND ($GLOBALS['meta']['gerer_trad'] == 'oui'))) {
 
-	langues_articles($id_article, $flag_editable, $id_rubrique, $id_trad, $dir_lang, $nom_select, $lier_trad,  $id_trad_new);
+	langues_articles($id_article, $flag_editable, $id_rubrique, $id_trad,  $trad_err);
   }
 
  echo pipeline('affiche_milieu',array('args'=>array('exec'=>'articles','id_article'=>$id_article),'data'=>''));
@@ -651,10 +650,10 @@ function dates_articles($id_article, $id_rubrique, $flag_editable, $statut_artic
 }
 
 
-function langues_articles($id_article, $flag_editable, $id_rubrique, $id_trad, $dir_lang, $nom_select, $lier_trad,  $id_trad_new)
+function langues_articles($id_article, $flag_editable, $id_rubrique, $id_trad, $trad_err)
 {
 
-  global $connect_statut, $couleur_claire, $options, $connect_toutes_rubriques, $spip_lang_right;
+	global $connect_statut, $couleur_claire, $options, $connect_toutes_rubriques, $spip_lang_right, $dir_lang;
 
 	$langue_article = spip_fetch_array(spip_query("SELECT lang FROM spip_articles WHERE id_article=$id_article"));
 
@@ -690,27 +689,14 @@ function langues_articles($id_article, $flag_editable, $id_rubrique, $id_trad, $
 		echo fin_block();
 	}
 
-	// Gerer les groupes de traductions
-	if ($GLOBALS['meta']['gerer_trad'] == 'oui') {
-
-		// Changer article de reference de la trad
-		if ($id_trad_new = intval($id_trad_new)
-		AND $id_trad_old = intval(_request('id_trad_old'))  # bizarre
-		AND $connect_statut=='0minirezo'
-		AND $connect_toutes_rubriques) { 
-			spip_query("UPDATE spip_articles SET id_trad = $id_trad_new WHERE id_trad = $id_trad_old");
-			$id_trad = $id_trad_new;
-		}
-
-		if ($flag_editable AND $lier_trad > 0) { // Lier a un groupe de trad
-			$id_trad = article_referent ($id_article, $id_trad, $lier_trad);
-		}
+	if ($trad_err)
+		echo "<div><font color='red' size='2' face='verdana,arial,helvetica,sans-serif'>"._T('trad_deja_traduit'). "</font></div>";
 
 		// Afficher la liste des traductions
-		$table = !$id_trad ? array() : articles_traduction($id_article, $id_trad);
+	$table = !$id_trad ? array() : articles_traduction($id_article, $id_trad);
 
 		// bloc traductions
-		if (count($table) > 0) {
+	if (count($table) > 0) {
 
 			echo "<div class='liste'>";
 			bandeau_titre_boite2(_T('trad_article_traduction'),'');
@@ -721,78 +707,52 @@ function langues_articles($id_article, $flag_editable, $id_rubrique, $id_trad, $
 			echo afficher_liste ($largeurs, $table, $styles);
 			echo "</table>";
 			echo "</div>";
-		}
+	}
 
-		// changer les globales $dir_lang etc
-		changer_typo($langue_article);
+	// changer les globales $dir_lang etc
+	changer_typo($langue_article);
 
-		echo debut_block_invisible('lier_traductions');
+	echo debut_block_invisible('lier_traductions');
+
+	echo "<table width='100%'><tr>";
 
-		echo "<table width='100%'><tr>";
-		if ($flag_editable AND $options == "avancees" AND !$table) {
+	if ($flag_editable AND $options == "avancees" AND !$table) {
 			// Formulaire pour lier a un article
 			echo "<td class='arial2' width='60%'>";
 
-			echo "<form action='" . generer_url_ecrire("articles","id_article=$id_article") . "' method='post' style='margin:0px; padding:0px;'>";
-			echo _T('trad_lier');
-			echo "<div align='$spip_lang_right'><input type='text' class='fondl' name='lier_trad' size='5'> <INPUT TYPE='submit' VALUE='"._T('bouton_valider')."' CLASS='fondl'></div>";
-			echo "</form>";
+			echo redirige_action_auteur("editer_article",
+				$id_article,
+				'articles',
+				"id_article=$id_article",
+				(_T('trad_lier') .
+					 "<div align='$spip_lang_right'>\n<input type='text' class='fondl' name='lier_trad' size='5' />\n<input type='submit' VALUE='"._T('bouton_valider')."' CLASS='fondl' /></div>"),
+				" method='post' style='margin:0px; padding:0px;'");
+
 			echo "</td>\n";
 			echo "<td background='' width='10'> &nbsp; </td>";
 			echo "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>";
 			echo "<td background='' width='10'> &nbsp; </td>";
-		}
-		echo "<td>";
-		icone_horizontale(_T('trad_new'), generer_url_ecrire("articles_edit","new=oui&lier_trad=$id_article&id_rubrique=$id_rubrique"), "traductions-24.gif", "creer.gif");
-		echo "</td>";
-		if ($flag_editable AND $options == "avancees" AND $table) {
+	}
+
+	echo "<td>";
+	icone_horizontale(_T('trad_new'), generer_url_ecrire("articles_edit","new=oui&lier_trad=$id_article&id_rubrique=$id_rubrique"), "traductions-24.gif", "creer.gif");
+	echo "</td>";
+	if ($flag_editable AND $options == "avancees" AND $table) {
 			echo "<td background='' width='10'> &nbsp; </td>";
 			echo "<td background='" . _DIR_IMG_PACK . "tirets-separation.gif' width='2'>". http_img_pack('rien.gif', " ", "width='2' height='2'") . "</td>";
 			echo "<td background='' width='10'> &nbsp; </td>";
 			echo "<td>";
 			icone_horizontale(_T('trad_delier'), redirige_action_auteur("supprimer_traduction","$id_article-$id_trad",'articles',	"id_article=$id_article"), "traductions-24.gif", "supprimer.gif");
 			echo "</td>\n";
-		}
+	}
 
-		echo "</tr></table>";
+	echo "</tr></table>";
 
-		echo fin_block();
-	}
+	echo fin_block();
 
 	fin_cadre_enfonce();
 }
 
-function article_referent ($id_article, $id_trad, $lier_trad)
-{ 
-	$row = spip_fetch_array(spip_query("SELECT id_trad FROM spip_articles WHERE id_article=$lier_trad"));
-
-	if (!$row)
-	  $err .= "<div>"._T('trad_article_inexistant')."</div>";
-	else {
-		$id_lier = $row['id_trad'];
-
-// Si l'article vise n'a pas deja de traduction, creer nouveau id_trad
-		if ($id_lier == 0) {
-			$nouveau_trad = $lier_trad;
-			spip_query("UPDATE spip_articles SET id_trad = $lier_trad WHERE id_article = $lier_trad");
-		} else {
-			if ($id_lier == $id_trad) $err = "<div>"._T('trad_deja_traduit')."</div>";
-			$nouveau_trad = $id_lier;
-			spip_query("UPDATE spip_articles SET id_trad = $id_lier WHERE id_trad = $id_lier");
-		}
-
-		spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad WHERE id_article = $id_article");
-
-		if ($id_trad > 0)
-		  spip_query("UPDATE spip_articles SET id_trad = $nouveau_trad WHERE id_trad = $id_trad");
-
-		$id_trad = $nouveau_trad;
-	}
-
-	if ($err) echo "<font color='red' size=2' face='verdana,arial,helvetica,sans-serif'>$err</font>";
-
-	return $id_trad;
-}
 
 function articles_traduction($id_article, $id_trad)
 {
@@ -816,11 +776,11 @@ function articles_traduction($id_article, $id_trad)
 		$vals[] = http_img_pack("puce-".puce_statut($statut_trad).'.gif', "", "width='7' height='7' border='0' NAME='statut'");
 		
 		if ($id_article_trad == $id_trad) {
-		  $vals[] = http_img_pack('langues-12.gif', "", "width='12' height='12' border='0'");
+			$vals[] = http_img_pack('langues-12.gif', "", "width='12' height='12' border='0'");
 			$titre_trad = "<b>$titre_trad</b>";
 		} else {
 		  if ($connect_toutes_rubriques)
-		  	$vals[] = "<a href='" . generer_url_ecrire("articles","id_article=$id_article&id_trad_old=$id_trad&id_trad_new=$id_article_trad&id_rubrique=$id_rubrique_trad") . "'>". 
+		    $vals[] = "<a href='" . redirige_action_auteur("referencer_traduction", "$id_trad,$id_article_trad", 'articles', "id_article=$id_article") . "'>". 
 		    http_img_pack('langues-off-12.gif', _T('trad_reference'), "width='12' height='12' border='0'", _T('trad_reference')) . "</a>";
 		  else $vals[] = http_img_pack('langues-off-12.gif', "", "width='12' height='12' border='0'");
 		}
-- 
GitLab