From 3bc5ca0f76d88fe69ca4da7287ca4bc68dfc40a3 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 9 Jun 2006 22:43:35 +0000
Subject: [PATCH] =?UTF-8?q?Correction=20partielle=20d'un=20bug=20d=C3=A9no?=
 =?UTF-8?q?nc=C3=A9=20il=20y=20a=20un=20an=20par=20GoUaRfIg!=20dans=20http?=
 =?UTF-8?q?://thread.gmane.org/gmane.comp.web.spip.devel/27971=20a=20savoi?=
 =?UTF-8?q?r=20que=20le=20critere=20{id=5Fsecteur}=20ne=20marche=20pas=20d?=
 =?UTF-8?q?ans=20une=20boucle=20de=20forum.=20Il=20marche=20=C3=A0=20pr?=
 =?UTF-8?q?=C3=A9sent=20pour=20les=20forums=20d'articles,=20y=20compris=20?=
 =?UTF-8?q?avec=20criteres=20plus=20complexes=20comme=20{id=5Fsecteur=20IN?=
 =?UTF-8?q?=201,=20#ENV{secteur}}=20etc.=20En=20revanche,=20il=20ne=20marc?=
 =?UTF-8?q?he=20toujours=20pas=20pour=20les=20forums=20de=20breves,=20de?=
 =?UTF-8?q?=20rubriques=20ou=20de=20syndication=20(bof).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/public/criteres.php | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 6ccac11464..2fc4749d53 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -590,10 +590,14 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	if ($col == 'id_enfant')
 	  $col = $boucle->primary;
 
-	// Cas particulier : id_secteur = id_rubrique pour certaines tables
-	else if (($type == 'breves' OR $type == 'forums') AND $col == 'id_secteur')
-	  $col = 'id_rubrique';
-
+	// Cas particulier : id_secteur pour certaines tables
+	else if ($col == 'id_secteur') {
+		if ($type == 'breves')
+		    $col = 'id_rubrique';
+		else if ($type == 'forums') {
+		  $table = critere_secteur_forum($idb, $boucles, $val, $crit);
+		}
+	}
 	// Cas particulier : expressions de date
 	else if ($table_date[$type]
 	AND preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,",
@@ -614,7 +618,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 		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, $col, $desc, $crit, $t);
+		$table = calculer_critere_externe_init($boucle, $boucle->jointures, $col, $desc, $crit, $t);
 	  }
 	}
 	// ajout pour le cas special d'une condition sur le champ statut:
@@ -640,11 +644,25 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	} else $arg = $col;
 
 	// inserer la fonction SQL
-	if ($fct) $arg = "$fct($col$args_sql)";
+	if ($fct) $arg = "$fct($arg$args_sql)";
 
 	return array($arg, $op, $val, $col);
 }
 
+// Faute de copie du champ id_secteur dans la table des forums,
+// faut le retrouver par jointure
+// Pour chaque Row il faudrait tester si le forum est 
+// d'article, de breve, de rubrique, ou de syndication.
+// Pour le moment on ne traite que les articles,
+// les 3 autres cas ne marcheront donc pas: ca ferait 4 jointures
+// qu'il faut traiter optimalement ou alors pas du tout.
+
+function critere_secteur_forum($idb, &$boucles, $val, $crit)
+{
+	list($nom, $desc) = trouver_def_table('articles', $boucles[$idb]);
+	return calculer_critere_externe_init($boucles[$idb], array($nom), 'id_secteur', $desc, $crit, true);
+}
+
 // Champ hors table, ca ne peut etre qu'une jointure.
 // On cherche la table du champ et on regarde si elle est deja jointe
 // Si oui et qu'on y cherche un champ nouveau, pas de jointure supplementaire
@@ -653,9 +671,9 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 // (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures
 // pour selectioner ce qui a exactement ces 2 mots-cles.
 
-function calculer_critere_externe_init(&$boucle, $col, $desc, $crit, $checkarrivee = false)
+function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $crit, $checkarrivee = false)
 {
-	$cle = trouver_champ_exterieur($col, $boucle->jointures, $boucle, $checkarrivee);
+	$cle = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
 	if ($cle) {
 		$t = array_search($cle[0], $boucle->from);
 		if ($t) if (!trouver_champ('/\b' . $t  . ".$col" . '\b/', $boucle->where)) return $t;
-- 
GitLab