[spip-dev] Boucle qui marchait en SPIP 2.1 et plus en 3.0.5

Bonjour,

La boucle suivante :
<BOUCLE_MenuHaut(RUBRIQUES){titre_mot=MenuHaut}{id_rubrique=#ENV{secteurencours}}{!titre_mot=PasDansMenu}{!lang_select}>

me donne sous SPIP 3.0.5 SVN :
Erreur SQL 1054
Unknown column 'rubriques.id_rubrique' in 'on clause'
SELECT rubriques.id_rubrique
FROM spip_rubriques AS `rubriques`
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = rubriques.id_rubrique AND L1.objet='rubrique')
INNER JOIN spip_mots AS L2 ON ( L2.id_mot = L1.id_mot )
WHERE (rubriques.statut = 'publie')
  AND (L2.titre = 'MenuHaut')
  AND (rubriques.id_rubrique = 0)
  AND NOT((rubriques.id_rubrique IN (
SELECT L3.id_objet AS id
FROM spip_mots_liens AS `L3`
INNER JOIN spip_mots AS L4 ON ( L4.id_mot = L3.id_mot )
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = rubriques.id_rubrique )
WHERE (L4.titre = 'PasDansMenu')
  AND L1.objet='rubrique'
  AND L3.objet='rubrique')))
GROUP BY rubriques.id_rubrique

elle se compilait sous SPIP 2.1.19 en :
SELECT rubriques.id_rubrique, rubriques.id_rubrique
FROM spip_rubriques AS `rubriques`
INNER JOIN spip_mots_rubriques AS L1 ON ( L1.id_rubrique = rubriques.id_rubrique )
INNER JOIN spip_mots AS L2 ON ( L2.id_mot = L1.id_mot )
WHERE (rubriques.statut = 'publie')
  AND (L2.titre = 'MenuHaut')
  AND (rubriques.id_rubrique = 5)
  AND NOT((rubriques.id_rubrique IN (
SELECT L3.id_rubrique
FROM spip_mots_rubriques AS `L3`
INNER JOIN spip_mots AS L4 ON ( L4.id_mot = L3.id_mot )
WHERE (L4.titre = 'PasDansMenu'))))
GROUP BY rubriques.id_rubrique

Si j'enlève {!titre_mot=PasDansMenu} il n'y a plus d'erreur.

Plus curieux, si j'enlève le {!lang_select} il n'y a plus d'erreur non plus.
Et la compilation dans ce cas devient sous SPIP 3 :
SELECT rubriques.id_rubrique, rubriques.lang, rubriques.titre
FROM spip_rubriques AS `rubriques`
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = rubriques.id_rubrique AND L1.objet='rubrique')
INNER JOIN spip_mots AS L2 ON ( L2.id_mot = L1.id_mot )
WHERE (rubriques.statut = 'publie')
  AND (L2.titre = 'MenuHaut')
  AND (rubriques.id_rubrique = 0)
  AND NOT((rubriques.id_rubrique IN (
SELECT L3.id_objet AS id
FROM spip_mots_liens AS `L3`
INNER JOIN spip_mots AS L4 ON ( L4.id_mot = L3.id_mot )
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = rubriques.id_rubrique )
WHERE (L4.titre = 'PasDansMenu')
  AND L1.objet='rubrique'
  AND L3.objet='rubrique')))
GROUP BY rubriques.id_rubrique

(la seule différence, c'est dans la première ligne :
, rubriques.lang, rubriques.titre
)

Et sous SPIP 2.1.19, ça donne :
SELECT rubriques.id_rubrique, rubriques.id_rubrique, rubriques.lang, rubriques.titre
FROM spip_rubriques AS `rubriques`
INNER JOIN spip_mots_rubriques AS L1 ON ( L1.id_rubrique = rubriques.id_rubrique )
INNER JOIN spip_mots AS L2 ON ( L2.id_mot = L1.id_mot )
WHERE (rubriques.statut = 'publie')
  AND (L2.titre = 'MenuHaut')
  AND (rubriques.id_rubrique = 5)
  AND NOT((rubriques.id_rubrique IN (
SELECT L3.id_rubrique
FROM spip_mots_rubriques AS `L3`
INNER JOIN spip_mots AS L4 ON ( L4.id_mot = L3.id_mot )
WHERE (L4.titre = 'PasDansMenu'))))
GROUP BY rubriques.id_rubrique

J'en conclus que je peux enlever le {!lang_select} sans dommage.
Mais c'est surprenant.

* RealET tapuscrivait, le 04/12/2012 08:37:

Bonjour,

La boucle suivante :
<BOUCLE_MenuHaut(RUBRIQUES){titre_mot=MenuHaut}{id_rubrique=#ENV{secteurencours}}{!titre_mot=PasDansMenu}{!lang_select}>

Plus curieux, si j'enlève le {!lang_select} il n'y a plus d'erreur non
plus.

Rectificatif : l'erreur n'était juste plus affichée parce que je n'avais pas ?var_mode=calcul

Donc, c'est {titre_mot=MenuHaut} + {!titre_mot=PasDansMenu} qui posent problème ensemble.
L'un ou l'autre, c'est bon.

Bonjour,
il y a un ticket à ce sujet avec un moyen de s'en sortire quand même ici:
http://core.spip.org/issues/2729

RealET wrote:

* RealET tapuscrivait, le 04/12/2012 08:37:

Bonjour,

La boucle suivante :
<BOUCLE_MenuHaut(RUBRIQUES){titre_mot=MenuHaut}

{id_rubrique=#ENV{secteurencours}}{!titre_mot=PasDansMenu}{!lang_select}>