Fragments de contenu visuels - Modèles visual-content-fragments-templates
Dans Adobe Experience Manager (AEM) as a Cloud Service, les modèles HTML peuvent être utilisés pour visualiser les fragments de contenu et les diffuser au format HTML.
Les modèles HTML vous permettent de contrôler l’affichage de vos fragments de contenu. Vous pouvez créer des modèles HTML dans l’éditeur de code de votre choix, puis les charger et les affecter aux modèles de fragment de contenu dans AEM. Les espaces réservés de contenu utilisant Handlebars.js permettent de mapper le modèle aux types de données dans le modèle de fragment de contenu. Une fois affecté à un modèle, un modèle peut être utilisé avec n’importe quel fragment de contenu basé sur le modèle. Il permet de visualiser le fragment ou de le diffuser sous forme d’expérience modulaire au format HTML sur n’importe quel canal (web, e-mail, application mobile, etc.).
Cet article explique comment créer des modèles HTML personnalisés avec la syntaxe Handlebars pour le rendu des fragments de contenu visuel.
Après avoir créé vos modèles, vous pouvez :
Ce que vous apprendrez what-you-will-learn
Après avoir présenté (très rapidement) :
- Utilisation des modèles dans AEM
- Utilisation de l’URL de publication
Cette page aborde (plus en détail) les points suivants :
- Handlebars : principes de base de la syntaxe
- Accès aux données de fragment de contenu
- Utilisation de fragments de contenu imbriqués
- Gestion des champs à plusieurs valeurs
- Créer des boucles et une logique conditionnelle
- Bonnes pratiques de conception de modèles pour les fragments de contenu
Conditions préalables prerequisites
Pour comprendre et utiliser les technologies décrites ici, vous devez disposer des éléments suivants :
- Compréhension de base d’HTML
- Connaissance des fragments de contenu et des modèles de fragment de contenu AEM
- Compréhension de vos modèles de fragment de contenu
Utilisation d’un modèle HTML de fragment de contenu using-a-content-fragment-html-template
Utilisation d’un modèle HTML de fragment de contenu dans AEM using-a-content-fragment-html-template-in-aem
Pour plus d’informations sur l’utilisation de votre modèle dans AEM, voir :
Utilisation de l’URL de publication de fragment de contenu visuel using-the-visual-content-fragment-publish-url
Une fois que vous avez créé des fragments de contenu visuel à l’aide du modèle, vous pouvez utiliser l’URL Publication de vos fragments de contenu visuel.
Handlebars : principes de base (très) handlebars-the-very-basics
Handlebars est un langage de modèle simple qui utilise des accolades doubles (crochets) {{ }} pour insérer du contenu dynamique dans HTML.
Syntaxe de base basic-syntax
Exemple de syntaxe Handlebars de base :
Concepts clés key-concepts
Les concepts clés de Handlebars :
{{ }}{{{ }}}{{! }}{{{ }}}) pour les valeurs de champ, car les valeurs sont pré-rendues dans HTML.Référence du contexte du modèle template-context-reference
Lorsque votre modèle est rendu, il reçoit un objet de contexte contenant toutes les données sur votre fragment de contenu. Cela couvrira :
-
le fragment que vous avez sélectionné
-
tous les autres fragments référencés à partir de ce fragment sélectionné
note NOTE Les fragments peuvent être référencés : - dans l’interface utilisateur : jusqu’à la profondeur maximale de 5
- Lors de l’utilisation de l’API : la profondeur est configurable, jusqu’à la profondeur maximale de 10
Fragment de contenu content-fragment
Structure de l’objet contextuel pour le fragment de contenu (sélectionné) :
fieldsallFields{name, value} pour l’itérationhasFieldstrue si le fragment contient des champsStructure des propriétés properties-structure
L’objet properties présente la même structure pour le fragment sélectionné et pour chaque fragment référencé.
idtitledescriptionpath/content/dam/...hasDescriptiontruecreatedDatemodifiedDatepublishedDatestatusDRAFTmodelid, path, name, technicalName, descriptionvalidationStatus{property, message}previewReplicationStatustagsid, title, titlePath, name, path, descriptionfieldTagstags.Exemples : accès aux modèles
Pour le fragment de contenu (sélectionné) :
Fragments de contenu référencés referenced-content-fragments
Structure de l’objet de contexte pour tous les fragments référencés :
hasReferencedFragmentstrue lorsque des références existentreferencedFragmentsreferencesErrortrue si une erreur s’est produite lors du chargement des référencesreferencesErrorMessagetrue de la referencesErrorStructure de fragment référencé referenced-fragment-structure
Chaque élément de referencedFragments contient :
anchorIdpropertieshasFieldsfieldsallFields{name, value} pour l’itérationExemples : accès au modèle pour le premier fragment de contenu référencé (premier élément de la liste indexée sur 0) :
Ou à partir du mappage des champs :
Accès aux champs de base basic-field-access
L’accès direct aux champs est recommandé. Si nécessaire, vous pouvez effectuer une itération sur tous les champs.
Accès direct aux champs (recommandé) direct-field-access-recommended
Accédez directement aux champs par nom à l’aide du mappage des champs :
Souvenez-vous :
- Utilisez des accolades triples
{{{ }}}pour les valeurs de champ si elles contiennent du code HTML prérendu (texte enrichi). - Les noms de champ (titre, sous-titre, description, primaryImage) doivent correspondre exactement à votre modèle de fragment de contenu exactement
- Les champs manquants ne sont pas rendus : aucune erreur n’est générée et la syntaxe Handlebars reste présente (et visible) dans le fragment HTML rendu
Itérer dans tous les champs iterate-through-all-fields
Utilisez allFields lorsque vous ne connaissez pas les noms des champs à l’avance :
Souvenez-vous :
{{name}}utilise des accolades doubles (libellé en texte brut){{{value}}}utilise des accolades triples (valeur HTML prérendue)
Fragments de contenu imbriqués nested-content-fragments
Lorsqu’un champ de fragment de contenu fait référence à un autre fragment de contenu, vous pouvez utiliser la notation par points pour accéder directement aux champs du fragment référencé.
Imbrication à un seul niveau single-level-nesting
Exemple d’imbrication à un seul niveau :
Modèle : fields.referenceFieldName.nestedFieldName
Imbrication à plusieurs niveaux multi-level-nesting
Le système prend en charge une profondeur d’imbrication illimitée :
Modèle : fields.level1.level2.level3.fieldName (profondeur limitée ; la valeur par défaut est 5, peut être étendue à 10 lors de l’utilisation de l’API)
Paramètre d’API requis : hydratation api-parameter-requirements
Pour activer l’accès aux fragments de contenu imbriqués, vous devez inclure le paramètre de requête hydration dans votre appel API :
Pour activer l’hydratation :
# Enable hydration with depth=2 for 2 levels of nesting
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A2%7D
maxDepth123+Champs à plusieurs valeurs multi-valued-fields
Il existe plusieurs types de champs à valeurs multiples.
Champs de texte à valeurs multiples multi-valued-text-fields
Le texte, le nombre la date et d’autres champs simples deviennent des tableaux lorsqu’ils comportent plusieurs valeurs :
N’oubliez pas, lors de l’accès aux éléments de tableau par index dans Handlebars :
- Utilisez :
.[0](point avant crochet)
- Pas :
[0]
Champs numériques à plusieurs valeurs multi-valued-number-fields
Les nombres sont convertis en chaînes pour le rendu :
Références à des fragments de contenu à plusieurs valeurs multi-valued-content-fragment-references
Lorsqu’un champ fait référence à plusieurs fragments de contenu :
Références de ressources à valeurs multiples multi-valued-asset-references
Les champs Référence de contenu configurés pour les types de contenu qui sont des ressources (par exemple, des images et des documents) sont prérendus sous la forme d’HTML. Les ressources à valeurs multiples deviennent des tableaux :
Références à plusieurs valeurs imbriquées nested-multi-valued-references
Les références à plusieurs valeurs peuvent contenir des références à plusieurs valeurs à n’importe quelle profondeur :
Boucles et itération loops-and-iteration
Handlebars fournit l’assistant {{#each}} pour effectuer une itération sur des tableaux et des objets.
Itération sur des tableaux iterating-over-arrays
Exemple d’itération sur des tableaux :
Variables spéciales dans les boucles special-variables-in-loops
Dans les blocs {{#each}}, Handlebars fournit des variables spéciales :
Itération sur des fragments référencés iterating-over-referenced-fragments
Exemple d’itération sur des fragments référencés :
Boucles imbriquées nested-loops
Exemple de boucles imbriquées :
Rendu conditionnel conditional-rendering
Utilisez des conditions pour afficher ou masquer le contenu en fonction de la disponibilité des données.
If/Else De Base basic-if-else
Exemple de concept if-else de base :
Sauf (condition négative) unless-negative-conditional
Un assistant unless :
Conditions imbriquées nested-conditials
Exemple de condition imbriquée :
Assistants Handlebars intégrés built-in-handlebars-helpers
Handlebars comprend plusieurs assistants intégrés, au-delà des {{#if}} et des {{#each}}.
{{#if condition}}false, undefined, null, 0, "", []{{#unless condition}}#if){{#each array}}{{else}} pour les tableaux vides.{{#with object}}{{lookup this "key"}}Avec le helper with-helper
Crée une portée pour les objets imbriqués afin de réduire les préfixes de chemin répétitifs :
Modèles avancés advanced-patterns
Voici quelques exemples de modèles avancés.
Accès au contexte parent dans les boucles imbriquées accessing-parent-context-in-nested-loops
Utilisez ../ pour accéder à la portée parente à partir d’une boucle imbriquée :
Classes CSS dynamiques dynamic-css-classes
Exemple de classes CSS dynamiques :
Exemples complets complete-examples
Plusieurs exemples complets sont fournis à titre de référence.
Billet de blog avec l’auteur
Un article de blog contenant des informations sur l’auteur :
Appel API requis :
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A1%7D
Vue de tableau générique (aucune connaissance préalable des champs) generic-table-view-no-prior-knowledge-of-fields
Une vue de tableau générique, sans connaissance inhérente des champs. Le est similaire au modèle générique :
Bonnes pratiques best-practices
Les bonnes pratiques incluent :
-
Utilisez toujours des accolades triples pour les valeurs de champ qui contiennent du contenu de balisage HTML.
-
Les valeurs des champs sont des HTML pré-rendues.
note NOTE Les accolades doubles affichent les balises HTML brutes sous forme de texte brut.
code language-handlebars <!-- CORRECT --> {{{fields.description}}} <!-- WRONG - displays HTML tags as text --> {{fields.description}} -
-
Vérifier l’existence avant d’accéder aux champs imbriqués.
code language-handlebars <!-- GOOD: check before accessing nested fields --> {{#if fields.author}} <p>By {{{fields.author.name}}}</p> {{/if}} <!-- RISKY: may render empty if author is not set --> <p>By {{{fields.author.name}}}</p> -
Utilisez un accès direct aux champs lorsque cela est possible.
- Elle est plus lisible et gérable que l’itération de
allFieldset la correspondance par nom.
- Elle est plus lisible et gérable que l’itération de
-
Structurer les modèles avec des commentaires de section.
code language-handlebars {{! ===== HEADER SECTION ===== }} <header> <h1>{{properties.title}}</h1> </header> {{! ===== MAIN CONTENT ===== }} <main> {{#if hasFields}} <!-- fields rendering --> {{/if}} </main> {{! ===== REFERENCES ===== }} {{#if hasReferencedFragments}} <!-- references rendering --> {{/if}} -
Gérez les données manquantes avec élégance et avec des solutions de secours.
code language-handlebars {{#if fields.title}} <h1>{{{fields.title}}}</h1> {{snippet-not-found:else}} <h1>Untitled</h1> {{/if}} -
Utilisez toujours une structure de document HTML appropriée.
code language-handlebars <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{properties.title}}</title> </head> <body> <!-- your content here --> </body> </html> -
Testez avec divers scénarios de contenu :
- Tous les champs sont entièrement renseignés
- Champs facultatifs manquants
- Champs à plusieurs valeurs vides
- Imbrication profonde (plusieurs niveaux)
- Références dont le chargement échoue
-
Utiliser des éléments sémantiques d’HTML :
- Pour une meilleure accessibilité, utilisez
<article>,<header>,<main>,<footer>,<time>,<address>ou toute autre méthode similaire.
- Pour une meilleure accessibilité, utilisez
-
Conserver les styles dans CSS.
- Utilisez des balises
<style>ou des feuilles de style externes. - Évitez autant que possible les styles intégrés.
- Utilisez des balises
-
Logique complexe du document :
- Utilisez les commentaires Handlebars
({{! }}). - N’utilisez pas les commentaires HTML qui apparaissent dans la sortie rendue.
- Utilisez les commentaires Handlebars
Résolution des problèmes troubleshooting
Voici quelques conseils de dépannage :
<p>Hello World</p> affiché littéralement{{{fields.description}}}{{{fields.author.name}}} est videmaxDepth est suffisamment profonde{{#each fields.tags}} pour itérer tous les éléments{{{fields.tags[0]}}} rend vide{{{fields.tags.[0]}}}hasReferencedFragments est toujours faux?hydration=%7B%22enabled%22%3Atrue%7D; également vérifier {{#if referencesError}}{{#if}} ou {{#each}} non fermés ; ajouter une sortie de diagnostic : <pre>hasFields: {{hasFields}} | title: {{properties.title}}</pre>{{! comment }} lieu de <!-- comment --> HTML{{#if fields.enabled}} est toujours vrai"false" est vraie dans Handlebars. Seuls les false, null, undefined, 0, "" et [] réels sont faux.<, & affiché au lieu de <, &{{{fields.content}}}#each parent est indéfinie../ pour la portée parente : {{{../name}}} ; utiliser ../../ pour les grands-parents{{else}} à l’intérieur des {{#each}} : {{#each fields.tags}}...{{else}}<p>No tags</p>{{/each}}Utilisation des ressources working-with-assets
Assets référencé à partir des fragments de contenu est prérendu en tant qu’HTML par AEM. Par conséquent, les accolades triples sont obligatoires pour toutes les références de ressources.
<img src="..." alt="..."><video><a href="..."> le lienSouvenez-vous :
- Utilisez toujours des accolades triples pour les champs de ressource.
L’utilisation de doubles accolades permet d’échapper la balise HTML générée et de l’afficher en tant que texte brut plutôt que d’effectuer le rendu de l’image, de la vidéo ou du lien.
Utilisation des champs des ressources asset-field-usage
Exemple d’utilisation des champs de ressource :
Assistants de modèles personnalisés customer-template-helpers
Le système fournit des assistants Handlebars personnalisés pour générer des éléments HTML avec des attributs HTML personnalisés. Ces assistants vous permettent de contrôler les balises générées, tout en gérant la complexité de l’extraction des URL sources du contenu prérendu.
Assistants disponibles :
asset- Génère des balises<img>avec des attributs personnaliséstext- Génère des balises<span>qui encapsulent le contenu textuel avec des attributs personnalisés
assistant asset asset-helper
Syntaxe :
Souvenez-vous :
- Utilisez des accolades triples
{{{ }}}avec l’assistant de ressources, et non des accolades doubles !
Quatre exemples de base four-basic-examples
Voici quatre exemples de base :
Attributs pris en charge supported-attributes
Vous pouvez ajouter n’importe quel attribut HTML valide :
classclass="my-class another-class"idid="unique-id"altalt="Custom alt text" (overrides existing alt)data-*data-index="1" data-type="hero"aria-*aria-label="Description" aria-hidden="true"widthwidth="300"heightheight="200"loadingloading="lazy"stylestyle="border-radius: 8px;"Remplacer le texte de remplacement override-alt-text
L’attribut alt de l’image d’origine peut être remplacé :
Exemple complexe complex-example
Voici un exemple complexe :
Utilisation des boucles with using-with-loops
Asset helper dans les boucles :
assistant text text-helper
L’assistant de texte génère une balise <span> enveloppant le contenu textuel avec des classes CSS et des attributs HTML personnalisés. Utile pour mettre en forme des champs de texte individuels.
Syntaxe :
Souvenez-vous :
- Utilisez des accolades triples
{{{ }}}avec l’assistant de texte, et non des accolades doubles !
Trois exemples de base three-basic-examples
Voici trois exemples de base :
Cas d’utilisation courants common-use-cases
Voici quelques cas d’utilisation courants :
Avec des boucles with-loops
Un cas d’utilisation courant avec des boucles comprend :
Helpers - Validation des attributs helpers-attribute-validation
Les deux assistants valident les noms d’attribut avant de les inclure dans la sortie.
Noms d’attributs valides :
-
Doit commencer par une lettre (a-z, A-Z)
-
Ne peut contenir que des lettres, des chiffres, des tirets et des traits de soulignement. Consultez la section Conventions de dénomination
-
Insensible à la casse
-
Par exemple :
- Valide :
class,id,data-value,aria-label,my_attr,dataIndex1
- Non valide :
123-attr,-class,@special,$money
- Valide :
Les noms d’attribut non valides sont silencieusement ignorés avec un avertissement dans les journaux :
Souvenez-vous :
- Recherchez dans les journaux du serveur les avertissements « Format de nom d’attribut non valide bloqué ».
Comparaison de la sortie directe aux assistants comparing-direct-output-to-helpers
Quand utiliser les {{{fields.xxx}}} de sortie directe :
- Vous n’avez pas besoin de définir de style personnalisé
- Vous souhaitez obtenir la sortie par défaut en l’état
- Le champ contient des HTML complexes que vous ne souhaitez pas modifier
Quand utiliser les assistants :
- Vous devez ajouter des classes CSS pour le style
- Vous devez ajouter des attributs HTML personnalisés (
data-*,aria-*et autres) - Vous souhaitez une structure HTML cohérente et contrôlée
Comparaison :
Référence rapide quick-reference
Certaines informations de référence rapide sont fournies à titre de référence.
Variables contextuelles context-variables
Les variables contextuelles :
Accès aux champs field-access
Accès aux champs :
Flux de contrôle control-flow
Le flux de contrôle :
Variables en boucle loop-variables
Les variables de boucle :
Assistants de modèles personnalisés custom-template-helpers
Les assistants de modèle personnalisé :
Ressources supplémentaires additional-resources
Des ressources supplémentaires sont disponibles :