From ef2b59617de6c5fc7eb3c21bfd0e5e374ea8cde7 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 13 Aug 2006 22:55:08 +0000
Subject: [PATCH] revision de #FORMULAIRE_FORUM{#SELF} et
 #PARAMTRES_FORUM{#SELF} (nicolas riquois)

---
 ecrire/balise/formulaire_forum.php | 23 ++++++++++-------------
 ecrire/inc/forum_insert.php        |  9 +++++++--
 ecrire/public/assembler.php        |  1 -
 ecrire/public/balises.php          |  2 +-
 4 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php
index e8c6c869e0..6020d84bd9 100644
--- a/ecrire/balise/formulaire_forum.php
+++ b/ecrire/balise/formulaire_forum.php
@@ -98,7 +98,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 	}
 	// Tableau des valeurs servant au calcul d'une signature de securite.
 	// Elles seront placees en Input Hidden pour que inc/forum_insert
-	// recalcule la meme chose et verifie l'identité des resultats.
+	// recalcule la meme chose et verifie l'identite des resultats.
 	// Donc ne pas changer la valeur de ce tableau entre le calcul de
 	// la signature et la fabrication des Hidden
 	// Faire attention aussi a 0 != ''
@@ -116,7 +116,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 	$previsu = ' ';
 
 	// au premier appel (pas de Post-var nommee "retour_forum")
-	// memoriser evntuellement l'URL de retour pour y revenir apres
+	// memoriser eventuellement l'URL de retour pour y revenir apres
 	// envoi du message ; aux appels suivants, reconduire la valeur.
 	// Initialiser aussi l'auteur
 	if (!$retour_forum = rawurldecode(_request('retour_forum'))) {
@@ -126,7 +126,9 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 			// par defaut, on veut prendre url_forum(), mais elle ne sera connue
 			// qu'en sortie, on inscrit donc une valeur absurde ("!")
 			$retour_forum = "!";
-			
+			// sauf si on a passe un parametre en argument (exemple : {#SELF})
+			if ($url_param_retour)
+				$retour_forum = str_replace('&amp;', '&', $url_param_retour);
 		}
 		if (isset($_COOKIE['spip_forum_user'])
 		AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
@@ -156,17 +158,12 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 
 		include_spip('inc/actions');
 		$hash = calculer_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea);
-	}
-
-	// Poser un cookie pour ne pas retaper les infos invariables
-	include_spip('inc/cookie');
-	spip_setcookie('spip_forum_user',
-		       serialize(array('nom' => $auteur, 
-				       'email' => $email_auteur)));
 
-	// sauf si on a passe un parametre en argument (exemple : {#SELF})
-	if ($url_param_retour) {
-			$script = $url_param_retour;
+		// Poser un cookie pour ne pas retaper les infos invariables
+		include_spip('inc/cookie');
+		spip_setcookie('spip_forum_user',
+			serialize(array('nom' => $auteur,
+				'email' => $email_auteur)));
 	}
 
 	// pour la chaine de hidden
diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php
index 1c1fd92685..52381a4bc4 100644
--- a/ecrire/inc/forum_insert.php
+++ b/ecrire/inc/forum_insert.php
@@ -252,10 +252,10 @@ function inc_forum_insert_dist() {
 	// Entrer les mots-cles associes
 	if (is_array($ajouter_mot)) mots_du_forum($ajouter_mot, $id_message);
 
-	if ($statut == 'publie') {
 	//
 	// INVALIDATION DES CACHES LIES AUX FORUMS
 	//
+	if ($statut == 'publie') {
 		include_spip('inc/invalideur');
 		suivre_invalideur ("id='id_forum/" .
 			calcul_index_forum($id_article,
@@ -271,7 +271,12 @@ function inc_forum_insert_dist() {
 			prevenir_auteurs($auteur, $email_auteur, $id_message, $id_article, $texte, $titre, $statut);
 	}
 
-	if (!$calculer_retour) 	return $retour_forum;
+	// En cas de retour sur (par exemple) {#SELF}, on ajoute quand
+	// meme #forum12 a la fin de l'url, sauf si un #ancre est explicite
+	if (!$calculer_retour)
+		return strstr('#', $retour_forum) ?
+			$retour_forum
+			: $retour_forum.'#forum'.$id_message;
 
 	// le retour automatique envoie sur le thread, ce qui permet
 	// de traiter elegamment le cas des forums moderes a priori.
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index ae114bb7ea..63f879fe2d 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -30,7 +30,6 @@ function public_assembler_dist($fond) {
 	}
 
 	// Si envoi pour un forum, enregistrer puis rediriger
-
 	if (isset($_POST['confirmer_forum'])
 	OR (isset($_POST['ajouter_mot']) AND $GLOBALS['afficher_texte']=='non')) {
 		$f = charger_fonction('forum_insert', 'inc');
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 2d310f4aef..67b3031200 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -850,7 +850,7 @@ function balise_PARAMETRES_FORUM_dist($p) {
 
 	// Attention un eventuel &retour=xxx dans l'URL est prioritaire
 	$c .= '.
-	(($lien = (_request("retour") ? _request("retour") : '.$retour.')) ? "&retour=".rawurlencode($lien) : "")';
+	(($lien = (_request("retour") ? _request("retour") : str_replace("&amp;", "&", '.$retour.'))) ? "&retour=".rawurlencode($lien) : "")';
 
 	$p->code .= code_invalideur_forums($p, "(".$c.")");
 
-- 
GitLab