Les modèles et les slots

Un modèle est une mise en page réutilisable. Ses blocs sont rangés dans BSPK_WEB_TEMPLATE, pas dans BSPK_WEB_CONTENT. Poser un modèle sur une page ne coûte qu'un seul bloc, de type model : la page ne copie pas les blocs du modèle, elle pointe vers eux.

C'est tout l'intérêt et toute la contrainte : modifiez le modèle, et chaque emplacement où il est posé change avec lui. Ce qu'un emplacement peut surcharger, c'est exactement ce que le modèle expose.

Deux sortes de slots

SorteCe qu'il ouvreDéclaré par
ZoneUne région du modèle que l'emplacement remplit avec ses propres blocsvt_SlotName sur le bloc du modèle
ValeurUne propriété d'un bloc, modifiable pour chaque emplacementvo_SlotExpose sur ce bloc

Une zone porte un nom, et elle est désignée par ce nom, jamais par un uuid : retravailler le modèle ne doit pas faire perdre ce que les emplacements y ont mis.

Slots de valeur : la règle de nommage

"vo_SlotExpose": { "vt_FieldLabel": true }

C'est un drapeau, rien de plus. Un slot est désigné par le bloc et la propriété, jamais par un nom inventé. L'emplacement range sa propre valeur sous :

vo_SlotValues["<block uuid>|<property>"]

La même idée existe en trois variantes :

ExpositionL'emplacement range sous
vo_SlotExpose — une propriété<uuid>|<property>
vo_SlotCssExpose — un chemin de style (target|breakpoint|variant|property)<uuid>|css|<ce chemin>
vo_SlotEventExpose — un type d'événementvo_SlotEvents

vo_SlotLabels contient le libellé affiché pour un slot, indexé par le nom du slot. S'il est vide, c'est le nom lui-même qui s'affiche.

Les événements s'ajoutent, ils ne remplacent pas

Exposer un type d'événement ne donne pas à l'emplacement le droit de modifier l'événement du modèle : celui-ci reste en lecture seule, toujours. Cela donne le droit d'en ajouter un du même type, qui s'exécute en plus.

L'interrupteur reste nécessaire, même s'il ne protège de rien contre l'écrasement : il définit une surface. Sans lui, n'importe quel emplacement pourrait accrocher n'importe quel comportement à n'importe quel bloc, et le modèle ne garantirait plus rien.

Ce qui ne peut pas être exposé

Le contenu d'un bloc text n'est pas exposable. C'est un widget autonome, avec son propre éditeur, et il n'a aucune propriété à transmettre.

Éditer un modèle : un troisième contexte

Ni une page, ni un gabarit d'administration : ce sont les blocs du modèle ouvert.

  • GG_IS_MODEL_EDITOR indique que l'éditeur est ouvert ;
  • GG_EDIT_CONTEXT nomme la table dans laquelle on écrit ;
  • GG_IN_MODEL_RENDER indique qu'un modèle est en train d'être rendu à l'intérieur d'une page.

L'éditeur de modèle est le contexte le plus exigeant : pas d'entrée de menu, pas de webDomainMenuUuid. Ce qui fonctionne là fonctionne partout, ce qui en fait le bon endroit pour tester un mécanisme.

Ses descendants se récupèrent de la même façon que partout ailleurs :

query("uuidKey = :1 or parentCollection % :2"; root; root)

Invariant utile : tant que vous travaillez dans un modèle, BSPK_WEB_CONTENT ne doit pas changer d'un seul octet. S'il change, quelque chose a écrit dans la mauvaise table.

Voir aussi