Frammenti di contenuto visivo - Modelli visual-content-fragments-templates
In Adobe Experience Manager (AEM) as a Cloud Service, è possibile utilizzare i modelli HTML per visualizzare i frammenti di contenuto e distribuirli in formato HTML.
I modelli di HTML consentono di controllare la modalità di visualizzazione dei frammenti di contenuto. Puoi creare modelli HTML nell’editor di codice desiderato, quindi caricarli e assegnarli a Modelli per frammenti di contenuto in AEM. I segnaposto di contenuto che utilizzano Handlebars.js consentono di mappare il modello ai tipi di dati nel modello per frammenti di contenuto. Una volta assegnato a un modello, un modello è disponibile per essere utilizzato con qualsiasi frammento di contenuto basato sul modello, per visualizzare il frammento o per distribuirlo come esperienza modulare in formato HTML a qualsiasi canale, ad esempio web, e-mail, app mobile o altri.
Questo articolo spiega come creare modelli HTML personalizzati con sintassi Handlebars per il rendering dei frammenti di contenuto visivo.
Dopo aver creato i modelli, puoi:
Cosa imparerai what-you-will-learn
Dopo aver fornito un’introduzione (molto rapida) a:
- Come utilizzare i modelli in AEM
- Utilizzo dell’URL di pubblicazione
In questa pagina vengono descritti (più dettagliatamente):
- Handlebars: nozioni di base sulla sintassi
- Come accedere ai dati dei frammenti di contenuto
- Utilizzo di frammenti di contenuto nidificati
- Gestione di campi con più valori
- Creazione di loop e logica condizionale
- Best practice per la progettazione di modelli per frammenti di contenuto
Prerequisiti prerequisites
Per comprendere e utilizzare le tecnologie qui descritte, è necessario disporre di:
- Nozioni di base su HTML
- Familiarità con i frammenti di contenuto e i modelli per frammenti di contenuto di AEM
- Informazioni sui modelli per frammenti di contenuto
Utilizzo di un modello HTML per frammenti di contenuto using-a-content-fragment-html-template
Utilizzo di un modello HTML per frammenti di contenuto in AEM using-a-content-fragment-html-template-in-aem
Per informazioni dettagliate su come utilizzare il modello in AEM, consulta:
Utilizzo dell’URL di pubblicazione del frammento di contenuto visivo using-the-visual-content-fragment-publish-url
Dopo aver creato i frammenti di contenuto visivo utilizzando il modello, puoi utilizzare l’URL di pubblicazione dei frammenti di contenuto visivo.
Handlebars - the (very) basics handlebars-the-very-basics
Handlebars è un linguaggio di modelli semplice che utilizza parentesi graffe doppie {{ }} per inserire contenuto dinamico in HTML.
Sintassi di base basic-syntax
Un esempio di sintassi di base di Handlebars:
Concetti fondamentali key-concepts
I concetti chiave di Handlebars:
{{ }}{{{ }}}{{! }}{{{ }}}) per i valori dei campi perché i valori sono HTML di cui è stato eseguito il rendering anticipato.Riferimento contesto modello template-context-reference
Quando viene eseguito il rendering del modello, questo riceve un oggetto contestuale contenente tutti i dati sul frammento di contenuto. Ciò riguarderà:
-
frammento selezionato
-
tutti gli altri frammenti a cui si fa riferimento dal frammento selezionato
note NOTE È possibile fare riferimento ai frammenti: - nell’interfaccia utente: fino alla profondità massima di 5
- quando si utilizza l’API: la profondità è configurabile, fino alla profondità massima di 10
Frammento di contenuto content-fragment
Struttura dell’oggetto contestuale per il frammento di contenuto (selezionato):
fieldsallFields{name, value} per l’iterazionehasFieldstrue se il frammento ha campiStruttura delle proprietà properties-structure
L’oggetto properties ha la stessa struttura per il frammento selezionato e per ogni frammento di riferimento.
idtitledescriptionpath/content/dam/...hasDescriptiontruecreatedDatemodifiedDatepublishedDatestatusDRAFTmodelid, path, name, technicalName, descriptionvalidationStatus{property, message}previewReplicationStatustagsid, title, titlePath, name, path, descriptionfieldTagstags.Esempi: accesso ai modelli
Per il frammento di contenuto (selezionato):
Frammenti di contenuto di riferimento referenced-content-fragments
Struttura dell’oggetto contestuale per tutti i frammenti a cui si fa riferimento:
hasReferencedFragmentstrue quando esistono riferimentireferencedFragmentsreferencesErrortrue se si è verificato un errore durante il caricamento dei riferimentireferencesErrorMessagereferencesError è trueStruttura dei frammenti di riferimento referenced-fragment-structure
Ogni elemento in referencedFragments contiene:
anchorIdpropertieshasFieldsfieldsallFields{name, value} per l’iterazioneEsempi: accesso al modello per il primo frammento di contenuto a cui si fa riferimento (primo elemento nell’elenco con indice 0):
Oppure dalla mappa dei campi:
Accesso ai campi di base basic-field-access
Si consiglia l’accesso diretto ai campi, se necessario è possibile eseguire iterazioni in tutti i campi.
Accesso diretto al campo (consigliato) direct-field-access-recommended
Accedi direttamente ai campi per nome utilizzando la mappa dei campi:
Ricorda:
- Usa parentesi graffe
{{{ }}}per i valori di campo se contengono HTML (Rich Text) pre-renderizzati - I nomi dei campi (titolo, sottotitolo, descrizione, immagine primaria) devono corrispondere esattamente al modello per frammenti di contenuto
- I campi mancanti non vengono visualizzati: non vengono generati errori e la sintassi Handlebars rimane presente (e visibile) nel frammento HTML renderizzato
Scorre tutti i campi iterate-through-all-fields
Utilizza allFields quando non conosci in anticipo i nomi dei campi:
Ricorda:
{{name}}utilizza le parentesi graffe (etichetta testo normale){{{value}}}utilizza parentesi graffe (valore HTML pre-renderizzato)
Frammenti di contenuto nidificati nested-content-fragments
Quando un campo Frammento di contenuto fa riferimento a un altro frammento di contenuto, puoi utilizzare la notazione del punto per accedere direttamente ai campi nel frammento di riferimento.
Nidificazione a livello singolo single-level-nesting
Esempio di nidificazione a livello singolo:
Pattern: fields.referenceFieldName.nestedFieldName
Nidificazione a più livelli multi-level-nesting
Il sistema supporta una profondità di nidificazione illimitata:
Pattern: fields.level1.level2.level3.fieldName (profondità limitata; il valore predefinito è 5, può essere esteso a 10 quando si utilizza l’API)
Requisito parametro API: idratazione api-parameter-requirements
Per abilitare l’accesso ai frammenti di contenuto nidificati, è necessario includere il parametro di query hydration nella chiamata API:
Per attivare l’idratazione:
# 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+Campi multivalore multi-valued-fields
Esistono diversi tipi di campi con più valori.
Campi di testo con più valori multi-valued-text-fields
Testo, numero, data e altri campi semplici diventano matrici se multivalore:
Quando si accede a elementi array per indice in Handlebars:
- Utilizza:
.[0](punto prima parentesi)
- Non:
[0]
Campi numerici multivalore multi-valued-number-fields
I numeri vengono convertiti in stringhe per il rendering:
Riferimenti a frammenti di contenuto con più valori multi-valued-content-fragment-references
Quando un campo fa riferimento a più frammenti di contenuto:
Riferimenti a risorse con più valori multi-valued-asset-references
I campi Riferimento contenuto configurati per i tipi di contenuto che sono risorse (ad esempio, immagini e documenti) vengono prerenderizzati come HTML. Le risorse multivalore diventano array:
Riferimenti con più valori nidificati nested-multi-valued-references
I riferimenti multivalore possono contenere riferimenti multivalore a qualsiasi profondità:
Cicli e iterazione loops-and-iteration
Handlebars fornisce l’helper {{#each}} per l’iterazione su array e oggetti.
Iterazione su array iterating-over-arrays
Esempio di iterazione su array:
Variabili speciali nei cicli special-variables-in-loops
All’interno di {{#each}} blocchi, Handlebars fornisce variabili speciali:
Iterazione su frammenti di riferimento iterating-over-referenced-fragments
Esempio di iterazione sui frammenti di riferimento:
Loop nidificati nested-loops
Esempio di loop nidificati:
Rendering condizionale conditional-rendering
Utilizza le condizionali per mostrare o nascondere il contenuto in base alla disponibilità dei dati.
If/Else di base basic-if-else
Esempio di costrutto di base if-else:
A meno che (condizionale negativo) unless-negative-conditional
Un helper unless:
Condizionali nidificati nested-conditials
Esempio di condizionale nidificato:
Helper Handlebars integrati built-in-handlebars-helpers
Handlebars include diversi helper incorporati, oltre a {{#if}} e {{#each}}.
{{#if condition}}false, undefined, null, 0, "", []{{#unless condition}}#if){{#each array}}{{else}} per gli array vuoti{{#with object}}{{lookup this "key"}}Con Helper with-helper
Crea un nuovo ambito per gli oggetti nidificati per ridurre i prefissi di percorso ripetitivi:
Modelli avanzati advanced-patterns
Seguono alcuni esempi di pattern avanzati.
Accesso al contesto padre nei loop nidificati accessing-parent-context-in-nested-loops
Utilizzare ../ per accedere all’ambito padre da un loop nidificato:
Classi CSS dinamiche dynamic-css-classes
Esempio di classi CSS dinamiche:
Esempi completi complete-examples
Sono forniti diversi esempi completi a titolo di riferimento.
Post di blog con autore
Un post di blog con i dettagli dell’autore:
Chiamata API richiesta:
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A1%7D
Vista tabella generica (nessuna conoscenza precedente dei campi) generic-table-view-no-prior-knowledge-of-fields
Visualizzazione tabella generica, senza una conoscenza dei campi. È simile al modello generico:
Best practice best-practices
Le best practice includono:
-
Utilizza sempre parentesi graffe triple per i valori dei campi che contengono contenuto di markup HTML.
-
I valori dei campi sono HTML di cui è stato eseguito il pre-rendering.
note NOTE Le doppie parentesi graffe mostrano i tag HTML non elaborati come testo normale.
code language-handlebars <!-- CORRECT --> {{{fields.description}}} <!-- WRONG - displays HTML tags as text --> {{fields.description}} -
-
Verifica la presenza prima di accedere ai campi nidificati.
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> -
Se possibile, utilizza l’accesso diretto ai campi.
- È più leggibile e gestibile rispetto all’iterazione di
allFieldse alla corrispondenza per nome.
- È più leggibile e gestibile rispetto all’iterazione di
-
Modelli di struttura con commenti di sezione.
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}} -
Gestisci i dati mancanti in modo semplice con i fallback.
code language-handlebars {{#if fields.title}} <h1>{{{fields.title}}}</h1> {{snippet-not-found:else}} <h1>Untitled</h1> {{/if}} -
Utilizza sempre una struttura di documento HTML appropriata.
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> -
Esegui il test con diversi scenari di contenuto:
- Tutti i campi sono completamente compilati
- Campi opzionali mancanti
- Campi multivalore vuoti
- Nidificazione profonda (più livelli)
- Riferimenti non caricati
-
Utilizza elementi HTML semantici:
- Per una migliore accessibilità, utilizzare
<article>,<header>,<main>,<footer>,<time>,<address>o simili.
- Per una migliore accessibilità, utilizzare
-
Mantieni gli stili nel CSS.
- Utilizza
<style>tag o fogli di stile esterni. - Se possibile, evita gli stili in linea.
- Utilizza
-
Logica complessa documento:
- Usa commenti Handlebars
({{! }}). - Non utilizzare i commenti di HTML, visualizzati nell’output di rendering.
- Usa commenti Handlebars
Risoluzione di problemi troubleshooting
Alcuni suggerimenti per la risoluzione dei problemi includono:
<p>Hello World</p> visualizzato letteralmente{{{fields.description}}}{{{fields.author.name}}} è vuotomaxDepth sia sufficientemente profondo{{#each fields.tags}} per eseguire iterazioni di tutti gli elementi{{{fields.tags[0]}}} rendering vuoti{{{fields.tags.[0]}}}hasReferencedFragments è sempre falso?hydration=%7B%22enabled%22%3Atrue%7D; controllare anche {{#if referencesError}}{{#if}} o {{#each}} blocchi non chiusi. Aggiungere l’output di diagnostica: <pre>hasFields: {{hasFields}} | title: {{properties.title}}</pre>{{! comment }} invece di HTML <!-- comment -->{{#if fields.enabled}} è sempre truthy"false" è truthy in Handlebars. Solo i valori effettivi false, null, undefined, 0, "" e [] sono falsy.<, & visualizzato invece di <, &{{{fields.content}}}#each non è definita../ per l’ambito padre: {{{../name}}}; usa ../../ per l’ambito padre{{else}} in {{#each}}: {{#each fields.tags}}...{{else}}<p>No tags</p>{{/each}}Utilizzo delle risorse working-with-assets
Assets a cui si fa riferimento dai frammenti di contenuto viene sottoposto a pre-rendering come HTML da AEM. Pertanto, le parentesi graffe sono obbligatorie per tutti i riferimenti a risorse.
<img src="..." alt="..."><video> elemento<a href="...">Ricorda:
- Per i campi delle risorse, utilizza sempre le parentesi graffe.
Se si utilizzano parentesi graffe doppie, il tag HTML generato verrà eliminato e visualizzato come testo non elaborato anziché come immagine, video o collegamento.
Utilizzo campo risorsa asset-field-usage
Esempio di utilizzo del campo risorsa:
Helper per modelli personalizzati customer-template-helpers
Il sistema fornisce assistenti Handlebars personalizzati per la generazione di elementi HTML con attributi HTML personalizzati. Questi helper ti consentono di controllare il markup generato, gestendo al contempo la complessità dell’estrazione degli URL di origine dai contenuti pre-renderizzati.
Helper disponibili:
asset- Genera<img>tag con attributi personalizzatitext- Genera<span>tag per il wrapping del contenuto di testo con attributi personalizzati
Helper asset asset-helper
Sintassi:
Ricorda:
- Utilizzare le parentesi graffe triple
{{{ }}}con l’helper della risorsa, non le doppie.
Quattro esempi di base four-basic-examples
Quattro esempi di base sono:
Attributi supportati supported-attributes
Puoi aggiungere qualsiasi attributo HTML valido:
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;"Sostituisci testo alternativo override-alt-text
L’attributo alt dell’immagine originale può essere sovrascritto:
Esempio complesso complex-example
Un esempio complesso è:
Utilizzo con cicli using-with-loops
Helper risorse in loop:
Helper text text-helper
L’helper di testo genera un tag <span> che racchiude il contenuto di testo con classi CSS e attributi HTML personalizzati. Utile per formattare singoli campi di testo.
Sintassi:
Ricorda:
- Utilizzare le parentesi graffe triple
{{{ }}}con l’helper di testo, non le doppie.
Tre esempi di base three-basic-examples
Tre esempi di base sono:
Casi d’uso comuni common-use-cases
Alcuni casi d’uso comuni includono:
Con cicli with-loops
Un caso d’uso comune con i loop include:
Helper - Convalida degli attributi helpers-attribute-validation
Entrambi gli helper convalidano i nomi degli attributi prima di includerli nell’output.
Nomi di attributi validi:
-
Deve iniziare con una lettera (a-z, A-Z)
-
Può contenere solo lettere, cifre, trattini e trattini bassi; vedi le Convenzioni di denominazione
-
Senza distinzione tra maiuscole e minuscole
-
Ad esempio:
- Valido:
class,id,data-value,aria-label,my_attr,dataIndex1
- Non valido:
123-attr,-class,@special,$money
- Valido:
I nomi di attributo non validi vengono automaticamente ignorati con un avviso nei registri:
Ricorda:
- Verificare nei registri del server la presenza di avvisi relativi al formato di nome attributo “Bloccato non valido”.
Confronto tra output diretto e helper comparing-direct-output-to-helpers
Quando aumentare l’output diretto {{{fields.xxx}}}:
- Non è necessario utilizzare uno stile personalizzato
- Desideri l’output predefinito così com’è
- Il campo contiene HTML complessi che non desideri modificare
Quando utilizzare gli helper:
- È necessario aggiungere classi CSS per lo stile
- È necessario aggiungere attributi HTML personalizzati (
data-*,aria-*e altri) - Desideri una struttura HTML coerente e controllata
Confronto:
Riferimento rapido quick-reference
Vengono fornite alcune informazioni di riferimento rapido.
Variabili di contesto context-variables
Le variabili di contesto:
Accesso ai campi field-access
Come accedere ai campi:
Flusso di controllo control-flow
Flusso di controllo:
Variabili di loop loop-variables
Le variabili di loop:
Helper per modelli personalizzati custom-template-helpers
Il modello personalizzato aiuta a:
Risorse aggiuntive additional-resources
Sono disponibili risorse aggiuntive: