diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 6ccac114645a73747bda889fded0ccd9fd5caf55..2fc4749d53e8fed845bd6c9b8f7a7e2786c79cb3 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;