Re: {branche?} provoque une jointure / SPIP 3.1.1 SVN
Matthieu Marcillaud <[email protected]>
| Newsgroups | gmane.comp.web.spip.devel |
|---|---|
| Message-ID | <[email protected]> |
Le 12/08/2016 à 13:22, RealET a écrit :
> Est-ce que c'est ce que
> https://core.spip.net/projects/spip/repository/entry/branches/spip-3.1/ecrire/public/criteres.php#L522
> tente de faire ?
> $boucle->where[] = !$crit->cond ? $c :
> ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
>
Ok, on a bien un bug ici. Je reproduis.
Le code généré est : (sql_quote(@$Pile[0]['id_rubrique']) ?
sql_in('L1.id_rubrique',
calcul_branche_in(sql_quote(@$Pile[0]['id_rubrique']))) : '1=1')
Mais sql_quote(0) donne '0' considérant que c'est du texte, sans
précision du type de champ.
Du coup, ça entre toujours dans la condition.
Il faut ajouter le type int attendu par sql_quote ici...
Ce sql_quote est généré par kwote. Qui peut prendre le type en argument.
Donc , passer l'appel de :
$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles));
à
$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles),
$boucle->sql_serveur, 'int NOT NULL');
Mais la fonction kwote peut utiliser 2 sql_quote, et le second qui sera
utilisé ici n'utilise pas l'argument de type : je pense que c'est un
oubli et que ça devrait être ajouté.
Donc dans kwote() :
Passer de
return "sql_quote($lisp)";
à
return "sql_quote($lisp, '$serveur', '$type')";
Je suppose que l'oubli (si c'est le cas) vient de
https://core.spip.net/projects/spip/repository/revisions/19257
Avec ces 2 corrections les boucles semblent fonctionner comme attendu :
?page=test :
<BOUCLE_br(EVENEMENTS){branche?}>
=> pas de jointure
?page=test&id_rubrique=1 :
<BOUCLE_br(EVENEMENTS){branche?}>
=> jointure OK
?page=test&id_rubrique[]=1&id_rubrique[]=2 :
<BOUCLE_br(EVENEMENTS){branche?}>
=> jointure OK
MM.