From 0a2400b4eec073ca87af314aae9c1fac32244caf Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 29 Nov 2006 15:21:17 +0000
Subject: [PATCH] permettre aux plugins de gerer eux memes des jointures ou des
 criteres tordus pas automatisables par extension de la syntaxe de :
 $GLOBALS['exceptions_des_tables']['forms_donnees']['id_mot']=array('spip_forms_donnees_champs',
 'valeur', 'forms_index_exception'); -> un troisieme argument optionnel comme
 nom de fonction qui fait le boulot de index_exception()
 $GLOBALS['exceptions_des_jointures']['forms_donnees']['id_mot'] =
 array('spip_forms_donnees_champs', 'valeur',
 'forms_calculer_critere_externe'); -> une dimension intermediaire pour
 specifier une jointure sur une table uniquement, et un troisieme argument
 optionnel comme nom de fonction qui fait le boulot a la place de
 calculer_critere_externe_init()

---
 ecrire/public/criteres.php   | 22 +++++++++++++++-------
 ecrire/public/references.php | 32 ++++++++++++++++++++------------
 2 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index cc421e9fcd..07536f9406 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -672,13 +672,21 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 		$val[0] = str_replace('image', 'vignette', $val[0]);
 
 	else  {
-	  $nom = $table_des_tables[$type];
-	  list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
-	  if (@!array_key_exists($col, $desc['field'])) {
-		if (isset($exceptions_des_jointures[$col]))
-		  // on ignore la table, quel luxe!
-			list($t, $col) = $exceptions_des_jointures[$col];
-		$table = calculer_critere_externe_init($boucle, $boucle->jointures, $col, $desc, ($crit->cond OR $op !='='), $t);
+		$nom = $table_des_tables[$type];
+		list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+		if (@!array_key_exists($col, $desc['field'])) {
+	  	$calculer_critere_externe = 'calculer_critere_externe_init';
+			// gestion par les plugins des jointures tordues pas automatiques mais necessaires
+			if (isset($exceptions_des_jointures[$table][$col])){
+				if (count($exceptions_des_jointures[$table][$col])==3)
+					list($t, $col, $calculer_critere_externe) = $exceptions_des_jointures[$table][$col];
+				else
+					list($t, $col) = $exceptions_des_jointures[$table][$col];
+			}
+			else if (isset($exceptions_des_jointures[$col]))
+			  // on ignore la table, quel luxe!
+				list($t, $col) = $exceptions_des_jointures[$col];
+			$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond OR $op !='='), $t);
 	  }
 	}
 	// ajout pour le cas special d'une condition sur le champ statut:
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 1da5e418a1..894db8756b 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -154,18 +154,26 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep)
 	global $tables_des_serveurs_sql;
 
 	if (is_array($excep)) {
-
-		list($e, $x) = $excep;	#PHP4 affecte de gauche a droite
-		$excep = $x;		#PHP5 de droite a gauche !
-		if (!$t = array_search($e, $boucle->from)) {
-			$t = 'J' . count($boucle->from);
-			$boucle->from[$t] = $e;
-			$j = $tables_des_serveurs_sql[$desc['serveur']][$e];
-# essayer ca un jour: 	list($nom, $j) = trouver_def_table($e, $boucle);
-			$j = $j['key']['PRIMARY KEY'];
-			$boucle->where[]= array("'='", "'$boucle->id_table." . "$j'", "'$t.$j'");
-			}
-	} else $t = $desc['type'];
+		// permettre aux plugins de gerer eux meme des jointures derogatoire ingérables
+		$t = NULL;
+		if (count($excep)==3){
+			$index_exception_derogatoire = array_pop($excep);
+			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
+		}
+		if ($t == NULL) {
+			list($e, $x) = $excep;	#PHP4 affecte de gauche a droite
+			$excep = $x;		#PHP5 de droite a gauche !
+			if (!$t = array_search($e, $boucle->from)) {
+				$t = 'J' . count($boucle->from);
+				$boucle->from[$t] = $e;
+				$j = $tables_des_serveurs_sql[$desc['serveur']][$e];
+	# essayer ca un jour: 	list($nom, $j) = trouver_def_table($e, $boucle);
+				$j = $j['key']['PRIMARY KEY'];
+				$boucle->where[]= array("'='", "'$boucle->id_table." . "$j'", "'$t.$j'");
+				}
+		}
+	} 
+	else $t = $desc['type'];
 	// demander a SQL de gerer le synonyme
 	// ca permet que excep soit dynamique (Cedric, 2/3/06)
 	if ($excep != $nom_champ) $excep .= ' AS '. $nom_champ;
-- 
GitLab