[spip-dev] bug sur prive/objets/liste/auteurs_enligne.html

Coucou,

sur un SPIP récemment mis à jour en 3.1, je n’ai pas de champ spip_auteurs.imessage, et du coup une erreur de compilation sur la boucle

<BOUCLE_enligne(AUTEURS)
{id_auteur != #SESSION{id_auteur}}
{statut IN 1comite,0minirezo}
{imessage != non}

Hop,

Ou alors tu as viré ce plugin de plugins-dist ?

Ah oui c'est ça, je l'ai viré (il y a longtemps, j'avais oublié)
=> De même que : breves, compagnon, dump, forum, pétitions, porte_plume et
vertebres.

Bon du coup c'est moins grave comme bug, c'est juste un problème de
mauvaise indépendance des packages.

-- Fil

Ça me fait re-penser que pour les boucles, on a une méthode réelle (pas bidouille quoi) qui permet d'écrire des boucles dans les squelettes même quand on est pas sûr que la table existe.
```<BOUCLE_patate(PATATES?){id_rubrique}>```

Pourquoi n'a-t-on pas la même chose pour les critères ?

Actuellement si on écrit un critère portant sur un champ SQL (pas un critère calculé explicite donc), le squelette entière plante si le champ n'existe pas.

Au niveau syntaxe par contre, je ne sais pas ce que ça pourrait être par contre, parce que j'ai l'impression qu'on a en partie merdé sur le choix du caractère "?" :
- dans les critères c'est pour dire que ça annule le critère si la variable *est vide* (en gros)
- dans les boucles c'est pour dire de ne pas planter si la table *n'existe pas*
=> ce qui n'a rien à voir !

Du coup si on veut une syntaxe pour dire de ne pas planter si un champ SQL n'existe pas, on ne peut plus utiliser le "?", déjà pris pour autre chose. Pas cohérent tout ça… <troll>Mais bon c'est une tradition. :D</troll>

Ou alors, SPIP pourrait-il ne jamais planter quand un champ n'existe pas, sans rien mettre de plus ? Est-ce que ça poserait des problèmes ? Ça peut pas juste être ignoré, silencieusement ?

c'est bien de remonter des erreurs quand tu écris tes squelettes

ici le truc c'est que le squelette contenant la variante avec {imessage}
devrait être dans le plugin organiseur, et le squelette sans {imessage}
dans la partie core. Mais est-ce bien raisonnable ?

-- Fil

Idée peut-être pas pratique du tout, que je jette en l'air comme elle me
vient :

De mémoire on peut dire qu'on veut une chaîne dans un paquet particulier
<monplugin:babliblo>

Et si on préfixait les variables de la même manière ? Si imessage vient
du plugin machin, on pourrait avoir {organiseur:imessage} et du coup,
renvoyer une erreur dans le spip log et le mode debug mais ne pas lever
d'erreur dans le rendu de la page par défaut…

(mes deux sous)

c'est bien de remonter des erreurs quand tu écris tes squelettes

Oui, c'est vrai car parfois ça peut être parce qu'on a mal écrit un truc (PATATOS au lieu de PATATES), donc ça nous aide immédiatement.

Mais donc ça veut dire qu'il faudrait bien une syntaxe, un caractère à mettre en plus, pour dire qu'un critère de champ SQL peut être optionnel, comme peut déjà l'être une table avec "?" (mais je répète, ça fait chier pour la cohérence du coup de pas pouvoir utiliser "?" là aussi puisque déjà pris).

ici le truc c'est que le squelette contenant la variante avec {imessage}
devrait être dans le plugin organiseur, et le squelette sans {imessage}
dans la partie core. Mais est-ce bien raisonnable ?

Ça fait trop de duplication. Et ce n'est pas du tout modulaire : si un autre plugin encore a besoin d'ajouter un autre critère sur le même morceau, c'est pas possible.

Théoriquement, la vraie solution serait d'avoir un système permettant, dans un pipeline, de cibler TELLE boucle de TEL squelette, et de lui ajouter les critères qu'on veut *avant calcul* par le compilateur.

Une sorte de "pre_boucle", mais encore mieux ou surtout plus facile : c'est-à-dire pas en codant soi-même du PHP échappé à la mode compilateur comme on doit le faire actuellement dans "pre_boucle", mais juste en déclarant un critère en plus avant l'envoi vers le compilo.

Un truc du genre (à l'arrache pas avec les vraies propriétés) par exemple pour le plugin Mots :

function mots_pre_compilo(&$boucle) {
	if ($boucle->type == 'articles' and $boucle->squelette == 'inclure/truc') {
		$boucle->criteres .= '{id_mot?}{titre_mot?}'
	}
}

This is a dream.