[SPIP Zone] r106438 - in _plugins_/n-core/trunk

Le 26/09/2017 à 20:32, spip-zone-commit@rezo.net a
écrit :

Ajout d'une fonction API noisette pour vider les noisettes d'un squelette et modification en conséquence du service destocker.

Hello,

cet été je n'ai rien regardé du code, donc je ne sais pas encore trop où
ça en est, mais de temps en temps je lis les commits, et du coup
questionnement…

Là par exemple, je ne vois pas du tout ce que signifie "vider les
noisettes d'un squelette" en ce qui concerne spéciquement n-core, c'est
à dire l'API générique.

Car oui, le Noizetier (le gros truc), il gère un concept de noisettes
(les instances hein) dans des "squelettes"… et encore, c'est bien plus
précis que ça puisque le Noizetier gère des noisettes dans des
squelettes + dans des compositions + dans des objets précis (sur la
rubrique 1234). Tout ça c'est plusieurs "contextes", pas UN squelette
(pas juste page=rubrique quoi).

Quant aux autres utilisations possible de n-core, autre que le
Noizetier, bah ça peut être totalement autre chose que "des noisettes
dans un squelette" (ce qui n'est déjà pas le cas pour le Noizetier comme
on vient de le voir). Par exemple pour un tableau de bord d'admin, ça
serait affiché sur l'URL exec=accueil, mais ça serait pas lié à un
squelette du tout : il y aurait les noisettes "par défaut" configurées
par le webmestre, et ensuite des noisettes "par utilisateurices", pas du
tout par squelettes.

Donc vraiment, je ne comprends pas ce que signifie cette fonction dans
n-core. En fait tout ce qui concerne le stockage, puisque ça dépend
complètement du contexte d'utilisation, qui est totalement propre au
plugin utilisateur. Déplacer une noisette dans un "tableau" d'API neutre
et abstrait là oui je pige : c'est ce que fait l'API de Saisies : on
compose une liste (possiblement arborescente) de Saisies dans un tableau
PHP. Et ça l'API de Saisies permet de manipuler plein de choses. Mais
ensuite il n'y a jamais de notions de comment c'est stocké/utilisé,
comme ici la notion de "squelettes" pour des noisettes.

Dans ma tête n-core c'est sensiblement le même principe : ça doit
permettre de lister ce qui est dispo pour telle utilisation (avec
l'histoire du préfixe par utilisation), et permettre de manipuler un
"tableau de noisettes" (possiblement arborescent tant qu'à faire !)
qu'ensuite chacun va stocker où il veut.

Faudrait vraiment se faire une session sur ça ou faire une discussion
sur la liste ou faire un projet sur contrib ou je ne sais quoi pour
continuer de cette conception.

--
RastaPopoulos

Hello,

Le 27/09/2017 à 09:31, Eric Lupinacci a écrit :

La notion de réceptacle est plus compliqué mais on associe pas des
noisettes à un auteur mais à un squelette pour un auteur donné.

Là faudrait regarder de plus prêt si l'API actuelle est suffisante ou si
il faudrait ajouter la prise en compte de l'auteur ou d'autres critères.

C'est là un des points où il me semble qu'on n'est pas raccord.

Déjà oui, il y a de multiples possibilité de "contextes", pas juste le
squelettes, pas juste la composition, pas juste l'objet/id_objet, et pas
juste l'id_auteur non plus… Ça peut parfaitement être encore d'autres
choses pour d'autres besoins.

Mais surtout, je pense que si : pour le dashboard, on associe bien un
tableau de bord à un auteur, et pas *du tout* à un squelette (en plus du
tableau de bord "par défaut", voire d'autres tableaux de bords "par
défaut par statut" : un par défaut pour les admins, un par défaut pour
les rédacs, etc).

Pour moi, pour les deux exemples concrets sur lesquels on se base pour
réfléchir, il ne s'agit pas du tout du même "sens" d'utilisation.

- Le sens, le but, du Noizetier c'est "composer ou personnaliser les
pages du site public" : et en ce sens *oui*, les "listes de noisettes"
du Noizetier sont à peu près associées à "un squelette". Mais ce n'est
déjà même pas sûr, puisque ça peut être associé à un squelette *pour*
telle composition uniquement, et surtout ça peut aussi être associé à
*un objet précis* ce qui n'a pas forcément à voir avec un squelette.
Quand je veux retrouver "les noisettes pour la rubrique 1234, je demande
les noisettes pour objet=rubrique et id_objet=1234, je ne demande pas
*du tout* les noisettes pour le squelette page=truc ou squelette=truc !

- Le sens, le but, du Dashboard, ça serait de "composer un tableau de
bord par défaut, et permettre à chaque utilisateur de personnaliser le
sien". Et c'est tout ! À aucun moment ce n'est lié à un squelette
précis. Le fait est que ce sera très sûrement *appelé* sur la page
exec=accueil, mais ça pourrait l'être sur la page exec=dashboard, ça ne
changerait rien du tout au sens, au concept du plugin, qui n'a aucun
rapport avec un squelette précis.

Déjà avec ces deux exemples on voit que le sens n'est pas le même, et je
suppose qu'on peut trouver d'autres utilisations encore différentes, pas
non plus spécialement liées à un squelette.

--
RastaPopoulos

En tout les cas, merci d'avoir porté cette discussion sur la zone.
Ce projet m’intéresse beaucoup.

@Eric : il y a t'il moyen de partager ton doc de conception sur le Wiki de Contrib ?

Le 27/09/2017 à 10:44, RastaPopoulos a écrit :

Le 27/09/2017 à 09:31, Eric Lupinacci a écrit :

La notion de réceptacle est plus compliqué mais on associe pas des
noisettes à un auteur mais à un squelette pour un auteur donné.

Là faudrait regarder de plus prêt si l'API actuelle est suffisante ou si
il faudrait ajouter la prise en compte de l'auteur ou d'autres critères.

C'est là un des points où il me semble qu'on n'est pas raccord.

Déjà oui, il y a de multiples possibilité de "contextes", pas juste le
squelettes, pas juste la composition, pas juste l'objet/id_objet, et pas
juste l'id_auteur non plus… Ça peut parfaitement être encore d'autres
choses pour d'autres besoins.

Mais surtout, je pense que si : pour le dashboard, on associe bien un
tableau de bord à un auteur, et pas *du tout* à un squelette (en plus du
tableau de bord "par défaut", voire d'autres tableaux de bords "par
défaut par statut" : un par défaut pour les admins, un par défaut pour
les rédacs, etc).

Pour moi, pour les deux exemples concrets sur lesquels on se base pour
réfléchir, il ne s'agit pas du tout du même "sens" d'utilisation.

- Le sens, le but, du Noizetier c'est "composer ou personnaliser les
pages du site public" : et en ce sens *oui*, les "listes de noisettes"
du Noizetier sont à peu près associées à "un squelette". Mais ce n'est
déjà même pas sûr, puisque ça peut être associé à un squelette *pour*
telle composition uniquement, et surtout ça peut aussi être associé à
*un objet précis* ce qui n'a pas forcément à voir avec un squelette.
Quand je veux retrouver "les noisettes pour la rubrique 1234, je demande
les noisettes pour objet=rubrique et id_objet=1234, je ne demande pas
*du tout* les noisettes pour le squelette page=truc ou squelette=truc !

- Le sens, le but, du Dashboard, ça serait de "composer un tableau de
bord par défaut, et permettre à chaque utilisateur de personnaliser le
sien". Et c'est tout ! À aucun moment ce n'est lié à un squelette
précis. Le fait est que ce sera très sûrement *appelé* sur la page
exec=accueil, mais ça pourrait l'être sur la page exec=dashboard, ça ne
changerait rien du tout au sens, au concept du plugin, qui n'a aucun
rapport avec un squelette précis.

Déjà avec ces deux exemples on voit que le sens n'est pas le même, et je
suppose qu'on peut trouver d'autres utilisations encore différentes, pas
non plus spécialement liées à un squelette.

Re,

Hello,

Par contre, et là peut-être que l'on va tomber sur un autre désaccord, une
grappe est toujours composé d'un squelette et éventuellement d'autres
choses.

[…]

C'est là où je pense qu'on diverge maintenant.
Je pense que la "Grappe" identifie toujours à minima un squelette (pour
la compilation). Si cela n'est pas le cas, il faudrait une autre
indirection qui préciserait : telle grappe je la met dans telle
squelette. Là je ne vois pas l'intérêt.

Oui c'est bien ça la divergence, mais la liaison ne parait problématique
que si on part du principe que ça doit être lié. Moi je pars du principe
que tout n'a pas le même sens et la même utilisation que le noizetier
public et que donc non, on n'a pas forcément à lier telle contexte à tel
squelette.

Pour moi ce stockage ne faut que pour le Noizetier qui construit des
pages publiques, pas pour d'autres utilisations où l'appel à "la liste
des noisettes de tel cas/tel contexte" n'a pas du tout de lien
obligatoire avec un squelette.

Pour le Dashboard, chaque tableau de bord est celui d'un utilisateur,
point. Il n'y a pas spécialement de raison de le stocker ailleurs que
dans la table spip_auteurs, dans un champ dédié, dans un tableau
sérialisé. En ayant pour cela une norme unique décrivant une "liste de
noisettes" dans un tableau PHP, comme Saisies.

Ensuite le plugin va surcharger l'accueil (ou pas, ça peut être dans une
autre page), va récupérer le bon tableau de bord, et va faire en gros
<INCLURE{fond=inclure/noisettes_afficher, zone=content,
noisettes=#LE_TABLEAU}>

Je n'en ai pas parlé il me semble précédemment, mais c'est d'ailleurs
une des utilisations *déjà* actuelles parfois. Nous on en a beaucoup eu
besoin avec justement les "noisettes par objet", pas du tout en
utilisant Z-core et ses blocs-zones. Car on a fait des expositions
virtuelles qui ont des chapitres, des sous-chapitres, etc, et donc
c'était des rubriques et sous-rubriques, avec dans chacune des noisettes
pour ce chapitre. Et à la fin il n'y avait QU'UN unique squelette, celui
de la composition de la branche racine de l'exposition, et NOUS-MÊMES
dedans, on faisait les boucles de rubrique, et on intégrait le <INCLURE>
pour les noisettes de chaque rubrique (pour le bloc "content"
uniquement, on utilisait que ça).

C'est une utilisation hors Z, hors insertion automatique dans les
squelettes avec recuperer_fond, et c'est très récent, sur un SPIP 3.1,
et c'est indispensable de pouvoir continuer de faire ce genre de choses.

Le stockage des associations se fait donc sur la base du couple
(squelette, contexte) ce qui autorise toutes les libertés.

Ça a l'air vraiment bien et générique, je n'en doute pas du tout, et
peut-être même pas spécialement compliqué à utiliser.

Mais je vais redire la conversation pour IRC pour pas perdre : en
commençant à comprendre la direction dans laquelle ça va pour le moment,
et bien je me suis dit que ça me faisait penser à un état d'esprit
informaticien qui se dit "ah j'ai trouvé une super structure
über-générique" et qui ensuite essaye de faire tout rentrer dedans (ça
marche on peut le faire donc faut le faire).

À la base, quand j'imagine le noyau des noisettes, je ne vois pas de
stockage du tout, fut-il par défaut et optionnel. Aucune installation de
table (car ça peut parfaitement être autre part que des tables) :
uniquement une API (et si possible une interface mais dans un deuxième
temps).

Je le redis, mais pour moi c'est vraiment le même principe que Saisies :
- on doit pouvoir lister les types disponibles et leurs options
- on doit pouvoir générer du HTML à partir d'une description de noisette
(un type + un contexte correspondant aux options)
- on doit pouvoir générer du HTML à partir d'une LISTE de noisettes
(génération en masse de tout à partir d'une unique description commune)

Et donc pour ça utiliser le même principe d'un tableau qui décrit toute
la liste. Cela permet que ça vienne de n'importe où, d'une base ou d'une
génération à la volée autrement peu importe. Et ça permet beaucoup plus
facilement d'avoir alors des noisettes "conteneur" à l'infini, sans
jamais avoir à gérer de "id_parent" ou autre merde dans le genre (cf la
galère sur le stockage de Menus).

Par ailleurs, dans une même description, on peut parfaitement séparer et
avoir ensemble directement les différentes "zones". À la fin on a donc
UN unique tableau, qu'on peut stocker en une fois comme on veut, et
récupérer en une seule fois pareil, pour l'envoyer au squelette de
génération.

À aucun moment, même dans le Noizetier, on a besoin de récupérer UNE
noisette unique (une implémentation de noisette), en SQL, au niveau
utilisation finale, jamais. (C'est le cas pour l'interface de création,
qui permet dans une page séparée de configurer telle noisette ajoutée,
mais ça s'est fait dans l'autre sens, parce que justement c'était
stockée dans une ligne à part.)

array(
  'content' => array(
    array(
      'type' => 'noisettes/texte',
      'options' => array('option1'=>'oui', etc),
    ),
    array(
      'type' => 'noisettes/strate',
      'options' => array('option1'=>'oui', etc),
      'noisettes' => array(
        // des noisettes enfants !
      ),
    ),
  ),
  'aside' => array(
    …
  ),
)

Du coup il y a tout ce qu'il faut dedans. Dans Formidable ça permet de
stocker les formulaires complets dans UNE ligne : une par formulaire. À
aucun moment on a besoin de récupérer une saisie unique dans la base, on
veut toujours le formulaire complet.

Pour Menus c'est pareil, ça fait des années que dans ma todolist ya de
changer pour un tableau comme ça, et de stocker chaque menu dans UNE
ligne SQL par menu, car on veut toujours toute la description d'un menu
à la fois, jamais d'une entrée seulement.

Là pour les noisettes, ça permettrait pour le Noizetier, d'avoir une
ligne par contexte : (squelette=article | composition=truc |
noisettes=tableau complet) ou (objet=rubrique | id_objet=1234 |
noisettes=tableau complet)
Et pour d'autres utilisations ce tableau serait stocké ailleurs, pour le
Dashboard dans un unique champ "dashboard" de spip_auteurs par exemple :
strictement aucun besoin de stockage complexe avec plein de champs.

Bon… réveil dans 5h30 maintenant, peut-être dormir :smiley:

--
RastaPopoulos

Yo,