[spip-dev] [Spip-zone-commit] r114271 - in _core_/plugins/mots

Hello Touti,

je comprend bien l’objectif poursuivi, mais ça semble un peu brutal et pas très satisfaisant de forker les squelettes listes articles/rubriques, car du coup ceux qui les ont personnalisés perdent des morceaux, et cela pose aussi plusieurs questions de généricité :

Ce que tu fais ici pour les mots, faut il le faire pour tout objet qui vient enrichir les articles ?
Et dans l’autre sens tu as changé le nommage générique en demandant donc une liste {table}-mot pour les autres objets ne faisant pas partie du core.
Donc on casse plein de compat sur les objets perso, mais au delà est il raisonnable de se retrouver à dupliquer des listes ad-nauseam partout ?

Pour le moment c’était resté comme ça car il n’a jamais été considéré comme critique de se débarasser de ce {id_mot?} dans ces listes, mais si on veut vraiment se débarasser de la dépendance je pense qu’on doit faire mieux que ça en évitant tous ces dédoublement.

Une solution à laquelle je pense serait de faire un critère spécifique genre {selection_conditionnelle} (nomenklatura si tu as mieux on prend !) qui regarderait les id_xxx connus dans l’environnement et pour chaque chercherait une fonction du type inc_generer_condition_selection_{id_xx}_dist qu’on appelerait sur le mode
$generer_condition_selection = charger_fonction(‘generer_condition_selection_’.$primary,’inc’);
$boucle->where[] = $generer_condition_selection($type_boucle,champ_sql($primary));

a charge pour chaque plugin de déclarer la fonction de selection correspondante et d’y gerer tous les cas (ici si pas de $_PILE[0][‘id_mot’] ça renvoie un 1=1)

Bref, c’est juste les grandes lignes, il y a surement des problèmes à résoudre et de la mise au point à faire, mais ça me semble une direction plus générique et souhaitable pour à la fois résoudre la dépendance de ces listes d’un plugin en particulier et éviter de faire 36 copies dans tous les coins de la zone…
(en évitant de la rupture de compat, puisque les surcharges continueraient de fonctionner, de même que les listes existantes d'autres objets éditoriaux)

Bises

Hello :slight_smile:

Je réponds aussi, puisqu’on en a un peu parlé IRL en même temps, et cette solution était le plus simple à mettre en œuvre. Mais effectivement c’est embêtant.

Il y a 2 ans, James proposait de passer par un pipeline permettant d’étendre le contenu du texte des critères (au niveau du phraseur) pour insérer "{id_mot?}", mais cela a aussi des problématiques.

Ce que tu proposes là me parait aussi intéressant et plus générique, quoi que plus difficile à coder. J’essaierai d’y jeter un œil tout de même.

MM.

Re,

A la faveur de la nuit, je me dis que le plus simple serait même que le critère prendrai les clés primaires connues et ferait un foreach dessus en se compilant comme en suite de {id_xx?}
Ça doit pouvoir se faire assez simplement.

Et dans un second temps on pourrait même passer en argument des clés à ignorer
{selection_conditionnelle !id_rubrique,!id_auteur}
-> dans ce cas ça prend toutes les clés connues sauf celle exclues si on les rencontre

ou lister explicitement les clés qu’on veut utiliser
{selection_conditionnelle id_auteur,id_mot}
-> dans ce cas ça ne prend que les clés connues dans cette liste

Syntaxe à affiner évidemment, mais par contre ça ne pourrait être qu’une liste statique, connue au moment de la compilation
(dans ce cas pas de #LISTE{…} ou de #GET ou de #ENV), mais ça me paraît pas rédibhitoire et ça pourrait coller au besoin

Et aussi à tester sur des cas réels avec des grosses bases d’articles pour voir si ça fait pas des requêtes qui explosent…

Si c’est pas viable, l’option des fonctions qui fourniraient des where semble une alternative, au risque de faire une liste de sql_in(‘id_article’,…) avec des très grosses listes.

Et enfin en dernière option, les fonctions s’enchainent pour se passer la liste d’id_article, qu’elles réduisent une par une par intersection en fonction de leur requête.
Ça permet d’enchainer plusieurs requetes plus simples et de finir avec un seul id_article IN (…) avec potentiellement une liste plus courte.
Sur les grosses bases c’est moins couteux que les jointures qui multiplient le nombre de ligne en résultat de la requête.

Bref, à mettre au point :slight_smile:

Très embêtant.
Devoir dupliquer tous les squelettes d'objets éditoriaux me parait une fausse bonne idée, je suis sûr qu'on peut trouver quelque chose de beaucoup plus smart :slight_smile:

Je dis ça sans y avoir réfléchi plus que ça, mais dans plugins/mots/prive/squelettes/contenu/mot.html, dans la BOUCLE_autresobjets, on pourrait construire un #ARRAY des objets en récupérant leur champ titre et leur clé primaire, et passer ce tableau à un prive/objets/liste/objets-mot.html générique qui bouclerait dessus.

Bonne idée !

Oui, donc j’ai proposé un patch là https://core.spip.net/issues/4300 pour ton idée de critère selection_conditionnelle.

Tel que proposé actuellement, (ARTICLES){selection_conditionnelle}...
va ajouter sur la boucle :

- tous les {id_xx?} présents sur spip_articles (id_article, id_rubrique, id_secteur, id_trad)

- tous les {id_xx?} correspondants à des clés primaires des objets éditoriaux éditables (id_auteur, id_mot, id_groupe, id_message, id_syndic, id_breve, id_document) avec les plugins dist par défaut.

Ça fait quand même beaucoup de conditions théoriques et de calculs de jointures potentielles, même si elles ne sont finalement pas utilisées.

En tout cas ça répond à la problématique pour prive/objets/liste/{objet}.html et son usage il me semble.

MM.

J'ai répondu trop vite, sans avoir détaillé/compris le code. Cette modif n'oblige pas du tout à dupliquer les squelettes d'objets éditos.

> Ce que tu proposes là me parait aussi intéressant et plus générique,
> quoi que plus difficile à coder. J’essaierai d’y jeter un œil tout de même.

Oui, donc j’ai proposé un patch là Rendre facultatif les plugins-dist (#4300) · Tickets · spip / spip · GitLab
pour ton idée de critère selection_conditionnelle.

Tel que proposé actuellement, (ARTICLES){selection_conditionnelle}...
va ajouter sur la boucle :

- tous les {id_xx?} présents sur spip_articles (id_article, id_rubrique,
id_secteur, id_trad)

Ah oui ceux-là aussi il faut les mettre, je n’y avais pas pensé

- tous les {id_xx?} correspondants à des clés primaires des objets
éditoriaux éditables (id_auteur, id_mot, id_groupe, id_message,
id_syndic, id_breve, id_document) avec les plugins dist par défaut.

Du coup sur ça en y reflechissant je pense qu’il faudrait ne prendre que les id_x qui remplissent une des conditions suivantes
* id_x est un champ de la table sur laquelle la boucle porte (articles ici) -> mais du coup c’est pris en compte avec ta condition précédente
* la table x contient un champ id_article (ici, à apadapter en fonction de la boucle)
* il existe une table x_lien

Ce qui réduirait quand même déjà les combinatoires sans aucun sens ( {id_breve?} sur une table article n’a pas de sens)

Ensuite on peut dire que cette liste de clé automatique pour la table (articles) passe dans un pipeline, ce qui permet éventuellement aux plugins d’ajouter des cas particuliers qui sortent de ces critères là, ou au contraire de retirer un id_x qui n’a pas de sens

Et enfin on ajoute tous les {id_x?} en critère sur la boucle

Ça fait quand même beaucoup de conditions théoriques et de calculs de
jointures potentielles, même si elles ne sont finalement pas utilisées.

En tout cas ça répond à la problématique pour
prive/objets/liste/{objet}.html et son usage il me semble.

En effet là je pense qu’on peut déjà avoir une version qui marche et qui remplace notre {id_mot?} bancal sans duplication de code, à affiner selon les cas problématiques que l’on rencontrera ensuite

Merci !

Cédric

Merci Touti pour la correction qui évite déjà la création d’un squelette liste/xxxx-mot.html sur tous les objets éditoriaux, c’est toujours ça de pris.

Ensuite je ne doute pas en effet que ceux qui ont déjà personnalisé les squelettes sachent s’en sortir, mais si on peut éviter de devoir dupliquer des squelettes de l’espace privé autant que possible ça sera toujours beaucoup mieux

Mais je suis sûr qu’on va trouver une solution :slight_smile:

Plus concis seraient {id?}, {id_?} ou {id??}

JL

Ah oui pas mal :
{id_xx?} ou {id_tous?} ou {id_all?}
Mais du coup {id_?} est peut être le mieux car évitant tout risque de collision ?

le `?` étant ici juste pour mémoire, les critères étant de toute façon toujours insérés de manière conditionnels

J’ai envoyé avec {id_?}.
Y a pu ka tester que ça va bien.

MM.