Créer un bloc
Ce chapitre décrit le processus de création d’un bloc de teaser modifiable pour un site web Edge Delivery Services à l’aide de l’éditeur universel.
Le bloc, nommé teaser
, présente les éléments suivants :
-
Image : image visuellement attrayante.
-
Contenu texte :
- Titre : titre attrayant pour attirer l’attention.
- Corps de texte : contenu descriptif fournissant du contexte ou des détails, y compris des conditions générales facultatives.
- Bouton d’appel à l’action (CTA) : lien conçu pour inciter la personne à interagir et à s’engager davantage.
Le contenu du bloc teaser
est modifiable dans l’éditeur universel, ce qui garantit sa facilité d’utilisation et de réutilisation sur l’ensemble du site web.
Notez que le bloc teaser
est similaire au bloc hero
du modèle standard. Par conséquent, le bloc teaser
n’est destiné qu’à servir d’exemple simple pour illustrer des concepts de développement.
Créer une branche Git
Pour maintenir un workflow propre et organisé, créez une branche pour chaque tâche de développement spécifique. Cela permet d’éviter les problèmes de déploiement de code incomplet ou non testé en production.
- Commencez à partir de la branche principale : le fait de travailler avec le code de production le plus récent garantit une base solide.
- Récupérez les modifications à distance : la récupération des dernières mises à jour de GitHub garantit que le code le plus récent est disponible avant de commencer le développement.
- Exemple : après avoir fusionné des modifications de la branche
wknd-styles
dansmain
, récupérez les dernières mises à jour.
- Exemple : après avoir fusionné des modifications de la branche
- Créez une branche :
# ~/Code/aem-wknd-eds-ue
$ git fetch origin
$ git checkout -b teaser origin/main
Une fois la branche teaser
créée, vous êtes en mesure de commencer à développer le bloc de teaser.
Dossier de bloc
Créez un dossier nommé teaser
dans le répertoire blocks
du projet. Ce dossier contient les fichiers JSON, CSS et JavaScript du bloc, ce qui organise les fichiers du bloc en un seul emplacement :
# ~/Code/aem-wknd-eds-ue
/blocks/teaser
Le nom du dossier de blocs fait office d’identifiant du bloc et est utilisé pour référencer le bloc tout au long de son développement.
JSON de bloc
Le JSON de bloc définit trois aspects clés du bloc :
- Définition : enregistre le bloc en tant que composant modifiable dans l’éditeur universel, en le liant à un modèle de bloc et éventuellement à un filtre.
- Modèle : spécifie les champs de création du bloc et la manière dont ces champs sont rendus en tant que code HTML Edge Delivery Services sémantique.
- Filtre : configure les règles de filtrage pour limiter les conteneurs auxquels le bloc peut être ajouté via l’éditeur universel. La plupart des blocs ne sont pas des conteneurs, mais leurs identifiants sont ajoutés aux filtres d’autres blocs de conteneurs.
Créez un fichier à l’adresse /blocks/teaser/_teaser.json
avec la structure initiale suivante, dans l’ordre exact. Si les clés ne sont pas dans le bon ordre, elles risquent de ne pas se construire correctement.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nom de fichier de l’exemple de code ci-dessous."}
{
"definitions": [],
"models": [],
"filters": []
}
Modèle de bloc
Le modèle de bloc constitue une partie essentielle de la configuration du bloc, dans la mesure où il définit les éléments suivants :
-
L’expérience de création en définissant les champs disponibles pour modification.
-
Rendu des valeurs du champ en code HTML Edge Delivery Services.
Les modèles se voient attribuer un élément id
correspondant à la définition du bloc et incluent un tableau fields
pour spécifier les champs modifiables.
Chaque champ du tableau fields
comporte un objet JSON qui inclut les propriétés requises suivantes :
component
name
label
Pour obtenir la liste complète des propriétés, y compris les propriétés facultatives, consultez la documentation des champs de l’éditeur universel.
Conception de bloc
Le bloc de teaser comprend les éléments modifiables suivants :
-
Image : représente le contenu visuel du teaser.
-
Contenu texte : inclut le titre, le corps du texte et le bouton d’appel à l’action (CTA), et se trouve dans un rectangle blanc.
- Les titre et le corps de texte peuvent être créés dans le même éditeur de texte enrichi.
- Le bouton CTA peut être créé à partir d’un champ
text
pour le libellé et d’un champaem-content
pour le lien.
La conception du bloc de teaser est divisée en ces deux composants logiques (contenu d’image et de texte), ce qui garantit une expérience de création structurée et intuitive pour les utilisateurs et les utilisatrices.
Champs de bloc
Définissez les champs requis pour le bloc : image, texte secondaire de l’image, texte, libellé CTA et lien CTA.
Cet onglet illustre la manière correcte de modéliser le bloc de teaser.
Le teaser se compose de deux zones logiques : image et texte. Pour simplifier le code nécessaire à l’affichage du code HTML Edge Delivery Services en tant qu’expérience web souhaitée, le modèle de bloc doit refléter cette structure.
- Regroupez les éléments image et texte de remplacement d’image à l’aide de la réduction du champ.
- Regroupez les champs de contenu texte à l’aide des éléments regroupement d’éléments et réduction du champ pour le CTA.
Si vous ne connaissez pas les notions de réduction de champ, regroupement d’éléments ou inférence de type, consultez la documentation associée avant de continuer, car elles sont essentielles pour créer un modèle de bloc bien structuré.
Dans l’exemple ci-dessous :
- L’inférence de type est utilisée pour créer automatiquement un élément HTML
<img>
à partir du champimage
. La réduction du champ est utilisée avec les champsimage
etimageAlt
pour créer un élément HTML<img>
. L’attributsrc
est défini sur la valeur du champimage
, tandis que l’attributalt
est défini sur la valeur du champimageAlt
. textContent
est un nom de groupe utilisé pour classer les champs. Il doit être sémantique, mais peut désigner n’importe quel élément unique de ce bloc. Cela indique à l’éditeur universel de rendre tous les champs avec ce préfixe dans le même élément<div>
dans la sortie HTML finale.- La réduction du champ est également appliquée dans le groupe
textContent
pour l’appel à l’action (CTA). Le CTA est créé en tant que<a>
via une inférence de type. Le champcta
est utilisé pour définir l’attributhref
de l’élément<a>
et le champctaText
fournit le contenu textuel du lien dans les balises<a ...>
.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nom de fichier de l’exemple de code ci-dessous."}
code language-json |
---|
|
Ce modèle définit les entrées de création dans l’éditeur universel pour le bloc.
Le code HTML Edge Delivery Services obtenu pour ce bloc place l’image dans la première balise div et les champs textContent
de groupe d’éléments dans la seconde balise div.
code language-html |
---|
|
Comme illustré dans le chapitre suivant, cette structure HTML simplifie la mise en forme du bloc en tant qu’unité cohérente.
Pour comprendre les conséquences de l’absence d’utilisation de la réduction de champ et du regroupement d’éléments, consultez l’onglet Manière incorrecte ci-dessus.
Cet onglet illustre une manière sous-optimale de modélisation du bloc de teaser, et n’est qu’une juxtaposition à la manière correcte.
Il peut sembler tentant de définir chaque champ comme champ autonome dans le modèle de bloc sans utiliser la réduction du champ et le regroupement d’éléments. Cependant, cette omission complique la mise en forme du bloc en tant qu’unité cohérente.
Par exemple, le modèle de teaser peut être défini sans réduction du champ ni regroupement d’éléments comme suit :
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nom de fichier de l’exemple de code ci-dessous."}
code language-json |
---|
|
Le code HTML Edge Delivery Services pour le bloc effectue le rendu de la valeur de chaque champ dans un élément div
distinct, ce qui complique la compréhension du contenu, l’application du style et les ajustements de structure HTML pour obtenir la conception souhaitée.
code language-html |
---|
|
Chaque champ est isolé dans son propre div
, ce qui complique le style de l’image et du contenu textuel en tant qu’unités cohérentes. Il est possible d’obtenir la conception souhaitée avec effort et créativité, mais l’utilisation du regroupement des éléments pour regrouper les champs de contenu de texte et de la réduction du champ pour ajouter des valeurs créées en tant qu’attributs d’élément est plus simple, plus facile et sémantiquement correcte.
Consultez l’onglet Manière correcte ci-dessus pour savoir comment mieux modéliser le bloc de teaser.
Définition du bloc
La définition de bloc enregistre le bloc dans l’éditeur universel. Voici une répartition des propriétés JSON utilisées dans la définition de bloc :
definition.title
definition.id
filters
.definition.plugins.xwalk.page.resourceType
core/franklin/components/block/v#/block
.definition.plugins.xwalk.page.template.name
definition.plugins.xwalk.page.template.model
model
, qui contrôle les champs de création affichés pour le bloc dans l’éditeur universel. La valeur ici doit correspondre à une valeur model.id
.definition.plugins.xwalk.page.template.classes
class
de l’élément HTML du bloc. Cela permet d’avoir des variantes d’un même bloc. La valeur classes
peut être rendue modifiable en ajoutant un champ de classes au modèle du bloc.Voici un exemple JSON pour la définition de bloc :
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nom de fichier de l’exemple de code ci-dessous."}
{
"definitions": [{
"title": "Teaser",
"id": "teaser",
"plugins": {
"xwalk": {
"page": {
"resourceType": "core/franklin/components/block/v1/block",
"template": {
"name": "Teaser",
"model": "teaser",
"textContent_text": "<h2>Enter a title</h2><p>...and body text here!</p>",
"textContent_cta": "/",
"textContent_ctaText": "Click me!"
}
}
}
}
}],
"models": [... from previous section ...],
"filters": []
}
Dans cet exemple :
- Le bloc est nommé « Teaser » et utilise le modèle
teaser
qui détermine les champs disponibles pour modification dans l’éditeur universel. - Le bloc comprend le contenu par défaut du champ
textContent_text
, qui est une zone de texte enrichi pour le titre et le corps du texte, ainsi que des élémentstextContent_cta
ettextContent_ctaText
pour le lien et le libellé CTA (appel à l’action). Les noms des champs du modèle contenant le contenu initial correspondent aux noms des champs définis dans le tableau de champs du modèle de contenu.
Cette structure garantit que le bloc est configuré dans l’éditeur universel avec les champs, le modèle de contenu et le type de ressource appropriés pour le rendu.
Filtres de bloc
Le tableau de filters
du bloc définit, pour les blocs de conteneur, les autres blocs qui peuvent être ajoutés au conteneur. Les filtres définissent une liste d’identifiants de bloc (model.id
) qui peuvent être ajoutés au conteneur.
[/blocks/teaser/_teaser.json]{class="badge neutral" title="Nom de fichier de l’exemple de code ci-dessous."}
{
"definitions": [... populated from previous section ...],
"models": [... populated from previous section ...],
"filters": []
}
Le composant Teaser n’est pas un bloc de conteneur, ce qui signifie que vous ne pouvez pas y ajouter d’autres blocs. Par conséquent, son tableau filters
reste vide. Au lieu de cela, ajoutez l’identifiant du teaser à la liste de filtres du bloc de section, de sorte que le teaser puisse être ajouté à une section.
Les blocs fournis par Adobe, tels que le bloc de section, stockent les filtres dans le dossier models
du projet. Pour effectuer des réglages, recherchez le fichier JSON pour le bloc fourni par Adobe (par exemple, /models/_section.json
) et ajoutez l’identifiant du teaser (teaser
) à la liste des filtres. La configuration indique à l’éditeur universel que le composant Teaser peut être ajouté au bloc de conteneur de section.
[/models/_section.json]{class="badge neutral" title="Nom de fichier de l’exemple de code ci-dessous."}
{
"definitions": [],
"models": [],
"filters": [
{
"id": "section",
"components": [
"text",
"image",
"button",
"title",
"hero",
"cards",
"columns",
"fragment",
"teaser"
]
}
]
}
L’identifiant de définition de bloc de teaser teaser
est ajouté au tableau components
.
Appliquer lint à vos fichiers JSON
Veillez à appliquer lint fréquemment à vos modifications afin qu’elles soient claires et cohérentes. L’application fréquente de lint permet de détecter les problèmes tôt et réduit le temps de développement global. La commande npm run lint:js
applique également lint aux fichiers JSON et détecte toute erreur de syntaxe.
# ~/Code/aem-wknd-eds-ue
$ npm run lint:js
Créer le JSON de projet
Après la configuration des fichiers JSON du bloc (par exemple, blocks/teaser/_teaser.json
, models/_section.json
), ils sont automatiquement compilés dans les fichiers component-models.json
, component-definitions.json
et component-filters.json
du projet. Cette compilation est gérée automatiquement par un hook de pré-validation Husky inclus dans le modèle de projet AEM Boilerplate XWalk.
Les générations peuvent également être déclenchées manuellement ou par programmation à l’aide des scripts NPM de génération JSON du projet.
Déployer le JSON de bloc
Pour rendre le bloc disponible dans l’éditeur universel, le projet doit être validé et placé dans la branche d’un référentiel GitHub, dans ce cas la branche teaser
.
Le nom de branche exact qu’utilise l’éditeur universel peut être ajusté, par utilisateur ou utilisatrice, via l’URL de l’éditeur universel.
# ~/Code/aem-wknd-eds-ue
$ git add .
$ git commit -m "Add teaser block JSON files so it is available in Universal Editor"
# JSON files are compiled automatically and added to the commit via a husky precommit hook
$ git push origin teaser
Lorsque l’éditeur universel est ouvert avec le paramètre de requête ?ref=teaser
, le nouveau bloc teaser
apparaît dans la palette du bloc. Notez que le bloc n’a pas de style : il effectue le rendu des champs du bloc en tant que code HTML sémantique, stylisé uniquement via le CSS global.