Skip to content
Extraits de code Groupes Projets
Valider 3bc5ca0f rédigé par esj's avatar esj
Parcourir les fichiers

Correction partielle d'un bug dénoncé il y a un an par GoUaRfIg! dans

http://thread.gmane.org/gmane.comp.web.spip.devel/27971
a savoir que le critere {id_secteur} ne marche pas dans une boucle de forum.
Il marche à présent pour les forums d'articles, y compris avec criteres plus
complexes comme {id_secteur IN 1, #ENV{secteur}} etc.
En revanche, il ne marche toujours pas pour les forums de breves, de rubriques
ou de syndication (bof).
parent db403a81
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -590,10 +590,14 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { ...@@ -590,10 +590,14 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
if ($col == 'id_enfant') if ($col == 'id_enfant')
$col = $boucle->primary; $col = $boucle->primary;
// Cas particulier : id_secteur = id_rubrique pour certaines tables // Cas particulier : id_secteur pour certaines tables
else if (($type == 'breves' OR $type == 'forums') AND $col == 'id_secteur') else if ($col == 'id_secteur') {
$col = 'id_rubrique'; if ($type == 'breves')
$col = 'id_rubrique';
else if ($type == 'forums') {
$table = critere_secteur_forum($idb, $boucles, $val, $crit);
}
}
// Cas particulier : expressions de date // Cas particulier : expressions de date
else if ($table_date[$type] else if ($table_date[$type]
AND preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", 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) { ...@@ -614,7 +618,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
if (isset($exceptions_des_jointures[$col])) if (isset($exceptions_des_jointures[$col]))
// on ignore la table, quel luxe! // on ignore la table, quel luxe!
list($t, $col) = $exceptions_des_jointures[$col]; 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: // ajout pour le cas special d'une condition sur le champ statut:
...@@ -640,11 +644,25 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { ...@@ -640,11 +644,25 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
} else $arg = $col; } else $arg = $col;
// inserer la fonction SQL // inserer la fonction SQL
if ($fct) $arg = "$fct($col$args_sql)"; if ($fct) $arg = "$fct($arg$args_sql)";
return array($arg, $op, $val, $col); 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. // Champ hors table, ca ne peut etre qu'une jointure.
// On cherche la table du champ et on regarde si elle est deja jointe // 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 // 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) { ...@@ -653,9 +671,9 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
// (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures // (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures
// pour selectioner ce qui a exactement ces 2 mots-cles. // 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) { if ($cle) {
$t = array_search($cle[0], $boucle->from); $t = array_search($cle[0], $boucle->from);
if ($t) if (!trouver_champ('/\b' . $t . ".$col" . '\b/', $boucle->where)) return $t; if ($t) if (!trouver_champ('/\b' . $t . ".$col" . '\b/', $boucle->where)) return $t;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter