From 182155fd552378cdfd572eb25181f0c83e9bf201 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Fri, 13 May 2005 10:03:50 +0000
Subject: [PATCH] =?UTF-8?q?int=C3=A9gration=20de=20generer=5Furl=5Fsite()?=
 =?UTF-8?q?=20partout,=20possibilit=C3=A9=20de=20faire=20un=20"preview"=20?=
 =?UTF-8?q?sur=20les=20sites,=20etc.=20A=20noter=20que=20pour=20afficher?=
 =?UTF-8?q?=20l'adresse=20de=20la=20page=20qui=20pr=C3=A9snete=20le=20site?=
 =?UTF-8?q?=20x,=20on=20ne=20peut=20pas=20utiliser=20#URL=5FSITE=20ni=20#U?=
 =?UTF-8?q?RLSYNDIC,=20car=20ce=20sont=20respectivement=20l'adresse=20r?=
 =?UTF-8?q?=C3=A9elle=20du=20site=20et=20celle=20de=20son=20backend.=20Il?=
 =?UTF-8?q?=20faut=20utiliser=20[(#ID=5FSYNDIC|generer=5Furl=5Fsite)]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc_forum.php3                 |  3 +++
 ecrire/inc_presentation.php3          |  1 +
 ecrire/inc_texte.php3                 |  8 ++++++--
 ecrire/inc_urls.php3                  |  5 +++++
 ecrire/inc_version.php3               | 14 ++++++++++++--
 ecrire/sites.php3                     |  6 +++++-
 formulaires/formulaire_admin.html     |  4 +++-
 formulaires/inc-formulaire_admin.php3 | 19 ++++++++++--------
 htaccess.txt                          |  4 ++++
 inc-balises.php3                      |  6 ++++++
 inc-boucles.php3                      | 12 +++++++++---
 inc-urls-html.php3                    | 11 ++++++++---
 inc-urls-propres.php3                 | 28 ++++++++++++++++++++-------
 inc-urls-standard.php3                | 11 ++++++++---
 spip_redirect.php3                    |  3 +++
 15 files changed, 105 insertions(+), 30 deletions(-)

diff --git a/ecrire/inc_forum.php3 b/ecrire/inc_forum.php3
index f6021591a5..dabd75d567 100644
--- a/ecrire/inc_forum.php3
+++ b/ecrire/inc_forum.php3
@@ -247,6 +247,9 @@ function generer_url_forum_dist($id_forum, $show_thread=false) {
 		case 'rubrique':
 			return generer_url_rubrique($id)."#forum$id_forum";
 			break;
+		case 'site':
+			return generer_url_site($id)."#forum$id_forum";
+			break;
 		default:
 			return "forum.php3?id_forum=".$id_forum;
 	}
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index 42c3a9c86d..7facce5dcb 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -3116,6 +3116,7 @@ function voir_en_ligne ($type, $id, $statut=false, $image='racine-24.gif') {
 			break;
 		case 'breve':
 		case 'auteur':
+		case 'site':
 			if ($statut == 'publie')
 				$en_ligne = 'recalcul';
 			else if ($statut == 'prop')
diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3
index 5e35a5262c..63b0bf75bc 100644
--- a/ecrire/inc_texte.php3
+++ b/ecrire/inc_texte.php3
@@ -617,7 +617,8 @@ function extraire_lien ($regs) {
 			case 'do':
 				$lien_url = generer_url_document($id_lien);
 				if (!$lien_texte) {
-					$req = "select titre,fichier from spip_documents where id_document=$id_lien";
+					$req = "select titre,fichier from spip_documents
+					WHERE id_document=$id_lien";
 					$row = @spip_fetch_array(@spip_query($req));
 					$lien_texte = $row['titre'];
 					if (!$lien_texte)
@@ -625,7 +626,10 @@ function extraire_lien ($regs) {
 				}
 				break;
 			case 'si':
-				$row = @spip_fetch_array(@spip_query("SELECT nom_site,url_site FROM spip_syndic WHERE id_syndic=$id_lien"));
+				# attention dans le cas des sites le lien pointe non pas sur
+				# la page locale du site, mais directement sur le site lui-meme
+				$row = @spip_fetch_array(@spip_query("SELECT nom_site,url_site
+				FROM spip_syndic WHERE id_syndic=$id_lien"));
 				if ($row) {
 					$lien_url = $row['url_site'];
 					if (!$lien_texte)
diff --git a/ecrire/inc_urls.php3 b/ecrire/inc_urls.php3
index d3df38caf9..df9b8e2a28 100644
--- a/ecrire/inc_urls.php3
+++ b/ecrire/inc_urls.php3
@@ -54,6 +54,11 @@ function generer_url_mot($id_mot) {
 	return $url;
 }
 
+function generer_url_site($id_syndic) {
+	$url = "../spip_redirect.php3?id_syndic=$id_syndic";
+	return $url;
+}
+
 function generer_url_auteur($id_auteur) {
 	$url = "../spip_redirect.php3?id_auteur=$id_auteur";
 	return $url;
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index b2b5b2135a..d31f4f2fc8 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -921,11 +921,21 @@ $spip_lang = $langue_site;
 
 // Nommage bizarre des tables d'objets
 function table_objet($type) {
-	if ($type == 'syndic' OR $type == 'forum')
-		return $type;
+	if ($type == 'site' OR $type == 'syndic')
+		return 'syndic';
+	else if ($type == 'forum')
+		return 'forum';
 	else
 		return $type.'s';
 }
+function id_table_objet($type) {
+	if ($type == 'site' OR $type == 'syndic')
+		return 'id_syndic';
+	else if ($type == 'forum')
+		return 'id_forum';
+	else
+		return 'id_'.$type;
+}
 
 
 //
diff --git a/ecrire/sites.php3 b/ecrire/sites.php3
index b68cb98d2c..c895cb5ec0 100644
--- a/ecrire/sites.php3
+++ b/ecrire/sites.php3
@@ -241,7 +241,11 @@ debut_gauche();
 debut_boite_info();
 	echo "<center>";
 	echo "<font face='Verdana,Arial,Sans,sans-serif' size=1><b>"._T('titre_site_numero')."</b></font>";
-	echo "<br><font face='Verdana,Arial,Sans,sans-serif' size=6><b>$id_syndic</b></font>";
+	echo "<br><font face='Verdana,Arial,Sans,sans-serif' size=6><b>$id_syndic</b></font>\n";
+
+	voir_en_ligne ('site', $id_syndic, $statut);
+
+
 	echo "</center>";
 fin_boite_info();
 
diff --git a/formulaires/formulaire_admin.html b/formulaires/formulaire_admin.html
index c85a899e37..c774754171 100644
--- a/formulaires/formulaire_admin.html
+++ b/formulaires/formulaire_admin.html
@@ -4,7 +4,9 @@
 	<li><a href='ecrire/articles.php3?id_article=(#ENV{id_article})' class='spip-admin-boutons'><:admin_modifier_article:> ([(#ENV{id_article})])</a></li>][
 	<li><a href='ecrire/breves_voir.php3?id_breve=(#ENV{id_breve})' class='spip-admin-boutons'><:admin_modifier_breve:> ([(#ENV{id_breve})])</a></li>][
 	<li><a href='ecrire/naviguer.php3?id_rubrique=(#ENV{id_rubrique})' class='spip-admin-boutons'><:admin_modifier_rubrique:> ([(#ENV{id_rubrique})])</a></li>][
-	<li><a href='ecrire/mots_edit.php3?id_mot=(#ENV{id_mot})' class='spip-admin-boutons'><:admin_modifier_mot:> ([(#ENV{id_mot})])</a></li>][
+	<li><a href='ecrire/mots_edit.php3?id_mot=(#ENV{id_mot})' class='spip-admin-boutons'><:admin_modifier_mot:>
+([(#ENV{id_mot})])</a></li>][
+	<li><a href='ecrire/sites.php3?id_syndic=(#ENV{id_syndic})' class='spip-admin-boutons'><:icone_modifier_site:> ([(#ENV{id_syndic})])</a></li>][
 	<li><a href='ecrire/auteurs_edit.php3?id_auteur=(#ENV{id_auteur})' class='spip-admin-boutons'><:admin_modifier_auteur:> ([(#ENV{id_auteur})])</a></li>][
 	<li><a href='(#ENV{ecrire})/' class='spip-admin-boutons'><:espace_prive:></a></li>]
 	<li><a href='[(#ENV{action})]var_mode=recalcul' class='spip-admin-boutons'><:admin_recalculer:>[(#ENV{use_cache})]</a></li>[
diff --git a/formulaires/inc-formulaire_admin.php3 b/formulaires/inc-formulaire_admin.php3
index dd260238f8..77c136da4d 100644
--- a/formulaires/inc-formulaire_admin.php3
+++ b/formulaires/inc-formulaire_admin.php3
@@ -20,7 +20,7 @@ function balise_FORMULAIRE_ADMIN_stat($args, $filtres) {
 
 function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 	global $var_preview, $use_cache, $forcer_debug;
-	global $id_article, $id_breve, $id_rubrique, $id_mot, $id_auteur;
+	global $id_article, $id_breve, $id_rubrique, $id_mot, $id_auteur, $id_syndic;
 	static $dejafait = false;
 
 	if (!$GLOBALS['spip_admin'])
@@ -50,11 +50,12 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 	$action = ($action . ((strpos($action, '?') === false) ? '?' : '&'));
 
 	// Ne pas afficher le bouton 'Modifier ce...' si l'objet n'existe pas
-	foreach (array('article', 'breve', 'rubrique', 'mot', 'auteur') as $type) {
-		$id_type = 'id_'.$type;
+	foreach (array('article', 'breve', 'rubrique', 'mot', 'auteur', 'syndic') as $type) {
+		$id_type = id_table_objet($type);
 		if (!($$id_type = intval($$id_type)
 		AND $s = spip_query(
-		"SELECT $id_type FROM spip_${type}s WHERE $id_type=".$$id_type)
+		"SELECT $id_type FROM spip_".table_objet($type)."
+		WHERE $id_type=".$$id_type)
 		AND spip_num_rows($s)))
 			$$id_type=0;
 		else {
@@ -95,7 +96,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 	if ($id_article OR $id_breve) unset ($id_rubrique);
 
 	// Pas de "modifier ce..." ? -> donner "acces a l'espace prive"
-	if (!($id_article || $id_rubrique || $id_auteur || $id_breve || $id_mot))
+	if (!($id_article || $id_rubrique || $id_auteur || $id_breve || $id_mot || $id_syndic))
 		$ecrire = 'ecrire';
 
 	// Bouton "preview" si l'objet demande existe et est previsualisable
@@ -107,10 +108,11 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 	)) {
 		if ($objet_affiche == 'article'
 		OR $objet_affiche == 'breve'
-		OR $objet_affiche == 'rubrique')
+		OR $objet_affiche == 'rubrique'
+		OR $objet_affiche == 'syndic')
 			if (spip_num_rows(spip_query(
-			"SELECT id_$objet_affiche FROM spip_".$objet_affiche."s
-			WHERE id_$objet_affiche=".${"id_".$objet_affiche}."
+			"SELECT id_$objet_affiche FROM spip_".table_objet($objet_affiche)."
+			WHERE ".id_table_objet($objet_affiche)."=".$$id_type."
 			AND statut IN ('prop', 'prive')")))
 				$preview = 'preview';
 	}
@@ -122,6 +124,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 				'id_auteur' => $id_auteur,
 				'id_breve' => $id_breve,
 				'id_mot' => $id_mot,
+				'id_syndic' => $id_syndic,
 				'ecrire' => $ecrire,
 				'action' => $action,
 				'preview' => $preview,
diff --git a/htaccess.txt b/htaccess.txt
index e355aa0055..1465ccd805 100644
--- a/htaccess.txt
+++ b/htaccess.txt
@@ -74,6 +74,7 @@ RewriteRule ^article([0-9]+)\.html$		article.php3?id_article=$1 [QSA,L]
 RewriteRule ^breve([0-9]+)\.html$		breve.php3?id_breve=$1 [QSA,L]
 RewriteRule ^mot([0-9]+)\.html$			mot.php3?id_mot=$1 [QSA,L]
 RewriteRule ^auteur([0-9]+)\.html$		auteur.php3?id_auteur=$1 [QSA,L]
+RewriteRule ^site([0-9]+)\.html$		site.php3?id_syndic=$1 [QSA,L]
 # Fin compatibilite
 ###
 
@@ -95,6 +96,9 @@ RewriteRule ^-[^/\.]+-?(\.html)?$ rubrique.php3 [QSA,E=url_propre:$0,L]
 # les auteurs
 RewriteRule ^_[^/\.]+_?(\.html)?$ auteur.php3 [QSA,E=url_propre:$0,L]
 
+# Les sites
+RewriteRule ^@[^/\.]+@?(\.html)?$ site.php3 [QSA,E=url_propre:$0,L]
+
 # Les articles (en dernier car expression plus "large")
 RewriteRule ^[^/\.]+(\.html)?$ article.php3 [QSA,E=url_propre:$0,L]
 
diff --git a/inc-balises.php3 b/inc-balises.php3
index 17f9b41d22..39420b68c5 100644
--- a/inc-balises.php3
+++ b/inc-balises.php3
@@ -246,6 +246,12 @@ function balise_URL_MOT_dist($p) {
 	return $p;
 }
 
+# remarque : URL_SITE ne figure pas ici car c'est une donnee 'brute'
+# correspondant a l'URL du site reference ; URL_SYNDIC correspond
+# pour sa part a l'adresse de son backend.
+# Il n'existe pas de balise pour afficher generer_url_site($id_syndic),
+# a part [(#ID_SYNDIC|generer_url_site)]
+
 function balise_URL_FORUM_dist($p) {
 	$p->code = "generer_url_forum(" .
 	champ_sql('id_forum',$p) .")";
diff --git a/inc-boucles.php3 b/inc-boucles.php3
index ff8d231102..33f5ff17c5 100644
--- a/inc-boucles.php3
+++ b/inc-boucles.php3
@@ -220,7 +220,10 @@ function boucle_SYNDICATION_dist($id_boucle, &$boucles) {
 	$boucle = &$boucles[$id_boucle];
 	$id_table = $boucle->id_table;
 	$boucle->from[] =  "spip_syndic AS $id_table";
-	$boucle->where[] = "$id_table.statut='publie'";
+	if (!$GLOBALS['var_preview']) {
+		$boucle->where[] = "$id_table.statut='publie'";
+	} else
+		$boucle->where[] = "$id_table.statut IN ('publie','prop')";
 	return calculer_boucle($id_boucle, $boucles); 
 }
 
@@ -234,8 +237,11 @@ function boucle_SYNDIC_ARTICLES_dist($id_boucle, &$boucles) {
 	$boucle->from[] =  "spip_syndic_articles  AS $id_table";
 	$boucle->from[] =  "spip_syndic AS syndic";
 	$boucle->where[] = "$id_table.id_syndic=syndic.id_syndic";
-	$boucle->where[] = "$id_table.statut='publie'";
-	$boucle->where[] = "syndic.statut='publie'";
+	if (!$GLOBALS['var_preview']) {
+		$boucle->where[] = "$id_table.statut='publie'";
+		$boucle->where[] = "syndic.statut='publie'";
+	} else
+		$boucle->where[] = "$id_table.statut IN ('publie','prop')";
 	$boucle->select[]='syndic.nom_site AS nom_site'; # derogation zarbi
 	$boucle->select[]='syndic.url_site AS url_site'; # idem
 	return calculer_boucle($id_boucle, $boucles); 
diff --git a/inc-urls-html.php3 b/inc-urls-html.php3
index 3b1e20d216..9bab46b8c7 100644
--- a/inc-urls-html.php3
+++ b/inc-urls-html.php3
@@ -53,6 +53,10 @@ function generer_url_mot($id_mot) {
 	return "mot$id_mot.html";
 }
 
+function generer_url_site($id_syndic) {
+	return "site$id_syndic.html";
+}
+
 function generer_url_auteur($id_auteur) {
 	return "auteur$id_auteur.html";
 }
@@ -81,13 +85,14 @@ function recuperer_parametres_url($fond, $url) {
 	// on ne redirige pas, on assume le nouveau contexte (si possible)
 	if ($url_propre = $GLOBALS['_SERVER']['REDIRECT_url_propre']
 	OR $url_propre = $GLOBALS['HTTP_ENV_VARS']['url_propre']
-	AND preg_match(',^(article|breve|rubrique|mot|auteur)$,', $fond)) {
+	AND preg_match(',^(article|breve|rubrique|mot|auteur|site)$,', $fond)) {
 		$url_propre = preg_replace('/^[_+-]{0,2}(.*?)[_+-]{0,2}(\.html)?$/',
 			'$1', $url_propre);
-		if ($r = spip_query("SELECT id_$fond AS id FROM spip_".$fond."s
+		if ($r = spip_query("SELECT ".id_table_objet($fond)." AS id
+		FROM spip_".table_objet($fond)."
 		WHERE url_propre = '".addslashes($url_propre)."'")
 		AND $t = spip_fetch_array($r))
-			$contexte["id_$fond"] = $t['id'];
+			$contexte[id_table_objet($fond)] = $t['id'];
 	}
 	/* Fin du bloc compatibilite url-propres */
 
diff --git a/inc-urls-propres.php3 b/inc-urls-propres.php3
index 7eb83017ce..0a28a93bc9 100644
--- a/inc-urls-propres.php3
+++ b/inc-urls-propres.php3
@@ -39,12 +39,14 @@ if (!defined('_terminaison_urls_propres'))
 	define ('_terminaison_urls_propres', '');
 
 function _generer_url_propre($type, $id_objet) {
-	$table = "spip_".$type."s";
-	$col_id = "id_".$type;
+	$table = "spip_".table_objet($type);
+	$col_id = id_table_objet($type);
 
 	// Auteurs : on prend le nom
 	if ($type == 'auteur')
 		$champ_titre = 'nom AS titre';
+	else if ($type == 'site' OR $type=='syndic')
+		$champ_titre = 'nom_site AS titre';
 	else
 		$champ_titre = 'titre';
 
@@ -165,6 +167,14 @@ function generer_url_auteur($id_auteur) {
 		return "auteur.php3?id_auteur=$id_auteur";
 }
 
+function generer_url_site($id_syndic) {
+	$url = _generer_url_propre('site', $id_syndic);
+	if ($url)
+		return '@'.$url.'@'._terminaison_urls_propres;
+	else
+		return "site.php3?id_syndic=$id_syndic";
+}
+
 function generer_url_document($id_document) {
 	if (intval($id_document) <= 0)
 		return '';
@@ -180,9 +190,9 @@ function recuperer_parametres_url($fond, $url) {
 
 	// Migration depuis anciennes URLs ?
 	if ($GLOBALS['_SERVER']['REQUEST_METHOD'] != 'POST' &&
-preg_match(',(^|/)((article|breve|rubrique|mot|auteur)(\.php3?|[0-9]+\.html)([?&].*)?)$,', $url, $regs)) {
+preg_match(',(^|/)((article|breve|rubrique|mot|auteur|site)(\.php3?|[0-9]+\.html)([?&].*)?)$,', $url, $regs)) {
 		$type = $regs[3];
-		$id_objet = intval($GLOBALS['id_'.$type]);
+		$id_objet = intval($GLOBALS[$id_table_objet = id_table_objet($type)]);
 		if ($id_objet) {
 			$func = "generer_url_$type";
 			$url_propre = $func($id_objet);
@@ -191,7 +201,7 @@ preg_match(',(^|/)((article|breve|rubrique|mot|auteur)(\.php3?|[0-9]+\.html)([?&
 				http_status(301);
 				// recuperer les arguments supplementaires (&debut_xxx=...)
 				$reste = preg_replace('/^&/','?',
-					preg_replace("/[?&]id_$type=$id_objet/",'',$regs[5]));
+					preg_replace("/[?&]$id_table_objet=$id_objet/",'',$regs[5]));
 				Header("Location: $url_propre$reste");
 				exit;
 			}
@@ -224,14 +234,18 @@ preg_match(',(^|/)((article|breve|rubrique|mot|auteur)(\.php3?|[0-9]+\.html)([?&
 		$type = 'auteur';
 		$url_propre = $regs[1];
 	}
+	else if (preg_match(',^@(.*?)@?$,', $url_propre, $regs)) {
+		$type = 'syndic';
+		$url_propre = $regs[1];
+	}
 	else {
 		$type = 'article';
 		preg_match(',^(.*)$,', $url_propre, $regs);
 		$url_propre = $regs[1];
 	}
 
-	$table = "spip_".$type."s";
-	$col_id = "id_".$type;
+	$table = "spip_".table_objet($type);
+	$col_id = id_table_objet($type);
 	$query = "SELECT $col_id FROM $table
 		WHERE url_propre='".addslashes($url_propre)."'";
 	$result = spip_query($query);
diff --git a/inc-urls-standard.php3 b/inc-urls-standard.php3
index ca9348cdf8..3247d3139e 100644
--- a/inc-urls-standard.php3
+++ b/inc-urls-standard.php3
@@ -31,6 +31,10 @@ function generer_url_mot($id_mot) {
 	return "mot.php3?id_mot=$id_mot";
 }
 
+function generer_url_site($id_syndic) {
+	return "site.php3?id_syndic=$id_syndic";
+}
+
 function generer_url_auteur($id_auteur) {
 	return "auteur.php3?id_auteur=$id_auteur";
 }
@@ -59,13 +63,14 @@ function recuperer_parametres_url($fond, $url) {
 	// on ne redirige pas, on assume le nouveau contexte (si possible)
 	if ($url_propre = $GLOBALS['_SERVER']['REDIRECT_url_propre']
 	OR $url_propre = $GLOBALS['HTTP_ENV_VARS']['url_propre']
-	AND preg_match(',^(article|breve|rubrique|mot|auteur)$,', $fond)) {
+	AND preg_match(',^(article|breve|rubrique|mot|auteur|site)$,', $fond)) {
 		$url_propre = preg_replace('/^[_+-]{0,2}(.*?)[_+-]{0,2}(\.html)?$/',
 			'$1', $url_propre);
-		if ($r = spip_query("SELECT id_$fond AS id FROM spip_".$fond."s
+		if ($r = spip_query("SELECT ".id_table_objet($fond)." AS id
+		FROM spip_".table_objet($fond)."
 		WHERE url_propre = '".addslashes($url_propre)."'")
 		AND $t = spip_fetch_array($r))
-			$contexte["id_$fond"] = $t['id'];
+			$contexte[id_table_objet($fond)] = $t['id'];
 	}
 	/* Fin du bloc compatibilite url-propres */
 
diff --git a/spip_redirect.php3 b/spip_redirect.php3
index caba9f4b6b..9c885375b1 100644
--- a/spip_redirect.php3
+++ b/spip_redirect.php3
@@ -42,6 +42,9 @@ else if ($id_mot) {
 else if ($id_auteur) {
 	$url = generer_url_auteur($id_auteur);
 }
+else if ($id_syndic OR $id_syndic = $id_site) {
+	$url = generer_url_site($id_syndic);
+}
 else {
 	$url = _DIR_RESTREINT_ABS;
 }
-- 
GitLab