From 8ac6b4df3403256490adce01ac2283e292949f77 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 1 Apr 2010 09:34:16 +0000
Subject: [PATCH] Report de [15550] [15551] [15552] [15553] [15554]

---
 ecrire/base/trouver_table.php | 69 +++++++++++++++++++++++------------
 ecrire/inc/filtres.php        |  2 +-
 prive/modeles/formulaire.html |  2 +-
 3 files changed, 48 insertions(+), 25 deletions(-)

diff --git a/ecrire/base/trouver_table.php b/ecrire/base/trouver_table.php
index 3b93b09dbc..c57f3fe018 100644
--- a/ecrire/base/trouver_table.php
+++ b/ecrire/base/trouver_table.php
@@ -36,8 +36,18 @@ function base_trouver_table_dist($nom, $serveur=''){
 	if (!spip_connect($serveur)
 	OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom))
 		return null;
+
+	$connexion = &$GLOBALS['connexions'][$serveur ? $serveur : 0];
+
+	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
+	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
+	// de connexion, et tout risque d'ambiguite
 	if (!isset($nom_cache_desc_sql[$serveur]))
-		$nom_cache_desc_sql[$serveur] = _DIR_CACHE . 'sql_desc' . ($serveur ? '_'.md5($serveur):'') . '.txt';
+		$nom_cache_desc_sql[$serveur] =
+		  _DIR_CACHE . 'sql_desc_'
+		  . ($serveur ? "$serveur_":"")
+		  . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8)
+			.'.txt';
 
 	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
 	if (!$nom){
@@ -55,44 +65,52 @@ function base_trouver_table_dist($nom, $serveur=''){
 	$fdesc = $desc = '';
 	$connexion = &$GLOBALS['connexions'][$serveur ? $serveur : 0];
 
-	// base sous SPIP: gerer les abreviations des noms de table
+	// base sous SPIP: gerer les abreviations explicites des noms de table
 	if ($connexion['spip_connect_version']) {
 		include_spip('public/interfaces');
 		if (isset($table_des_tables[$nom])) {
 			$nom = $table_des_tables[$nom];
 			$nom_sql = 'spip_' . $nom;
 		}
-		if (!isset($connexion['tables'][$nom_sql])) {
-			include_spip('base/serial');
-			if (isset($tables_principales[$nom_sql]))
-				$fdesc = $tables_principales[$nom_sql];
-			else {
-				include_spip('base/auxiliaires');
-				if (isset($tables_auxiliaires['spip_' .$nom])) {
-					$nom_sql = 'spip_' . $nom;
-					$fdesc = $tables_auxiliaires[$nom_sql];
-				}  # table locale a cote de SPIP, comme non SPIP:
-			}
-		}
 	}
 
 	// si c'est la premiere table qu'on cherche
 	// et si on est pas explicitement en recalcul
 	// on essaye de recharger le cache des decriptions de ce serveur
 	// dans le fichier cache
-	if (!isset($connexion['tables'][$nom_sql])
+	if (!isset($connexion['tables'][$nom])
 	  AND $GLOBALS['var_mode']!=='recalcul'
 	  AND (!isset($connexion['tables']) OR !$connexion['tables'])) {
 		if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache)
 		  AND $desc_cache=unserialize($desc_cache))
 		  $connexion['tables'] = $desc_cache;
 	}
-	if (!isset($connexion['tables'][$nom_sql])) {
+	if (!isset($connexion['tables'][$nom])) {
+		include_spip('base/serial');
+
+		if (isset($tables_principales[$nom_sql]))
+			$fdesc = $tables_principales[$nom_sql];
+		// meme si pas d'abreviation declaree, trouver la table spip_$nom
+		// si c'est une table principale,
+		// puisqu'on le fait aussi pour les tables auxiliaires
+		elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){
+			$nom_sql = 'spip_' . $nom;
+			$fdesc = &$tables_principales[$nom_sql];
+		}
+		else {
+			include_spip('base/auxiliaires');
+			if (isset($tables_auxiliaires['spip_' .$nom])) {
+				$nom_sql = 'spip_' . $nom;
+				$fdesc = &$tables_auxiliaires[$nom_sql];
+			}  # table locale a cote de SPIP, comme non SPIP:
+		}
+
+		// faut il interpreter le prefixe 'spip_' ?
+		$transposer_spip = ($nom_sql != $nom);
 		
 		// La *vraie* base a la priorite
 		if (true /*  !$bdesc OR !$bdesc['field']  */) {
-			$t = ($nom_sql != $nom);
-			$desc = sql_showtable($nom_sql, $t, $serveur);
+			$desc = sql_showtable($nom_sql, $transposer_spip, $serveur);
 			if (!$desc OR !$desc['field']) {
 				if (!$fdesc) {
 					spip_log("trouver_table: table inconnue '$serveur' '$nom'");
@@ -110,17 +128,22 @@ function base_trouver_table_dist($nom, $serveur=''){
 			$desc['key']['PRIMARY KEY'] = array_shift(array_keys($desc['field']));
 
 		$desc['table']= $nom_sql;
-		$desc['id_table']= $nom;
 		$desc['connexion']= $serveur;
-		$desc['titre'] = isset($GLOBALS['table_titre'][$nom])
-		? $GLOBALS['table_titre'][$nom] : '';
-		$connexion['tables'][$nom_sql] = $desc;
+		// objet_type peut provoquer un appel reentrant ici.
+		// pour ne pas faire de boucle infinie, on stocke ce qu'on a deja trouve
+		$connexion['tables'][$nom] = $desc;
+
+		$table = table_objet(objet_type($nom));
+		$desc['titre'] =
+		  isset($GLOBALS['table_titre'][$table]) ? $GLOBALS['table_titre'][$table] : '';
+		$connexion['tables'][$nom] = $desc;
 		// une nouvelle table a ete descrite
 		// mettons donc a jour le cache des descriptions de ce serveur
 		if (is_writeable(_DIR_CACHE))
 			ecrire_fichier($nom_cache_desc_sql[$serveur],serialize($connexion['tables']));
 	}
 
-	return $connexion['tables'][$nom_sql];
+	$connexion['tables'][$nom]['id_table']=$nom;
+	return $connexion['tables'][$nom];
 }
 ?>
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 3b02ee6f8f..be3ee2e69c 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2349,7 +2349,7 @@ function singulier_ou_pluriel($nb,$chaine_un,$chaine_plusieurs,$var='nb'){
  * @param string $fonction
  * @return string
  */
-function filtre_icone_dist($lien, $texte, $fond, $align="", $fonction="", $class=""){
+function filtre_icone_dist($lien, $texte, $fond, $align="", $fonction="", $class="",$javascript=""){
 	if ($icone_renommer = charger_fonction('icone_renommer','inc',true))
 		list($fond,$fonction) = $icone_renommer($fond,$fonction);
 
diff --git a/prive/modeles/formulaire.html b/prive/modeles/formulaire.html
index 0f651bcf66..b193a27112 100644
--- a/prive/modeles/formulaire.html
+++ b/prive/modeles/formulaire.html
@@ -1,4 +1,4 @@
 <div><?php 
 /* une fonction qui produit du php qui ne sera execute qu'au service final de la page */
-echo executer_balise_dynamique('FORMULAIRE_[(#ENV{class}|strtoupper|texte_script)]',[(#ENV{args}|var_export{true})],array(),'#ENV{lang}',0);
+echo executer_balise_dynamique('FORMULAIRE_[(#ENV{class}|strtoupper|texte_script)]',[(#ENV{args}|var_export{true})],array('','','','','#ENV{lang}'));
 ?></div>
\ No newline at end of file
-- 
GitLab