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