[spip-dev] CFG : Reprenons dans le calme

Hello,

je vais commencer par faire acte de contrition.

J'ai réagit rapidement et vivement aux derniers commit d'Emmanuel sur #FORMULAIRE_CONFIGURER_PLUGIN, m'enflammant sur le fond et en oubliant de mettre la forme.
Cela a pu être perçu comme une agression personnelle, et il en est ressorti des échanges peu constructifs.

Il n'en était rien, et je demande donc à Emmanuel de bien vouloir m'excuser pour cela car ça n'était pas mon intention. Cela m'apprendra à prendre le temps de réfléchir, avant de réagir. C'est ce que j'ai essayé de faire ici, avec plus de succès j'espère.

Je vais donc essayer de reprendre de manière plus claire et détaillée les points qui me gênent dans la proposition d'Emmanuel, en insistant bien sur le fait que ce qui m'intéresse ici est le point de vue de l'utilisateur de CFG (cela va du développeur aguerri qui veut gagner du temps, au webmestre bidouilleur qui ne sait pas coder en PHP), et reflète les usages existants de CFG qu'il faut prendre en compte pour proposer une solution de remplacement ; mais aussi la continuité avec les formulaires CVT.

Vis a vis de l'existant CFG :

Hello,

je vais commencer par faire acte de contrition.

...

je demande donc à Emmanuel de bien vouloir m'excuser

Pas besoin d'aller jusqu'à la contrition cher Cédric, les excuses sont bien suffisantes et je les accepte avec plaisir.
Oublions les phrases excessives de ces dernières 24 heures, et reprenons la discussion technique.

Avant de me prononcer sur tes implémentations alternatives qui demandent réflexion, il me semble qu'il y a en amont des questions de spécifications qui n'ont pas été débattues, ce qui explique beaucoup d'incompréhension.

J'ai l'impression en particulier que la question de tables de méta séparées est vue par toi comme un choix d'implémentation,
alors que pour moi c'est un choix de spécification, c'est même LE choix qui m'a convaincu de l'importance d'une alternative à CFG.

Quand j'ai repris le plugin Association, j'ai demandé à ses concepteeurs de me fournir un jeu de test en vraie grandeur. Et là patatras: me fournir un dump SQL des tables du plugin, pas trop de pbs, mais extraire de spip_meta les infos concernant ce plugin, aucun code clé en main pour l'exporter, et encore moins pour l'importer. Ne pas pouvoir extirper tout ce qu'un plugin a mis dans la base de données m'est donc apparu comme une grave lacune, je l'ai comblée pour Association mais avec un niveau de généralité tel qu'il m'a semblé que ça pouvait remplacer CFG, c'est pourquoi j'ai posé plusieurs questions sur des choses que je ne prenais pas en compte et dont on m'a répondu qu'elles n'étaient pas indispensables.

J'apprends maintenant que CFG ne rend pas service qu'aux plugins, et on me reproche de ne pas en tenir en compte. La première réponse qui me vient à l'esprit, c'est que les outils qui font tout et son contraire y compris le café sont impossibles à maintenir.
Je ne dis pas que ces usages devraient être interdits, mais je pose la question de savoir si c'est le même outil qui devrait les permettre. Mes interventions sur le noyau depuis qq mois consistent à complèter le gestionnaire de plugins qui s'y trouve déjà,
et la balise que j'ai introduite hier n'a jamais prétendu remplacer exactement CFG, mais plutôt offrir un service plus riche et mieux intégré dans les seuls cas où on l'utilise strictement en tant que configurateur de plugins. Il faudrait déjà savoir si tout le monde est d'accord sur un tel enrichissement du noyau, ou bien si là aussi chacun veut n'en faire qu'à sa tête et préfère que le noyau ne bouge pas. Peut-être suis-je trop pessimiste sur le fait que ce que je propose pourrait à peu de frais finir quand même par remplacer tout CFG, mais c'est une question technique qui a priori n'a pas à influer sur cette question de spécification.

Pour finir sur la question des tables des meta, le code de migration est du même ordre de difficulté que la migration des vieilles tables articles_doc, rub_doc etc, réunies en une seule table doc_objet par une mise à jour automatique; il a toujours été clair pour moi qu'il faudrait proposer ce code de migration plutôt que de laisser chacun l'écrire, il me semble d'ailleurs l'avoir dit. Je ne comprends donc pas ton objection là-dessus.

Une autre point de spécification qui me trouble, est qu'il ne faudrait pas faire apparaître le nom du plugin (ou son préfixe) dans la recherche des formulaires. Si j'ai bien compris, ça veut dire qu'un formulaire nommé X dans le plugin A pourrait être surchargé par un formulaire homonyme dans le plugin B ? Si c'est ça, je ne suis pas sûr que ça n'amène pas des situations où cette surcharge serait non désirée (et incompréhensible) et ça semble dire que tout développeur de plugin doit s'assurer qu'il ne prend pas un nom déjà pris par un autre plugin. J'aimerais des éclaircissements.

Ensuite, sur l'ambiguité dans l'utilisation d'un squelette par plusieurs balises, ça critique implicitement #ACTION_FORMULAIRE qui m'a toujours paru regrettable: c'est au compilateur d'insérer ce code, ce n'est pas à l'auteur du squelette d'utiliser cette incation magique à laquelle il ne comprend rien. Ajouté au fait que cette séquence de compil est bourrée de redondances (on teste la présence du squelette puis on appelle recuperer_fond qui refait un find_in_path via public_parametrer), on ferait bien mieux d'appeler directement le couple compilateur-cache sur ce squelette, enrichi dynamiquement du ACTION_FORMULAIRE sur les bons arguments (selon qu'on est en contexte CVT ou contexte Configurer).

Donc de nouveau, réfléchir en amont sur les raisons de l'existant me paraît la première chose à faire.

Committo,Ergo:Sum

...
J'ai l'impression en particulier que la question de tables de méta séparées est vue par toi comme un choix d'implémentation,
alors que pour moi c'est un choix de spécification, c'est même LE choix qui m'a convaincu de l'importance d'une alternative à CFG.

Quand j'ai repris le plugin Association, j'ai demandé à ses concepteeurs de me fournir un jeu de test en vraie grandeur. Et là patatras: me fournir un dump SQL des tables du plugin, pas trop de pbs, mais extraire de spip_meta les infos concernant ce plugin, aucun code clé en main pour l'exporter, et encore moins pour l'importer. Ne pas pouvoir extirper tout ce qu'un plugin a mis dans la base de données m'est donc apparu comme une grave lacune, je l'ai comblée pour Association mais avec un niveau de généralité tel qu'il m'a semblé que ça pouvait remplacer CFG, c'est pourquoi j'ai posé plusieurs questions sur des choses que je ne prenais pas en compte et dont on m'a répondu qu'elles n'étaient pas indispensables.

Sur ce point là, je comprends tout à fait le besoin propre à Association, et je ne le remets pas en cause. Je pense que c'est un plus de pouvoir stocker dans une table des meta dédiée pour ce type de plugin.
En revanche, ce que je conteste c'est que cela corresponde au besoin général et au fonctionnement par défaut.

Lorsque je configure le plugin comments pour indiquer que sur mon site je veux limiter la longueur de mes messages à 1000 signes et utiliser un forum à plat, ça n'a pas d'intérêt ni de sens en tant que configuration autonome à exporter indépendamment de mon site. La configuration est liée à mes contenus et mon squelette.

Lorsque je configure le plugin crayons pour indiquer que je veux activer les crayons dans mon espace privé, cela n'a de sens que rapporte à mon usage de mon espace privé.

Lorsque je configure le plugin autorité pour autoriser mes redacteurs à modifier leurs articles publiés, cela n'a de sens que dans le contexte de mes auteurs et de mes articles.

Lorsque je configure le plugin agenda pour activer les événements dans la rubrique 5, cela n'a de sens que dans le contexte du contenu de mon site et de son rubriquage

Lorsque je configure le plugin mediabox pour choisir une boite popin à fond noir sur mon site, cela n'a de sens que rapporté à l'habillage de mon site

Je pourrais citer encore beaucoup d'exemples, mais je pense que tu vois où je veux en venir.
Dans bien des cas (la plupart des cas ?) la configuration de la fonction n'a pas de sens en dehors du contexte où elle est faite, c'est à dire du site. Vouloir l'exporter indépendamment du reste des contenus parait incongru, et ne réponds absolument pas à un besoin.

On ne peut donc pas utiliser cet avantage présumé pour justifier d'une perte de fonction par ailleurs.

J'apprends maintenant que CFG ne rend pas service qu'aux plugins, et on me reproche de ne pas en tenir en compte. La première réponse qui me vient à l'esprit, c'est que les outils qui font tout et son contraire y compris le café sont impossibles à maintenir.

CFG est conçu pour faciliter l'écriture rapide et facile d'un formulaire de configuration, comme son nom l'indique. Il ne fait pas tout et son contraire. Il a des défauts, notamment un embonpoint résultant de sa capacité à stocker le résultat sous plein de formes différentes, mais dont seule la méthode meta serializee est utilisée en pratique.
Mais son périmètre fonctionnel est clair et bien défini.
Son travail se limite au formulaire de configuration et uniquement ça. Il ne gère aucune notion de famille de formulaire ou de plugin etc ...
Mais c'est aussi ce qui permet de l'utiliser pour écrire un formulaire de configuration dans un squelette qui n'est pas un plugin.

Je ne dis pas que ces usages devraient être interdits, mais je pose la question de savoir si c'est le même outil qui devrait les permettre. Mes interventions sur le noyau depuis qq mois consistent à complèter le gestionnaire de plugins qui s'y trouve déjà,
et la balise que j'ai introduite hier n'a jamais prétendu remplacer exactement CFG, mais plutôt offrir un service plus riche et mieux intégré dans les seuls cas où on l'utilise strictement en tant que configurateur de plugins.

Oui, voila. En fait, je pense que le malentendu vient de là.
Ce que tu proposes couvre un périmètre différent, avec une autre approche et une autre spécification fonctionnelle. Pour le coup on ne sait pas si cela correspond vraiment au besoin des développeurs, et par ailleurs cela ne remplace pas CFG, du coup.

Il faudrait déjà savoir si tout le monde est d'accord sur un tel enrichissement du noyau, ou bien si là aussi chacun veut n'en faire qu'à sa tête et préfère que le noyau ne bouge pas. Peut-être suis-je trop pessimiste sur le fait que ce que je propose pourrait à peu de frais finir quand même par remplacer tout CFG, mais c'est une question technique qui a priori n'a pas à influer sur cette question de spécification.

Pour finir sur la question des tables des meta, le code de migration est du même ordre de difficulté que la migration des vieilles tables articles_doc, rub_doc etc, réunies en une seule table doc_objet par une mise à jour automatique; il a toujours été clair pour moi qu'il faudrait proposer ce code de migration plutôt que de laisser chacun l'écrire, il me semble d'ailleurs l'avoir dit. Je ne comprends donc pas ton objection là-dessus.

Certes, mais même si on propose un code de migration, il reviendra quand même au développeur de plugin d'écrire les 3 lignes de php nécessaire à son appel, et en cela on rate l'objectif puisque les utilisateurs de CFG s'en servent justement pour ne pas écrire de php.

Une autre point de spécification qui me trouble, est qu'il ne faudrait pas faire apparaître le nom du plugin

Dans ton code, il y a un bug très précis qui est que tu référence explicitement le nom du dossier dans lequel est rangé le plugin. Si chez moi je checkout tout le dossier Association, et que le plugin est donc dans plugins/Association/Association_2.0, cela ne marche pas (le squelette du formulaire n'est pas trouvé)

(ou son préfixe) dans la recherche des formulaires. Si j'ai bien compris, ça veut dire qu'un formulaire nommé X dans le plugin A pourrait être surchargé par un formulaire homonyme dans le plugin B ? Si c'est ça, je ne suis pas sûr que ça n'amène pas des situations où cette surcharge serait non désirée (et incompréhensible) et ça semble dire que tout développeur de plugin doit s'assurer qu'il ne prend pas un nom déjà pris par un autre plugin. J'aimerais des éclaircissements.

Il me semble que c'est le lot de tous les formulaires de SPIP, comme tous les squelettes. La possibilité de surcharger est intrinsèque à l'utilisation des squelettes. Dans la pratique, la surcharge a plus lieu dans le dossier squelettes/. Cela correspond aux adaptations possibles par le webmestre pour coller à son besoin.

Ensuite, sur l'ambiguité dans l'utilisation d'un squelette par plusieurs balises, ça critique implicitement #ACTION_FORMULAIRE qui m'a toujours paru regrettable: c'est au compilateur d'insérer ce code, ce n'est pas à l'auteur du squelette d'utiliser cette incation magique à laquelle il ne comprend rien. Ajouté au fait que cette séquence de compil est bourrée de redondances (on teste la présence du squelette puis on appelle recuperer_fond qui refait un find_in_path via public_parametrer), on ferait bien mieux d'appeler directement le couple compilateur-cache sur ce squelette, enrichi dynamiquement du ACTION_FORMULAIRE sur les bons arguments (selon qu'on est en contexte CVT ou contexte Configurer).

On pourrait peut-être chercher à automatiser l'insertion de ces arguments ajoutés par la balise, avec les risque de complication quand un #FORMULAIRE_XX contient en fait des choses compliquées etc...
Mais je citais aussi le cas des pipelines, de la fonction charger() etc ... pour lesquelles on n'a pas, en l'état, une continuité de comportement entre les deux types d'appels d'un même squelette.

Cédric

Bonsoir et pardon à Commito à qui je n'ai pas toujours fait les retours désirés..

Je suis un peu surpris par cette phrase!

cedric.morin@yterium.com a écrit :

  
Certes, mais même si on propose un code de migration, il reviendra quand même au développeur de plugin d'écrire les 3 lignes de php nécessaire à son appel, et en cela on rate l'objectif puisque les utilisateurs de CFG s'en servent justement pour ne pas écrire de php.

Hum, si on développe un plugin, on peut écrire 3 lignes de php supplémentaires et avant CFG on le faisait bien, c'est pas mortel. Si CFG devient lourd à gérer, je pense que vous avez tout à suivre les idées de Commito car si Cedric cite une pelletée de plugins qui ne sont pas obligatoirement des séries serialisées dans metas, j'en connais plein d'autres qui le font ou qui le faisaient et qui malheureusement ont été presque ou totalement abandonné ( voir inscriptions 2 qui fut une merveille en 1.9 ) et tiens pendant qu'on y est pourquoi ne pas faire sauteur la balise #SESSION ???.. Il manque c'est certain des choses encore comme l'obligation de faire des logs sur les plugins mais là c'est un autre débat

Bernard

Une réflexion liée au sujet, mais plutôt complémentaire :

Puisqu'il était proposé de mettre le formulaire de configuration directement dans la page des plugins, serait-il envisageable de dire facilement et de manière plus générique via plugin.xml à quelle page on souhaite intégrer ce(s) formulaire(s) ?

Par exemple, on pourrait vouloir ajouter un formulaire à la page "configuration" et un autre à la page "config_fonctions".

En plus, si on utilise un nom de page qui n'existe pas, ça l'ajoute automatiquement au menu de configuration, par exemple les plugins NoSpam et Comments pourraient utiliser tous les deux le nom de page "config_comments", et donc se retrouver ensemble, ce qui serait intuitif pour l'utilisateur.

-Nicolas

cedric.morin@yterium.com a écrit :

Par ailleurs, je pense que si la table meta propre au plugin est légitime pour un gros plugin comme association qui contient sans doute beaucoup d'éléments de configuration, elle va conduire rapidement à une explosion du nombre de tables dans une base, avec parfois plus de tables de meta (presque vides) que de tables de contenu.

Très bonne remarque, je pense aussi que ça génèrerait rapidement une situation ingérable.
Par contre, je déteste aussi le stockage en tableau sérialisé car il complique beaucoup la lecture directe des valeurs en base quand on a un plugin qui foire et qu'on veut débugger.

Pourquoi ne pas ajouter une colonne "origine" ou "source" dans la table spip_metas, dont la valeur serait "core" pour les metas du core, et l'id du plugin pour les plugins qui y enregistrent leur config ?
Ca permettrait le tri, la lecture directe, et l'accès simple aux données par les plugins.

A bientôt
    Simon

cedric.morin@yterium.com a écrit :

Par ailleurs, je pense que si la table meta propre au plugin est
légitime pour un gros plugin comme association qui contient sans doute
beaucoup d'éléments de configuration, elle va conduire rapidement à
une explosion du nombre de tables dans une base, avec parfois plus de
tables de meta (presque vides) que de tables de contenu.

Très bonne remarque, je pense aussi que ça génèrerait rapidement une
situation ingérable.

Pour sur.

Par contre, je déteste aussi le stockage en tableau sérialisé car il
complique beaucoup la lecture directe des valeurs en base quand on a un
plugin qui foire et qu'on veut débugger.

Pourquoi ne pas ajouter une colonne "origine" ou "source" dans la table
spip_metas, dont la valeur serait "core" pour les metas du core, et l'id
du plugin pour les plugins qui y enregistrent leur config ?
Ca permettrait le tri, la lecture directe, et l'accès simple aux données
par les plugins.

Vu la lourdeur de la (dé)sérialisation j'ai du mal à croire que ça soit pour raison d'efficacité que cette solution est retenue.
C'est donc une question que je me pose aussi.

JLuc

Je sais que je me répète un peu et que peut-être je ne devrais pas mettre mon grain de sel dans vos cogitations, mais c'est ce que je disais hier, le sérialisation est une galère et une source d'ennuis pour le développeur de plugins. On ne sait pas forcement deserialiser proprement en php parce que c'est déjà un truc un peu vieux et pas facile à manier. Autant tout mettre dans un fichier txt en lecture/ecriture dans le /tmp/ de SPIP!

Bien entendu je prêche pour ma paroisse, mais je souhaite que mon idée soulève des questions et des solutions.. Sinon, pourquoi ne pas créer une nouvelle table plugins avec tout ce qu'il faut dedans en jointure directe?
Bernard

JLuc a écrit :

Je crois que cela a été retenu par le plugin CFG car cela permettait de ne pas modifier la structure de la table meta et de risquer d'engendrer des incompatibilités qui auraient pu en découler.

On peut tout à fait introduire la notion de "conteneur" dans la table meta. Actuellement CFG considère que le conteneur est une meta, et serialize tout dedans.
Mais on pourrait aussi avoir un champ conteneur dans la table elle même, qui permettrait d'éviter cette serialization moche, ou prefixer simplement les champs avec ce conteneur, ce qui permet de ne rien toucher à la table elle même.

Le fait est qu'il y a maintenant un existant et qu'il faut en tenir compte ; ce n'est pas comme si on partait d'une feuille blanche.

Par ailleurs, il faut que la migration présente un avantage et soit exempte de difficultés bloquantes pour les dev de plugins (à commencer par devoir écrire du PHP), car rien ne les obligera à migrer depuis un système qui marche et leur donne satisfaction.

Cédric

Yo,

Je sais que je me répète un peu et que peut-être je ne devrais pas mettre mon grain de sel dans vos cogitations, mais c’est ce que je disais hier, le sérialisation est une galère et une source d’ennuis pour le développeur de plugins. On ne sait pas forcement deserialiser proprement en php parce que c’est déjà un truc un peu vieux et pas facile à manier.

Je ne trouve pas tant que la serialisation soit un problème dans la gestion des metas mais plutôt le mélange des paramètres de config dans une seule table de meta.

Une discussion connexe a d’ailleurs déjà eu lieu en Avignon.

Le premier argument qui me parait licite dans la démarche d’Emmanuel est la séparation des metas du core (mais les extensions/, quel mauvais nom d’ailleurs, comment les considérer ?) et des extensions plugins, squelettes…
Ce mélange est d’autant plus embêtant amha que ces metas ne sont jamais néttoyées et restent éternellement dans la table même si le plugin n’est plus utilisé.

Donc une(des) table(s) séparée(s) à l’avantage de ne jamais polluer les paramètres du core. Pourquoi aussi ne pas nettoyer ces données en base comme on le fait dans n’importe quel plugin utilisant la base en proposant de surcroit un mécanisme d’import/export de ces paramètres. Cela permettrait de recharger les données exportées lors d’une prochaine réactivation du plugin.
Maintenant multiplier les tables n’est peut etre pas non plus la solution.

Autre besoin identifié lors d’Avignon est la possibilité d’associer des paramètres de configuration à des objets (cf KConf). Ceci milite pour une table diffente de metas tant dans son contenu que dans sa structure mais si on doit changer quoique ce soit dans cette approche cette idée serait à considérer.

Bien entendu, toutes ces idées demandent à considérer la migration des plugins et autres extensions existantes. Mais je trouve l’idée séduisante.

...
J'ai l'impression en particulier que la question de tables de méta séparées est vue par toi comme un choix d'implémentation,
alors que pour moi c'est un choix de spécification,

...

Dans bien des cas (la plupart des cas ?) la configuration de la fonction n'a pas de sens en dehors du contexte où elle est faite, c'est à dire du site. Vouloir l'exporter indépendamment du reste des contenus parait incongru, et ne réponds absolument pas à un besoin.

On tourne au dialogue de sourds là-dessus car tu ne réponds pas à ce que j'ai déjà dit à ce sujet:
1. on peut convenir qu'on ne crée une table séparé que si plugin.xml le demande
2. le surcoût supposé de tables meta systématiques ne serait-il pas un prix raisonnable à la simplification du code ?

Tu instruits le procès de ces tables uniquement à charge. On peut se poser la question des perfs du cache d'une seule table énorme qui doit être entièrement refaite dès qu'une seule meta change qq part. A ce compte là on pourrait aussi dire que les modèles sont des trucs trop petits qui ralentissent l'assemblage de la page. Pourtant on l'a fait parce que la fonctionnalité valait le coup. Je ne comprends pas la partialité dont tu fais preuve là-dessus, ainsi que d'autres sur cette liste qui affirment sans argumentation que ce serait "ingérable" alors que pour moi c'est la situation actuelle qui l'est (cf. le pb de dump de plugin dont je ne cesse de parler, et l'argument d'Eric sur la persistance des métas de plugins inactifs).

CFG est conçu pour faciliter l'écriture rapide et facile d'un formulaire de configuration

...

Mais son périmètre fonctionnel est clair et bien défini.

Absolument pas. CFG se manifeste dans une page de l'espace privé qui s'appelle "admin_plugin", et il affiche un lien à côté d'un nom de plugin. Si le développeur de SPIP que je suis en a conclu faussement que ça sert à configurer un plugin, alors que parait-il ça sert aussi à configurer d'autres choses, le webmestre moyen il va tomber dans le panneau à tous les coup. Je note d'ailleurs que je n'ai toujours pas les éclaircissements que j'ai demandés sur ces autres configurations ("une fonctionnalité" et "un squelette" as-tu écrit) ce qui suggère que même ses utilisateurs les plus chevronnés ne savent pas définir clairement son périmètre.

Son travail se limite au formulaire de configuration et uniquement ça. Il ne gère aucune notion de famille de formulaire ou de plugin etc ...
Mais c'est aussi ce qui permet de l'utiliser pour écrire un formulaire de configuration dans un squelette qui n'est pas un plugin.

Ce que je comprends à présent de l'USAGE qui est fait de cette usine à gaz, c'est que ça permet d'enregistrer qq part les saisies d'un formulaire, formulaire qui n'est pas forcément destiné à configurer qqch. Si qq utilise une poële à frire comme si c'était un marteau c'est son droit, mais il n'a pas le droit de se plaindre que la nouvelle poële à frire qu'on lui propose enfonce moins bien les clous alors qu'elle cuit mieux et à moindre coût.

Ce que tu proposes couvre un périmètre différent, avec une autre approche et une autre spécification fonctionnelle.

Ce que je propose correspond à l'usage qui est suggéré par le nom "CFG" et la manière dont le noyau s'y interface.
Pour moi, rien que cette clarification est un progrès.

Dans ton code, il y a un bug très précis qui est que tu référence explicitement le nom du dossier dans lequel est rangé le plugin. Si chez moi je checkout tout le dossier Association, et que le plugin est donc dans plugins/Association/Association_2.0, cela ne marche pas (le squelette du formulaire n'est pas trouvé)

Un bug est un contradiction entre la spec et l'implémentation. Comme pour les tables, j'ai déjà dit que, si j'ai bien compris ce qu'est finalement la spec, il suffit d'enlever _DIR_plugin . $plugin dans le code. J'aimerais savoir si c'est suffisant où s'il y a encore un bout de spec que j'ignore.

Ensuite, sur l'ambiguité dans l'utilisation d'un squelette par plusieurs balises, ça critique implicitement #ACTION_FORMULAIRE qui m'a toujours paru regrettable: c'est au compilateur d'insérer ce code, ce n'est pas à l'auteur du squelette d'utiliser cette incation magique à laquelle il ne comprend rien. Ajouté au fait que cette séquence de compil est bourrée de redondances (on teste la présence du squelette puis on appelle recuperer_fond qui refait un find_in_path via public_parametrer), on ferait bien mieux d'appeler directement le couple compilateur-cache sur ce squelette, enrichi dynamiquement du ACTION_FORMULAIRE sur les bons arguments (selon qu'on est en contexte CVT ou contexte Configurer).

On pourrait peut-être chercher à automatiser l'insertion de ces arguments ajoutés par la balise, avec les risque de complication quand un #FORMULAIRE_XX contient en fait des choses compliquées etc...
Mais je citais aussi le cas des pipelines, de la fonction charger() etc ... pour lesquelles on n'a pas, en l'état, une continuité de comportement entre les deux types d'appels d'un même squelette.

Pour le trio de fonctions CVT, de nouveau je rappelle que mon dernier envoi fournit une solution pour _verifier dont je redemande si la généralisation aux deux autres ne suffirait pas à résoudre le tout. Pour les pipelines je n'ai pas regardé. A noter aussi que les choses sont déjà un peu boiteuses autour de ce code car le charger_fonction pour X_verifier, X_charger et X_traiter ne va pas seulement tester l'existence de X_verifier.php mais aussi celle de X.php.

Ma conclusion est que CFG une cacophonie dont la remise en cause fait inévitablement peur. Je peux comprendre cette peur, mais SVP ne tirez pas sur le pianiste qui essaye de trouver la tonalité dans laquelle on est censé jouer.

Committo,Ergo:Sum

* Committo,Ergo:sum tapuscrivait, le 14/06/2010 13:02:

CFG est conçu pour faciliter l'écriture rapide et facile d'un formulaire de configuration

....

Mais son périmètre fonctionnel est clair et bien défini.

Absolument pas. CFG se manifeste dans une page de l'espace privé qui s'appelle "admin_plugin", et il affiche un lien à côté d'un nom de plugin.. Si le développeur de SPIP que je suis en a conclu faussement que ça sert à configurer un plugin, alors que parait-il ça sert aussi à configurer d'autres choses, le webmestre moyen il va tomber dans le panneau à tous les coup. Je note d'ailleurs que je n'ai toujours pas les éclaircissements que j'ai demandés sur ces autres configurations ("une fonctionnalité" et "un squelette" as-tu écrit) ce qui suggère que même ses utilisateurs les plus chevronnés ne savent pas définir clairement son périmètre.

Pour ma part, il m'est arrivé dans un squelettes (sous forme de plugin) de surcharger un fond de CFG d'un autre plugin pour avoir d'autres valeurs de choix par défaut.
Et j'aurais très bien pu le faire aussi au niveau d'un squelette.
Et puis j'ai découvert la fonction ecrire_config :

(après être passé par une étape de ecrire_meta, un peu trop imprécise)

Ma conclusion est que CFG une cacophonie dont la remise en cause fait inévitablement peur. Je peux comprendre cette peur, mais SVP ne tirez pas sur le pianiste qui essaye de trouver la tonalité dans laquelle on est censé jouer.

Parmi les besoins pour lesquels CFG s'est avéré insuffisant, il y a :
- possibilité d'avoir un champ de CFG répété n fois, et stockant une paire : nom/valeur (à la place, j'utilise toujours un Groupe de mots clef dans lequel je crée des mots clefs et stocke la valeur dans le texte du mot ; cas d'usage : rendre administrable les <meta /> d'un site)
- possibilité de stoker une image et de l'effacer (actuellement, CFG ne permet que d'effacer une CFG complète, ce qui voudrait dire qu'il faudrait une CFG *par* image à stocker) (cas d'usage : bannière d'un site)

Ces 2 cas m'amènent à utiliser à la place des mots clefs.

Et pour la sauvegarde d'une meta (portant le même nom que la page de CFG), il y a le plugin Save_CFG (cas d'usage : import/export de configurations de couleurs d'un squelette).

Ici, faire un champ CFG séparé avec des : ou ; que tu pourait extraire avec des explode ne serait pas plus simple et mieux "techniquement" que les mots clés ?

* Prigent Yohann tapuscrivait, le 14/06/2010 13:47:

...
J'ai l'impression en particulier que la question de tables de méta séparées est vue par toi comme un choix d'implémentation,
alors que pour moi c'est un choix de spécification,

...

Dans bien des cas (la plupart des cas ?) la configuration de la fonction n'a pas de sens en dehors du contexte où elle est faite, c'est à dire du site. Vouloir l'exporter indépendamment du reste des contenus parait incongru, et ne réponds absolument pas à un besoin.

On tourne au dialogue de sourds là-dessus car tu ne réponds pas à ce que j'ai déjà dit à ce sujet:
1. on peut convenir qu'on ne crée une table séparé que si plugin.xml le demande

oui, c'est une possibilité, mais la question est de savoir si cette information doit être rattaché au plugin.xml (comme dans ta proposition) ou au formulaire (comme dans CFG)

2. le surcoût supposé de tables meta systématiques ne serait-il pas un prix raisonnable à la simplification du code ?

Tu instruits le procès de ces tables uniquement à charge.

Non, non. Je t'assure que je n'instruis pas à charge, uniquement du point de vue de l'utilisateur de CFG et des CVT

On peut se poser la question des perfs du cache d'une seule table énorme qui doit être entièrement refaite dès qu'une seule meta change qq part.

Sur ce point, je suis bien d'accord.
Il y a quelques meta qui bougent "souvent", et on se retrouve à invalider complètement toutes les metas, alors qu'en effet, tout ce qui est lié à de la configuration ne bouge qu'à la demande d'un utilisateur. J'ai pu le voir en particulier avec le plugin job_queue qui note dans une meta la date du prochain job à effectuer, et qui change très souvent en présence de plugins utilisant la queue.
Mais la dichotomie core/plugin n'est pas forcèment pertinente dans ce cas, ce serait plutot une dichotomie "meta configuration"/"meta dynamique" à instaurer. Cela peut être traité par une table séparée par plugin, comme tu le proposes, mais aussi par un flag sur les metas, et un double cache, par une table "configuration" distincte de la table "meta" etc ...

Je note que l'on sort du débat, et que l'on aborde d'autres arguments qui n'étaient pas évoqués initialement et ne sont pas directement liés à notre question.

A ce compte là on pourrait aussi dire que les modèles sont des trucs trop petits qui ralentissent l'assemblage de la page. Pourtant on l'a fait parce que la fonctionnalité valait le coup. Je ne comprends pas la partialité dont tu fais preuve là-dessus, ainsi que d'autres sur cette liste qui affirment sans argumentation que ce serait "ingérable" alors que pour moi c'est la situation actuelle qui l'est (cf. le pb de dump de plugin dont je ne cesse de parler, et l'argument d'Eric sur la persistance des métas de plugins inactifs).

Moi je ne dis pas que c'est ingérable. Je dis juste qu'il faut que le passage d'un système (CFG) à celui que tu proposes se fasse sans écriture de php ; nombre de ceux qui utilisent CFG le font parce qu'ils ne savent pas coder en php.
Pour le moment je ne vois pas comment obtenir cela en suivant le chemin que tu proposes, mais je suis preneur de la démonstration inverse.
Dans la mesure du possible, il faut aussi éviter d'avoir à réécrire les squelettes qui utilisent les valeurs configurées, et cela nécessite aussi de prendre en charge #CONFIG{truc/chose} a minima.

Ce que je défends, c'est que proposer un système qui ne prend pas cela en compte c'est perdre son temps car les utilisateurs de CFG ne feront pas l'effort de migrer, et on ne résoudra pas la question. Aussi belle soit la construction.

CFG est conçu pour faciliter l'écriture rapide et facile d'un formulaire de configuration

...

Mais son périmètre fonctionnel est clair et bien défini.

Absolument pas.

si, si. Je t'assure. CFG sert à faire des formulaires de configuration. Il n'y est nul part question de plugin.

CFG se manifeste dans une page de l'espace privé qui s'appelle "admin_plugin", et il affiche un lien à côté d'un nom de plugin.

Ce n'est pas une fonction de CFG proprement dit, mais le core qui a pris cette liberté de proposer ce raccourci en s'appuyant sur CFG.

Si le développeur de SPIP que je suis en a conclu faussement que ça sert à configurer un plugin, alors que parait-il ça sert aussi à configurer d'autres choses, le webmestre moyen il va tomber dans le panneau à tous les coup. Je note d'ailleurs que je n'ai toujours pas les éclaircissements que j'ai demandés sur ces autres configurations ("une fonctionnalité" et "un squelette" as-tu écrit)

Très concrètement, j'écris un squelette dans mon dossier squelettes/ avec des paramètres configurables dedans (largeur maxi des images, affichage de tel bloc, nombre d'articles sur la page de sommaire ...) qui sont appelées par #CONFIG{truc/largeur_maxi}, #CONFIG{truc/afficher_bloc} #CONFIG{truc/accueil_nombre_articles} ...
Et mon squelette contient un formulaire de configuration basé sur CFG, dans lequel l'admin peut aller pour modifier le comportement de son site public.
Il n'y a aucun plugin dans l'affaire.

Son travail se limite au formulaire de configuration et uniquement ça. Il ne gère aucune notion de famille de formulaire ou de plugin etc ...
Mais c'est aussi ce qui permet de l'utiliser pour écrire un formulaire de configuration dans un squelette qui n'est pas un plugin.

Ce que je comprends à présent de l'USAGE qui est fait de cette usine à gaz, c'est que ça permet d'enregistrer qq part les saisies d'un formulaire, formulaire qui n'est pas forcément destiné à configurer qqch.

Si. Ça configure mon squelette dans le cas évoqué ci-dessus. Ce n'est pas un usage détourné de CFG, mais le coeur de ce pour quoi il a été fait et il est utilisé.

Si qq utilise une poële à frire comme si c'était un marteau c'est son droit, mais il n'a pas le droit de se plaindre que la nouvelle poële à frire qu'on lui propose enfonce moins bien les clous alors qu'elle cuit mieux et à moindre coût.

certes, mais alors il ne faudra pas s'étonner qu'il continue à utiliser la poële initiale qui continuera de fait à exister...
Je pense qu'on touche là le fond du débat et de notre différence de point de vue.

Tu fais l'hypothèse que si la construction est plus belle, les utilisateurs peuvent bien faire un effort pour migrer, alors que je pense que les utilisateurs ne migreront que si le service rendu est comparable, voire meilleur si il y a un effort de migration à faire de leur part.
Entendons nous bien, je ne nie pas certains intérêts de ce que tu proposes, mais je pense qu'en l'état ça ne changera nullement l'usage et l'utilisation de CFG parce qu'il y a plus d'inconvénient à migrer qu'à continuer à utiliser CFG. Et que du coup la cible est manquée de ce point de vue.

Ce que tu proposes couvre un périmètre différent, avec une autre approche et une autre spécification fonctionnelle.

Ce que je propose correspond à l'usage qui est suggéré par le nom "CFG" et la manière dont le noyau s'y interface.

Ben non, je ne vois nul part le terme 'plugin' dans 'CFG'... CFG permet de faire un formulaire de configuration.
Le fait de considérer qu'un formulaire de configuration est forcément dans un plugin est bien un usage différent.

Pour moi, rien que cette clarification est un progrès.

une évolution, en tout cas.

Dans ton code, il y a un bug très précis qui est que tu référence explicitement le nom du dossier dans lequel est rangé le plugin. Si chez moi je checkout tout le dossier Association, et que le plugin est donc dans plugins/Association/Association_2.0, cela ne marche pas (le squelette du formulaire n'est pas trouvé)

Un bug est un contradiction entre la spec et l'implémentation. Comme pour les tables, j'ai déjà dit que, si j'ai bien compris ce qu'est finalement la spec, il suffit d'enlever _DIR_plugin . $plugin dans le code. J'aimerais savoir si c'est suffisant où s'il y a encore un bout de spec que j'ignore.

il me semble, oui, que c'est suffisant sur ce point.

Ensuite, sur l'ambiguité dans l'utilisation d'un squelette par plusieurs balises, ça critique implicitement #ACTION_FORMULAIRE qui m'a toujours paru regrettable: c'est au compilateur d'insérer ce code, ce n'est pas à l'auteur du squelette d'utiliser cette incation magique à laquelle il ne comprend rien. Ajouté au fait que cette séquence de compil est bourrée de redondances (on teste la présence du squelette puis on appelle recuperer_fond qui refait un find_in_path via public_parametrer), on ferait bien mieux d'appeler directement le couple compilateur-cache sur ce squelette, enrichi dynamiquement du ACTION_FORMULAIRE sur les bons arguments (selon qu'on est en contexte CVT ou contexte Configurer).

On pourrait peut-être chercher à automatiser l'insertion de ces arguments ajoutés par la balise, avec les risque de complication quand un #FORMULAIRE_XX contient en fait des choses compliquées etc...
Mais je citais aussi le cas des pipelines, de la fonction charger() etc ... pour lesquelles on n'a pas, en l'état, une continuité de comportement entre les deux types d'appels d'un même squelette.

Pour le trio de fonctions CVT, de nouveau je rappelle que mon dernier envoi fournit une solution pour _verifier dont je redemande si la généralisation aux deux autres ne suffirait pas à résoudre le tout. Pour les pipelines je n'ai pas regardé. A noter aussi que les choses sont déjà un peu boiteuses autour de ce code car le charger_fonction pour X_verifier, X_charger et X_traiter ne va pas seulement tester l'existence de X_verifier.php mais aussi celle de X.php.

Oui, on peut ré-écrire tous les appels aux fonctions c,v,t et aux pipelines correspondants pour tacher de retomber sur nos pieds. Au prix d'une redondance de code et des appels, qui découle logiquement de la redondance entre #FORMULAIRE_CONFIGURER_PLUGIN{xx,truc} et #FORMULAIRE_CONFIGURER_TRUC
Mais on retombe je crois sur la question du départ. Le formulaire de configuration doit il être forcément lié à un plugin ou non.

Cédric

Parmi les besoins pour lesquels CFG s'est avéré insuffisant, il y a :
- possibilité d'avoir un champ de CFG répété n fois, et stockant une paire : nom/valeur (à la place, j'utilise toujours un Groupe de mots clef dans lequel je crée des mots clefs et stocke la valeur dans le texte du mot ; cas d'usage : rendre administrable les <meta /> d'un site)

je ne vois pas ce qui t'empeche de faire des
<input name='truc' value='[(#ENV{truc}|table_valeur{0})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{1})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{2})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{3})]'>
...

- possibilité de stoker une image et de l'effacer (actuellement, CFG ne permet que d'effacer une CFG complète, ce qui voudrait dire qu'il faudrait une CFG *par* image à stocker) (cas d'usage : bannière d'un site)

moui, là on commence à sortir du générique que prétend couvrir CFG ...
Qui plus est, le débat est déjà de savoir ce qu'on garde ou pas de CFG, donc, implictement, ce qu'on perd...

Cédric

* cedric.morin@yterium.com tapuscrivait, le 14/06/2010 15:06:

Parmi les besoins pour lesquels CFG s'est avéré insuffisant, il y a :
- possibilité d'avoir un champ de CFG répété n fois, et stockant une paire : nom/valeur (à la place, j'utilise toujours un Groupe de mots clef dans lequel je crée des mots clefs et stocke la valeur dans le texte du mot ; cas d'usage : rendre administrable les<meta /> d'un site)

je ne vois pas ce qui t'empeche de faire des
<input name='truc' value='[(#ENV{truc}|table_valeur{0})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{1})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{2})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{3})]'>
....

Aurais-je oublié de préciser que le n de n fois n'était pas connu, et pouvait changer dans le temps.

- possibilité de stoker une image et de l'effacer (actuellement, CFG ne permet que d'effacer une CFG complète, ce qui voudrait dire qu'il faudrait une CFG *par* image à stocker) (cas d'usage : bannière d'un site)

moui, là on commence à sortir du générique que prétend couvrir CFG ...
Qui plus est, le débat est déjà de savoir ce qu'on garde ou pas de CFG, donc, implictement, ce qu'on perd...

Il me semblait que le débat était aussi de savoir de quoi on avait besoin, et ce qui contribuerait à améliorer l'existant.
CFG permet de joindre des images.
Il est lacunaire pour les supprimer.

Toujours sur l'existant, les CFG étant stokées dans spip_meta, cette table qui est chargée en permanence en mémoire peut avoir tendance à grossir.
Mais l'avantage de l'avoir en mémoire, c'est que #CONFIG ne fait pas d'accès en base...
... au prix d'une sérialisation/désérialisation parît-il coûteuse en performance PHP.

L'avantage immédiat que je vois à l'usage, soit de plusieurs tables de metas (une par formulaire/fonctionnalité/plugin ?), soit de metas distinctes et non sérialisées dans la table spip_meta, c'est de gagner en performance de sérialisation/déserialisation.
Par contre, avec plusieurs tables, qu'en serait-il des accès à la base de données ?
Et, est-ce que sur les hébergement limités en nombre de connexions à la base, ça ne poserait pas problème ?

On peut se poser la question des perfs du cache d'une seule table énorme qui doit être entièrement refaite dès qu'une seule meta change qq part.

Sur ce point, je suis bien d'accord.

...

Je note que l'on sort du débat, et que l'on aborde d'autres arguments qui n'étaient pas évoqués initialement et ne sont pas directement liés à notre question.

Bah oui, ça fait un moment que je dis que ce point est très secondaire, et je suis content de voir que tu reconnais que c'est même un pb finalement assez à part. Mon optique est toujours qu'en l'absence de mesures de perfs sérieuses, c'est la clarté qui doit primer.

Ce que je défends, c'est que proposer un système qui ne prend pas cela en compte c'est perdre son temps car les utilisateurs de CFG ne feront pas l'effort de migrer, et on ne résoudra pas la question. Aussi belle soit la construction.

J'en ai bien conscience et c'est pour cela que je répète que des outils de migration devront être fournis. Maintenant il est clair que, si le périmètre reste différent, ça ne pourra pas marcher à tous les coups. Du moment que le script est capable de le dire, c'est pas dramatique.

CFG est conçu pour faciliter l'écriture rapide et facile d'un formulaire de configuration

...

Mais son périmètre fonctionnel est clair et bien défini.

Absolument pas.

si, si. Je t'assure. CFG sert à faire des formulaires de configuration. Il n'y est nul part question de plugin.

..

Très concrètement, j'écris un squelette dans mon dossier squelettes/ avec des paramètres configurables dedans (largeur maxi des images,

...

Il n'y a aucun plugin dans l'affaire.

ok donc "configurer un squelette" ça veut dire permettre à son installateur de lui associer des valeurs par défaut qui seront en Hidden ou équivalents pour les utilisateurs futurs. Ca rejoint la problématique des squelettes article, rubrique etc qui dépendent des metas indiquant s'il y a des forums, des docs joints, des sites syndiqués, etc. Ces meta sont-elles seulement liées au squelette? Non, tous les scrips autour des articles les manipulent aussi et la difficulté de sortir par exemple les forums du noyau a été de retrouver dans le code toutes les implications de la présence des forums.

Alors je pose la question à l'envers: à partir du moment où il y un phénomène de "configuration", ne serait-il pas de bonne politique d'exiger que ça soit mis sous forme de plugin ?

Tu fais l'hypothèse que si la construction est plus belle, les utilisateurs peuvent bien faire un effort pour migrer

Pour moi ce travail est du même ordre que le serveur virtuel SQL: on met en place une interface plus propre permettant des choses inédites mais les vieux codes marchent encore. Les nouveaux venus prennent tout de suite la dernière spec, les anciens s'adpatent si les nouveautés les attirent, sinon ils tournent avec le vieux code. Je suis surpris de l'apreté de cette discussion alors qu'il n'y a pas d'incompatibilité de créée.

si j'ai bien compris ce qu'est finalement la spec, il suffit d'enlever _DIR_plugin . $plugin dans le code. J'aimerais savoir si c'est suffisant où s'il y a encore un bout de spec que j'ignore.

il me semble, oui, que c'est suffisant sur ce point.

ok, je vais changer ça.

Oui, on peut ré-écrire tous les appels aux fonctions c,v,t et aux pipelines correspondants pour tacher de retomber sur nos pieds. Au prix d'une redondance de code et des appels, qui découle logiquement de la redondance entre #FORMULAIRE_CONFIGURER_PLUGIN{xx,truc} et #FORMULAIRE_CONFIGURER_TRUC

Je vais réfléchir encore à tout ça. Ce que je retiens de ce point précis de la discussion c'est qu'il y a peut-être la possibilité de dispenser d'écrire la balise "ACTION_FORMULAIRE", ce qui serait une bonne nouvelle.

Committo,Ergo:Sum

* cedric.morin@yterium.com tapuscrivait, le 14/06/2010 15:06:

Parmi les besoins pour lesquels CFG s'est avéré insuffisant, il y a :
- possibilité d'avoir un champ de CFG répété n fois, et stockant une paire : nom/valeur (à la place, j'utilise toujours un Groupe de mots clef dans lequel je crée des mots clefs et stocke la valeur dans le texte du mot ; cas d'usage : rendre administrable les<meta /> d'un site)

je ne vois pas ce qui t'empeche de faire des
<input name='truc' value='[(#ENV{truc}|table_valeur{0})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{1})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{2})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{3})]'>
....

Aurais-je oublié de préciser que le n de n fois n'était pas connu, et pouvait changer dans le temps.

Oui, mais après il suffit de faire une boucle POUR, il me semble. En cela php n'apportera rien de plus.

- possibilité de stoker une image et de l'effacer (actuellement, CFG ne permet que d'effacer une CFG complète, ce qui voudrait dire qu'il faudrait une CFG *par* image à stocker) (cas d'usage : bannière d'un site)

moui, là on commence à sortir du générique que prétend couvrir CFG ...
Qui plus est, le débat est déjà de savoir ce qu'on garde ou pas de CFG, donc, implictement, ce qu'on perd...

Il me semblait que le débat était aussi de savoir de quoi on avait besoin, et ce qui contribuerait à améliorer l'existant.
CFG permet de joindre des images.
Il est lacunaire pour les supprimer.

Toujours sur l'existant, les CFG étant stokées dans spip_meta, cette table qui est chargée en permanence en mémoire peut avoir tendance à grossir.
Mais l'avantage de l'avoir en mémoire, c'est que #CONFIG ne fait pas d'accès en base...
... au prix d'une sérialisation/désérialisation parît-il coûteuse en performance PHP.

Du point de vue des performances, ce n'est pas tant la serialization elle même qui a un cout aujourd'hui, mais tout CFG qui est une grosse usine pour pouvoir gérer plein de stockages différents, mais dont seul ce mode est utilisé à ce jour.
Autrement dit, si déjà on supprime tout CFG au profit d'un accès rapide à la serialization/deserialization, on aura gagné beaucoup.
Après, en effet, il faut gérer un cache meta par table meta etc ... mais c'est deja le cas de ce qu'a implémenté Emmanuel, donc cela ne change rien de ce point de vue que l'on travaille avec une table, 2 tables ou N tables meta (a condition d'étendre #CONFIG pour permettre l'accès à ces données, et de prévoir la migration etc)

Cédric

* cedric.morin@yterium.com tapuscrivait, le 14/06/2010 16:05:

* cedric.morin@yterium.com tapuscrivait, le 14/06/2010 15:06:

Parmi les besoins pour lesquels CFG s'est avéré insuffisant, il y a :
- possibilité d'avoir un champ de CFG répété n fois, et stockant une paire : nom/valeur (à la place, j'utilise toujours un Groupe de mots clef dans lequel je crée des mots clefs et stocke la valeur dans le texte du mot ; cas d'usage : rendre administrable les<meta /> d'un site)

je ne vois pas ce qui t'empeche de faire des
<input name='truc' value='[(#ENV{truc}|table_valeur{0})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{1})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{2})]'>
<input name='truc' value='[(#ENV{truc}|table_valeur{3})]'>
....

Aurais-je oublié de préciser que le n de n fois n'était pas connu, et pouvait changer dans le temps.

Oui, mais après il suffit de faire une boucle POUR, il me semble. En cela php n'apportera rien de plus.

Tiens, je m'y attendais à POUR... Qui se trouve justement dans ... Bonux :stuck_out_tongue_winking_eye:

Et si je veux supprimer l'indice 2 ?

- possibilité de stoker une image et de l'effacer (actuellement, CFG ne permet que d'effacer une CFG complète, ce qui voudrait dire qu'il faudrait une CFG *par* image à stocker) (cas d'usage : bannière d'un site)

moui, là on commence à sortir du générique que prétend couvrir CFG ...
Qui plus est, le débat est déjà de savoir ce qu'on garde ou pas de CFG, donc, implictement, ce qu'on perd...

Il me semblait que le débat était aussi de savoir de quoi on avait besoin, et ce qui contribuerait à améliorer l'existant.
CFG permet de joindre des images.
Il est lacunaire pour les supprimer.

Toujours sur l'existant, les CFG étant stokées dans spip_meta, cette table qui est chargée en permanence en mémoire peut avoir tendance à grossir.
Mais l'avantage de l'avoir en mémoire, c'est que #CONFIG ne fait pas d'accès en base...
... au prix d'une sérialisation/désérialisation parît-il coûteuse en performance PHP.

Du point de vue des performances, ce n'est pas tant la serialization elle même qui a un cout aujourd'hui, mais tout CFG qui est une grosse usine pour pouvoir gérer plein de stockages différents, mais dont seul ce mode est utilisé à ce jour.
Autrement dit, si déjà on supprime tout CFG au profit d'un accès rapide à la serialization/deserialization, on aura gagné beaucoup.
Après, en effet, il faut gérer un cache meta par table meta etc ... mais c'est deja le cas de ce qu'a implémenté Emmanuel, donc cela ne change rien de ce point de vue que l'on travaille avec une table, 2 tables ou N tables meta (a condition d'étendre #CONFIG pour permettre l'accès à ces données, et de prévoir la migration etc)

Merci pour ces éclaircissements.