Visuelle Inhaltsfragmente - Vorlagen visual-content-fragments-templates
In Adobe Experience Manager (AEM) as a Cloud Service können HTML-Vorlagen verwendet werden, um Inhaltsfragmente zu visualisieren und im HTML-Format bereitzustellen.
Mit HTML-Vorlagen können Sie steuern, wie Ihre Inhaltsfragmente angezeigt werden. Sie können HTML-Vorlagen in Ihrem Codeeditor erstellen und diese dann hochladen und Inhaltsfragmentmodellen in AEM zuweisen. Platzhalter für Inhalte mit Handlebars.js ermöglichen die Zuordnung der Vorlage zu Datentypen im Inhaltsfragmentmodell. Sobald eine Vorlage einem Modell zugewiesen wurde, kann sie mit jedem auf dem Modell basierenden Inhaltsfragment verwendet werden, um das Fragment zu visualisieren oder als modulares Erlebnis im HTML-Format für jeden Kanal bereitzustellen, z. B. Web, E-Mail, Mobile App oder andere.
In diesem Artikel wird erläutert, wie Sie benutzerdefinierte HTML-Vorlagen mit Handlebars-Syntax zum Rendern visueller Inhaltsfragmente erstellen.
Nach dem Erstellen der Vorlagen haben Sie folgende Möglichkeiten:
Was Sie lernen werden what-you-will-learn
Nach einer (sehr kurzen) Einführung in:
- Verwenden Ihrer Vorlagen in AEM
- Verwenden der Veröffentlichungs-URL
Auf dieser Seite wird Folgendes behandelt (detaillierter):
- Handlebars - die erforderlichen Grundlagen der Syntax
- Zugreifen auf Inhaltsfragmentdaten
- Arbeiten mit verschachtelten Inhaltsfragmenten
- Umgang mit Feldern mit mehreren Werten
- Erstellen von Schleifen und bedingter Logik
- Best Practices für den Vorlagenentwurf für Inhaltsfragmente
Voraussetzungen prerequisites
Um die hier behandelten Technologien zu verstehen und mit ihnen zu arbeiten, benötigen Sie Folgendes:
- Grundlegende Informationen zu HTML
- Vertrautheit mit AEM-Inhaltsfragmenten und Inhaltsfragmentmodellen
- Grundlegendes zu Ihren Inhaltsfragmentmodellen
Verwenden einer HTML-Vorlage für Inhaltsfragmente using-a-content-fragment-html-template
Verwenden einer HTML-Vorlage für Inhaltsfragmente in AEM using-a-content-fragment-html-template-in-aem
Weitere Informationen zur Verwendung Ihrer Vorlage in AEM finden Sie unter:
Verwenden der Veröffentlichungs-URL für visuelle Inhaltsfragmente using-the-visual-content-fragment-publish-url
Nachdem Sie visuelle Inhaltsfragmente mithilfe der Vorlage erstellt haben, können Sie die Veröffentlichungs-URL Ihrer visuellen Inhaltsfragmente“ .
Handlebars - die (sehr) Grundlagen handlebars-the-very-basics
Handlebars ist eine einfache Vorlagensprache, die geschweifte Klammern ({{ }}) verwendet, um dynamische Inhalte in HTML einzufügen.
Grundlegende Syntax basic-syntax
Ein Beispiel für die grundlegende Handlebars-Syntax:
Wichtige Konzepte key-concepts
Die wichtigsten Konzepte von Handlebars:
{{ }}{{{ }}}{{! }}{{{ }}}) für Feldwerte, da Werte vorab in HTML gerendert werden.Kontextreferenz zur Vorlage template-context-reference
Wenn die Vorlage gerendert wird, erhält sie ein Kontextobjekt, das alle Daten zu Ihrem Inhaltsfragment enthält. Dies umfasst Folgendes:
-
Das ausgewählte Fragment
-
Alle weiteren Fragmente, auf die von diesem ausgewählten Fragment verwiesen wird
note NOTE Fragmente können referenziert werden: - in der Benutzeroberfläche: bis zur maximalen Tiefe von 5
- Bei Verwendung der API: Die Tiefe kann konfiguriert werden, bis zur maximalen Tiefe von 10
Inhaltsfragment content-fragment
Die Struktur des Kontextobjekts für das (ausgewählte) Inhaltsfragment:
fieldsallFields{name, value} für die IterationhasFieldstrue, ob das Fragment Felder enthältEigenschaftenstruktur properties-structure
Das properties-Objekt hat für das ausgewählte Fragment und für jedes referenzierte Fragment dieselbe Struktur.
idtitledescriptionpath/content/dam/...hasDescriptiontruecreatedDatemodifiedDatepublishedDatestatusDRAFTmodelid, path, name, technicalName, descriptionvalidationStatus{property, message}previewReplicationStatustagsid, title, titlePath, name, path, descriptionfieldTagstags.Beispiele: Vorlagenzugriff
Für das (ausgewählte) Inhaltsfragment:
Referenzierte Inhaltsfragmente referenced-content-fragments
Die Struktur des Kontextobjekts für alle referenzierten Fragmente:
hasReferencedFragmentstrue, wenn Verweise vorhanden sindreferencedFragmentsreferencesErrortrue, ob beim Laden von Verweisen ein Fehler aufgetreten istreferencesErrorMessagereferencesError true istFragmentstruktur, auf die verwiesen wird referenced-fragment-structure
Jedes Element in referencedFragments enthält:
anchorIdpropertieshasFieldsfieldsallFields{name, value} für die IterationBeispiele: Vorlagenzugriff für das erste referenzierte Inhaltsfragment (erstes Element in der 0-indizierten Liste):
Oder aus der Feldzuordnung:
Grundlegender Feldzugriff basic-field-access
Der direkte Feldzugriff wird empfohlen. Bei Bedarf können Sie alle Felder durchlaufen.
Direkter Feldzugriff (empfohlen) direct-field-access-recommended
Greifen Sie mithilfe der Feldzuordnung direkt nach Namen auf Felder zu:
Denken Sie daran:
- Verwenden Sie dreifache Klammern
{{{ }}}für Feldwerte, wenn sie vorab gerenderten HTML (Rich-Text) enthalten - Feldnamen (Titel, Untertitel, Beschreibung, primaryImage) müssen genau mit Ihrem Inhaltsfragmentmodell exakt
- Fehlende Felder werden nicht gerendert - es werden keine Fehler ausgegeben und die Handlebars-Syntax bleibt im gerenderten HTML-Fragment vorhanden (und sichtbar)
Iteration aller Felder iterate-through-all-fields
Verwenden Sie allFields, wenn Sie die Feldnamen nicht im Voraus kennen:
Denken Sie daran:
{{name}}verwendet doppelte geschweifte Klammern (Nur-Text-Beschriftung){{{value}}}verwendet dreifache geschweifte Klammern (vorab gerenderter HTML-Wert)
Verschachtelte Inhaltsfragmente nested-content-fragments
Wenn ein Inhaltsfragmentfeld auf ein anderes Inhaltsfragment verweist, können Sie Punktnotation verwenden, um direkt auf Felder im referenzierten Fragment zuzugreifen.
Verschachtelung auf einer Ebene single-level-nesting
Ein Beispiel für die Verschachtelung auf einer Ebene:
Muster: fields.referenceFieldName.nestedFieldName
Verschachtelung mehrerer Ebenen multi-level-nesting
Das System unterstützt eine unbegrenzte Verschachtelungstiefe:
Muster: fields.level1.level2.level3.fieldName (begrenzte Tiefe; Standard ist 5, kann auf 10 erweitert werden, wenn die API verwendet wird)
API-Parameteranforderung: Hydratation api-parameter-requirements
Um den Zugriff auf verschachtelte Inhaltsfragmente zu aktivieren, müssen Sie den hydration Abfrageparameter in Ihren API-Aufruf einbeziehen:
So aktivieren Sie die 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+Felder mit mehreren Werten multi-valued-fields
Es gibt mehrere Arten von Feldern mit mehreren Werten.
Textfelder mit mehreren Werten multi-valued-text-fields
Text, Zahl, Datum und andere einfache Felder werden bei mehreren Werten zu Arrays:
Denken Sie daran, beim Zugriff auf Array-Elemente nach Index in Handlebars:
- Verwenden Sie:
.[0](Punkt vor Klammer)
- Nicht:
[0]
Zahlenfelder mit mehreren Werten multi-valued-number-fields
Zahlen werden zur in umgewandelt:
Verweise auf Inhaltsfragmente mit mehreren Werten multi-valued-content-fragment-references
Wenn ein Feld auf mehrere Inhaltsfragmente verweist:
Verweise auf Assets mit mehreren Werten multi-valued-asset-references
Inhaltsreferenz Felder, die für Inhaltstypen konfiguriert sind, bei denen es sich um Assets handelt (z. B. Bilder und Dokumente), werden vorab als HTML gerendert. Assets mit mehreren Werten werden zu Arrays:
Verschachtelte Verweise mit mehreren Werten nested-multi-valued-references
Verweise mit mehreren Werten können Verweise mit mehreren Werten in jeder Tiefe enthalten:
Schleifen und Iteration loops-and-iteration
Handlebars stellt den {{#each}} Helper für die Iteration über Arrays und Objekte bereit.
Iteration über Arrays iterating-over-arrays
Beispiel für die Iteration über Arrays:
Spezielle Variablen in Schleifen special-variables-in-loops
Innerhalb {{#each}} Blöcke stellt Handlebars spezielle Variablen bereit:
Iteration über referenzierte Fragmente iterating-over-referenced-fragments
Ein Beispiel für die Iteration über referenzierte Fragmente:
Verschachtelte Schleifen nested-loops
Beispiel für verschachtelte Schleifen:
Bedingtes Rendering conditional-rendering
Verwenden Sie Bedingungen, um Inhalte je nach Verfügbarkeit der Daten ein- oder auszublenden.
Basic IF/Else basic-if-else
Beispiel für ein einfaches If-Else-Konstrukt:
Außer (negativ bedingt) unless-negative-conditional
Ein unless Helper:
Verschachtelte Bedingungen nested-conditials
Ein Beispiel für verschachtelte bedingte Regeln:
Integrierte Handlebars-Helfer built-in-handlebars-helpers
Handlebars umfasst mehrere integrierte Helper, die über {{#if}} und {{#each}} hinausgehen.
{{#if condition}}false, undefined, null, 0, "", []{{#unless condition}}#if){{#each array}}{{else}} für leere Arrays{{#with object}}{{lookup this "key"}}Mit Helper with-helper
Erstellt einen neuen Bereich für verschachtelte Objekte, um Präfixe für sich wiederholende Pfade zu reduzieren:
Erweiterte Muster advanced-patterns
Es folgen einige Beispiele für erweiterte Muster.
Zugreifen auf den übergeordneten Kontext in verschachtelten Schleifen accessing-parent-context-in-nested-loops
Verwenden Sie ../ , um innerhalb einer verschachtelten Schleife auf den übergeordneten Bereich zuzugreifen:
Dynamische CSS-Klassen dynamic-css-classes
Beispiel für dynamische CSS-Klassen:
Vollständige Beispiele complete-examples
Mehrere vollständige Beispiele sind als Referenz angegeben.
Blogpost mit Autor
Ein Blogpost mit Autorendetails:
Erforderlicher API-Aufruf:
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A1%7D
Allgemeine Tabellenansicht (keine Vorkenntnisse in Feldern) generic-table-view-no-prior-knowledge-of-fields
Eine allgemeine Tabellenansicht ohne inhärente Feldkenntnisse. Die ähnelt der Generische Vorlage:
Best Practices best-practices
Zu den Best Practices gehören:
-
Verwenden Sie immer dreifache Klammern für Feldwerte, die HTML-Markup-Inhalte enthalten.
-
Feldwerte werden in HTML vorab gerendert.
note NOTE Doppelte Klammern zeigen unformatierte HTML-Tags als Nur-Text-Text an.
code language-handlebars <!-- CORRECT --> {{{fields.description}}} <!-- WRONG - displays HTML tags as text --> {{fields.description}} -
-
Prüfen Sie das Vorhandensein, bevor Sie auf verschachtelte Felder zugreifen.
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> -
Verwenden Sie nach Möglichkeit den direkten Feldzugriff.
- Es ist leichter lesbar und verwaltbar als das Iterieren von
allFieldsund Übereinstimmungen mit dem Namen.
- Es ist leichter lesbar und verwaltbar als das Iterieren von
-
Strukturvorlagen mit Abschnittskommentaren.
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}} -
Verarbeiten Sie fehlende Daten mit Fallbacks.
code language-handlebars {{#if fields.title}} <h1>{{{fields.title}}}</h1> {{snippet-not-found:else}} <h1>Untitled</h1> {{/if}} -
Verwenden Sie immer eine ordnungsgemäße HTML-Dokumentstruktur.
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> -
Testen mit einer Vielzahl von Inhaltsszenarien:
- Alle Felder vollständig ausgefüllt
- Optionale Felder fehlen
- Leere Felder mit mehreren Werten
- Tiefe Verschachtelung (mehrere Ebenen)
- Verweise, die nicht geladen werden können
-
Verwenden semantischer HTML-Elemente:
- Verwenden Sie für eine bessere Barrierefreiheit
<article>,<header>,<main>,<footer>,<time>,<address>oder Ähnliches.
- Verwenden Sie für eine bessere Barrierefreiheit
-
Beibehalten von Stilen in CSS.
- Verwenden Sie
<style>Tags oder externe Stylesheets. - Inline-Stile sollten nach Möglichkeit vermieden werden.
- Verwenden Sie
-
Komplexe Logik von Dokumenten:
- Verwenden Sie Handlebars-Kommentare
({{! }}). - Verwenden Sie keine HTML-Kommentare, die in der gerenderten Ausgabe angezeigt werden.
- Verwenden Sie Handlebars-Kommentare
Fehlerbehebung troubleshooting
Einige Hinweise zur Fehlerbehebung:
<p>Hello World</p> wörtlich angezeigt{{{fields.description}}}{{{fields.author.name}}} ist leermaxDepth tief genug ist{{#each fields.tags}} verwenden, um alle Elemente zu iterieren{{{fields.tags[0]}}} wird leer dargestellt{{{fields.tags.[0]}}}hasReferencedFragments ist immer „false“?hydration=%7B%22enabled%22%3Atrue%7D; auch {{#if referencesError}} überprüfen{{#if}} oder {{#each}} prüfen; Diagnoseausgabe hinzufügen: <pre>hasFields: {{hasFields}} | title: {{properties.title}}</pre>{{! comment }} anstelle von HTML <!-- comment -->{{#if fields.enabled}} ist immer wahr"false" ist in Handlebars wahr. Nur tatsächliche false, null, undefined, 0, "" und [] sind falsch.<, & anstelle von < angezeigt, &{{{fields.content}}}#each ist nicht definiert../ für übergeordneten Bereich verwenden: {{{../name}}}; ../../ für übergeordnete Elemente verwenden{{else}} in {{#each}} verwenden: {{#each fields.tags}}...{{else}}<p>No tags</p>{{/each}}Arbeiten mit Assets working-with-assets
Assets, auf die von Inhaltsfragmenten verwiesen wird, wird von AEM vorab als HTML gerendert. Daher sind dreifache Klammern für alle Asset-Verweise obligatorisch.
<img src="..." alt="..."><video><a href="...">Denken Sie daran:
- Verwenden Sie immer dreifache Klammern für Asset-Felder.
Bei Verwendung doppelter Klammern wird das generierte HTML-Tag mit Escape-Zeichen versehen und als Rohtext angezeigt, anstatt das Bild, Video oder den Link zu rendern.
Nutzung der Asset-Felder asset-field-usage
Beispiel für die Verwendung von Asset-Feldern:
Helper für benutzerdefinierte Vorlagen customer-template-helpers
Das System stellt benutzerdefinierte Handlebars-Helper zum Generieren von HTML-Elementen mit benutzerdefinierten HTML-Attributen bereit. Diese Helper geben Ihnen die Kontrolle über das generierte Markup und bewältigen gleichzeitig die Komplexität des Extrahierens von Quell-URLs aus vorgerenderten Inhalten.
Verfügbare Helper:
asset- Generiert<img>-Tags mit benutzerdefinierten Attributentext- Erzeugt<span>Tags, die Textinhalte mit benutzerdefinierten Attributen umschließen
asset Helper asset-helper
Syntax:
Denken Sie daran:
- Verwenden Sie mit dem Asset-Helper
{{{ }}}dreifache Klammern, keine doppelten Klammern!
Vier grundlegende Beispiele four-basic-examples
Vier grundlegende Beispiele sind:
Unterstützte Attribute supported-attributes
Sie können jedes gültige HTML-Attribut hinzufügen:
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;"Alt-Text überschreiben override-alt-text
Das alt-Attribut aus dem Originalbild kann überschrieben werden:
Komplexes Beispiel complex-example
Ein komplexes Beispiel:
Verwenden von mit Schleifen using-with-loops
Asset Helper in Schleifen:
text Helper text-helper
Der Text-Helper generiert einen <span> Tag, der Textinhalte mit benutzerdefinierten CSS-Klassen und HTML-Attributen umschließt. Nützlich für die Gestaltung einzelner Textfelder.
Syntax:
Denken Sie daran:
- Verwenden Sie dreifache Klammern
{{{ }}}mit dem Text Helper, keine doppelten Klammern!
Drei grundlegende Beispiele three-basic-examples
Drei grundlegende Beispiele sind:
Häufige Anwendungsfälle common-use-cases
Einige gängige Anwendungsfälle sind:
Mit Schleifen with-loops
Ein gängiges Anwendungsbeispiel für -Schleifen sind:
Helper - Attributvalidierung helpers-attribute-validation
Beide Helper validieren Attributnamen, bevor sie in die Ausgabe aufgenommen werden.
Gültige Attributnamen:
-
Muss mit einem Buchstaben beginnen (a-z, A-Z)
-
Darf nur Buchstaben, Ziffern, Bindestriche und Unterstriche enthalten; siehe Namenskonventionen
-
Ignorieren der Groß-/Kleinschreibung
-
Beispiel:
- Gültig:
class,id,data-value,aria-label,my_attr,dataIndex1
- Ungültig:
123-attr,-class,@special,$money
- Gültig:
Ungültige Attributnamen werden mit einer Warnung in den Protokollen im Hintergrund übersprungen:
Denken Sie daran:
- Überprüfen Sie die Serverprotokolle auf Warnungen zu „Blockierte ungültige Attributnamensformate“.
Vergleichen der direkten Ausgabe mit Helfern comparing-direct-output-to-helpers
Verwendung der {{{fields.xxx}}} für die direkte Ausgabe:
- Sie benötigen keinen benutzerdefinierten Stil
- Die Standardausgabe soll unverändert bleiben
- Das Feld enthält eine komplexe HTML, die Sie nicht ändern möchten
Wann Helper verwendet werden sollten:
- Sie müssen CSS-Klassen für die Formatierung hinzufügen
- Sie müssen benutzerdefinierte HTML-Attribute (
data-*,aria-*und andere) hinzufügen - Sie wünschen sich eine konsistente, kontrollierte HTML-Struktur
Vergleich:
Kurzübersicht quick-reference
Einige Kurzanleitungen werden als Referenz bereitgestellt.
Kontextvariablen context-variables
Die Kontextvariablen:
Feldzugriff field-access
Zugriff auf Felder:
Kontrollfluss control-flow
Der Kontrollfluss:
Schleifenvariablen loop-variables
Die Schleifenvariablen:
Helper für benutzerdefinierte Vorlagen custom-template-helpers
Die benutzerdefinierten Vorlagen-Helper:
Zusätzliche Ressourcen additional-resources
Zusätzliche Ressourcen sind verfügbar: