Fragmentos de conteúdo visual - Modelos visual-content-fragments-templates
No Adobe Experience Manager (AEM) as a Cloud Service, os modelos do HTML podem ser usados para visualizar Fragmentos de conteúdo e entregá-los no formato HTML.
Os modelos do HTML permitem controlar como os fragmentos de conteúdo são exibidos. Você pode criar modelos do HTML em seu editor de código preferido e, em seguida, carregá-los e atribuí-los aos Modelos de fragmento de conteúdo no AEM. Os espaços reservados para conteúdo usando Handlebars.js permitem mapear o modelo para tipos de dados no Modelo de fragmento de conteúdo. Depois de atribuído a um modelo, um modelo fica disponível para ser usado com qualquer fragmento de conteúdo com base no modelo, para visualizar o fragmento ou entregá-lo como uma experiência modular no formato HTML para qualquer canal, por exemplo, web, email, aplicativo móvel ou outros.
Este artigo explica como criar modelos personalizados do HTML com sintaxe Handlebars para renderizar Fragmentos de conteúdo visual.
Depois de criar os modelos, você pode:
O que você aprenderá what-you-will-learn
Depois de fornecer uma introdução (muito rápida) a:
- Como usar seus modelos no AEM
- Uso do URL de publicação
Esta página aborda (com mais detalhes):
- Handlebars - as noções básicas necessárias da sintaxe
- Como acessar os dados do fragmento de conteúdo
- Trabalhar com fragmentos de conteúdo aninhados
- Tratamento de campos de vários valores
- Criação de loops e lógica condicional
- Práticas recomendadas de design de modelo para fragmentos de conteúdo
Pré-requisitos prerequisites
Para entender e trabalhar com as tecnologias cobertas aqui, você deve ter:
- Noções básicas sobre o HTML
- Familiaridade com fragmentos de conteúdo e modelos de fragmento de conteúdo do AEM
- Noções básicas sobre os modelos de fragmento de conteúdo
Uso de um modelo de HTML de fragmento de conteúdo using-a-content-fragment-html-template
Uso de um modelo de HTML de fragmento de conteúdo no AEM using-a-content-fragment-html-template-in-aem
Para obter detalhes sobre como usar o modelo no AEM, consulte:
Uso do URL de publicação do fragmento de conteúdo visual using-the-visual-content-fragment-publish-url
Depois de criar fragmentos de conteúdo visual usando o modelo, você pode usar a URL de publicação dos fragmentos de conteúdo visual.
Handlebars - os (muito) básicos handlebars-the-very-basics
Handlebars é uma linguagem de modelo simples que usa chaves duplas (colchetes) {{ }} para inserir conteúdo dinâmico no HTML.
Sintaxe básica basic-syntax
Um exemplo de sintaxe básica de Handlebars:
Principais conceitos key-concepts
Os principais conceitos do Handlebars:
{{ }}{{{ }}}{{! }}{{{ }}}) para valores de campo porque os valores são HTML pré-renderizados.Referência de contexto do modelo template-context-reference
Quando o modelo é renderizado, ele recebe um objeto de contexto contendo todos os dados sobre o fragmento de conteúdo. Abrangerá:
-
o fragmento selecionado
-
todos os outros fragmentos referenciados do fragmento selecionado
note NOTE Os fragmentos podem ser referenciados: - na interface do usuário do: até a profundidade máxima de 5
- ao usar a API: a profundidade é configurável, até a profundidade máxima de 10
Fragmento de conteúdo content-fragment
A estrutura do objeto de contexto do Fragmento de conteúdo (selecionado):
fieldsallFields{name, value} para iteraçãohasFieldstrue se o fragmento tiver camposEstrutura de propriedades properties-structure
O objeto properties tem a mesma estrutura para o fragmento selecionado e para cada fragmento referenciado.
idtitledescriptionpath/content/dam/...hasDescriptiontruecreatedDatemodifiedDatepublishedDatestatusDRAFTmodelid, path, name, technicalName, descriptionvalidationStatus{property, message}previewReplicationStatustagsid, title, titlePath, name, path, descriptionfieldTagstags.Exemplos: Acesso ao modelo
Para o fragmento de conteúdo (selecionado):
Fragmentos de conteúdo referenciados referenced-content-fragments
A estrutura do objeto de contexto para qualquer fragmento referenciado:
hasReferencedFragmentstrue quando existem referênciasreferencedFragmentsreferencesErrortrue se ocorreu um erro ao carregar as referênciasreferencesErrorMessagereferencesError é trueEstrutura de fragmento referenciada referenced-fragment-structure
Cada item em referencedFragments contém:
anchorIdpropertieshasFieldsfieldsallFields{name, value} para iteraçãoExemplos: Acesso ao modelo para o primeiro fragmento de conteúdo referenciado (primeiro item na lista de 0 indexados):
Ou no mapa de campos:
Acesso básico a campo basic-field-access
O acesso direto ao campo é recomendado; quando necessário, você pode iterar em todos os campos.
Acesso direto ao campo (recomendado) direct-field-access-recommended
Acesse os campos diretamente pelo nome usando o mapa de campos:
Lembre-se:
- Use chaves triplas
{{{ }}}para valores de campo se eles contiverem HTML pré-renderizados (rich text) - Os nomes de campos (título, subtítulo, descrição, primaryImage) devem corresponder exatamente ao seu Modelo de Fragmento de Conteúdo 3}
- Campos ausentes não são renderizados - nenhum erro é lançado e a sintaxe Handlebars permanece presente (e visível) no fragmento de HTML renderizado
Repetir em todos os campos iterate-through-all-fields
Use allFields quando não souber os nomes dos campos antecipadamente:
Lembre-se:
{{name}}usa chaves duplas (rótulo de texto simples){{{value}}}usa chaves triplas (valor HTML pré-renderizado)
Fragmentos de conteúdo aninhados nested-content-fragments
Quando um campo Fragmento de conteúdo faz referência a outro Fragmento de conteúdo, você pode usar a notação de pontos para acessar diretamente os campos no fragmento referenciado.
Aninhamento de nível único single-level-nesting
Um exemplo de aninhamento de nível único:
Padrão: fields.referenceFieldName.nestedFieldName
Aninhamento de vários níveis multi-level-nesting
O sistema oferece suporte a profundidade de aninhamento ilimitada:
Padrão: fields.level1.level2.level3.fieldName (profundidade limitada; o padrão é 5, pode ser estendido para 10 ao usar a API)
Requisito do parâmetro de API: hidratação api-parameter-requirements
Para habilitar o acesso aninhado ao Fragmento de conteúdo, você deve incluir o parâmetro de consulta hydration na chamada de API:
Para ativar a hidratação:
# 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+Campos de vários valores multi-valued-fields
Há vários tipos de campos de vários valores.
Campos de texto de vários valores multi-valued-text-fields
Texto, número, data e outros campos simples tornam-se matrizes quando com vários valores:
Lembre-se de que, ao acessar itens de matriz por índice em Handlebars:
- Uso:
.[0](ponto antes do colchete)
- Não:
[0]
Campos de número de vários valores multi-valued-number-fields
Números são convertidos em cadeias de caracteres para renderização:
Referências de fragmentos de conteúdo de vários valores multi-valued-content-fragment-references
Quando um campo faz referência a vários Fragmentos de conteúdo:
Referências de ativos de vários valores multi-valued-asset-references
Os campos Referência de Conteúdo configurados para tipos de conteúdo que são ativos (por exemplo, imagens e documentos) são pré-renderizados como HTML. Ativos de vários valores se tornam arrays:
Referências aninhadas de vários valores nested-multi-valued-references
Referências de vários valores podem conter referências de vários valores em qualquer profundidade:
Loops e iteração loops-and-iteration
Handlebars fornece o auxiliar {{#each}} para iterar matrizes e objetos.
Iteração em arrays iterating-over-arrays
Um exemplo de iteração sobre matrizes:
Variáveis especiais em loops special-variables-in-loops
Dentro de {{#each}} blocos, Handlebars fornece variáveis especiais:
Iteração sobre fragmentos referenciados iterating-over-referenced-fragments
Um exemplo de iteração sobre fragmentos referenciados:
Loops aninhados nested-loops
Um exemplo de loops aninhados:
Renderização condicional conditional-rendering
Use as condições para mostrar ou ocultar o conteúdo com base na disponibilidade dos dados.
Se/Senão Básico basic-if-else
Um exemplo de uma construção básica if-else:
A menos que (condicional negativo) unless-negative-conditional
Um auxiliar unless:
Condicionais Aninhadas nested-conditials
Um exemplo de condicional aninhada:
Handlebars helpers embutidos built-in-handlebars-helpers
Handlebars inclui vários auxiliares internos, além de {{#if}} e {{#each}}.
{{#if condition}}false, undefined, null, 0, "", []{{#unless condition}}#if){{#each array}}{{else}} para matrizes vazias{{#with object}}{{lookup this "key"}}Com Auxiliar with-helper
Cria um novo escopo para objetos aninhados para reduzir prefixos de caminho repetitivos:
Padrões avançados advanced-patterns
Seguem-se alguns exemplos de padrões avançados.
Acesso ao Contexto Pai em Loops Aninhados accessing-parent-context-in-nested-loops
Use ../ para acessar o escopo pai de dentro de um loop aninhado:
Classes CSS dinâmicas dynamic-css-classes
Um exemplo de classes CSS dinâmicas:
Exemplos completos complete-examples
Vários exemplos completos são fornecidos para referência.
Publicação de blog com autor
Uma publicação do blog com detalhes do autor:
Chamada de API necessária:
GET /adobe/sites/cf/fragments/{id}/preview?hydration=%7B%22enabled%22%3Atrue%2C%22maxDepth%22%3A1%7D
Exibição de tabela genérica (sem conhecimento prévio de campos) generic-table-view-no-prior-knowledge-of-fields
Uma exibição de tabela genérica, sem um conhecimento inerente de campos. O é semelhante ao Modelo Genérico:
Práticas recomendadas best-practices
As práticas recomendadas incluem:
-
Sempre use chaves triplas para valores de campo com conteúdo de marcação HTML.
-
Os valores de campo são HTML pré-renderizados.
note NOTE Chaves duplas mostram tags HTML brutas como texto simples.
code language-handlebars <!-- CORRECT --> {{{fields.description}}} <!-- WRONG - displays HTML tags as text --> {{fields.description}} -
-
Verifique a existência antes de acessar campos aninhados.
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> -
Use o acesso direto ao campo quando possível.
- É mais legível e manutenível do que iterar
allFieldse corresponder pelo nome.
- É mais legível e manutenível do que iterar
-
Modelos de estrutura com comentários de seção.
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}} -
Lidar com os dados ausentes normalmente com fallbacks.
code language-handlebars {{#if fields.title}} <h1>{{{fields.title}}}</h1> {{snippet-not-found:else}} <h1>Untitled</h1> {{/if}} -
Sempre use uma estrutura de documento adequada do HTML.
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> -
Teste com uma variedade de cenários de conteúdo:
- Todos os campos totalmente preenchidos
- Campos opcionais ausentes
- Campos vazios com vários valores
- Aninhamento profundo (vários níveis)
- Referências que não são carregadas
-
Usar elementos semânticos do HTML:
- Para melhor acessibilidade, use
<article>,<header>,<main>,<footer>,<time>,<address>ou similar.
- Para melhor acessibilidade, use
-
Mantenha os estilos em CSS.
- Use marcas
<style>ou folhas de estilos externas. - Evite estilos em linha sempre que possível.
- Use marcas
-
Lógica complexa de documento:
- Use os comentários de Handlebars
({{! }}). - Não use comentários do HTML, que aparecem na saída renderizada.
- Use os comentários de Handlebars
Resolução de problemas troubleshooting
Algumas dicas de solução de problemas incluem:
<p>Hello World</p> exibido literalmente{{{fields.description}}}{{{fields.author.name}}} está em brancomaxDepth é suficientemente profundo{{#each fields.tags}} para iterar todos os itens{{{fields.tags[0]}}} renderizações vazias{{{fields.tags.[0]}}}hasReferencedFragments é sempre falso?hydration=%7B%22enabled%22%3Atrue%7D; também verificar {{#if referencesError}}{{#if}} ou {{#each}} não fechados; adicionar saída de diagnóstico: <pre>hasFields: {{hasFields}} | title: {{properties.title}}</pre>{{! comment }} do Handlebars em vez do HTML <!-- comment -->{{#if fields.enabled}} é sempre verdadeiro"false" é verdadeira em Handlebars. Somente false, null, undefined, 0, "" e [] reais são falsy.<, & exibido em vez de <, &{{{fields.content}}}#each indefinida../ para escopo pai: {{{../name}}}; usar ../../ para avô{{else}} dentro de {{#each}}: {{#each fields.tags}}...{{else}}<p>No tags</p>{{/each}}Trabalhar com ativos working-with-assets
O Assets referenciado dos fragmentos de conteúdo é pré-renderizado como HTML pelo AEM. Portanto, chaves triplas são obrigatórias para todas as referências de ativos.
<img src="..." alt="..."><video><a href="...">Lembre-se:
- Sempre use chaves triplas para campos de ativos.
O uso de chaves duplas escapará da tag HTML gerada e a exibirá como texto bruto, em vez de renderizar a imagem, o vídeo ou o link.
Uso do campo de ativo asset-field-usage
Um exemplo de uso de campo de ativo:
Auxiliares de modelo personalizado customer-template-helpers
O sistema fornece auxiliares do Handlebars personalizados para a geração de elementos de HTML com atributos personalizados de HTML. Esses auxiliares fornecem controle sobre a marcação gerada, enquanto lidam com a complexidade da extração de URLs de origem de conteúdo pré-renderizado.
Auxiliares disponíveis:
asset- Gera<img>marcas com atributos personalizadostext- Gera<span>tags quebrando o conteúdo do texto com atributos personalizados
asset auxiliar asset-helper
Sintaxe:
Lembre-se:
- Use chaves triplas
{{{ }}}com o auxiliar de ativos, não chaves duplas!
Quatro exemplos básicos four-basic-examples
Quatro exemplos básicos são:
Atributos suportados supported-attributes
Você pode adicionar qualquer atributo válido do HTML:
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;"Substituir texto alternativo override-alt-text
O atributo alt da imagem original pode ser substituído:
Exemplo complexo complex-example
Um exemplo complexo é:
Uso com loops using-with-loops
Auxiliar de ativo em loops:
text auxiliar text-helper
O auxiliar de texto gera um conteúdo de texto de quebra automática de tag <span> com classes CSS personalizadas e atributos HTML. Útil para estilizar campos de texto individuais.
Sintaxe:
Lembre-se:
- Use chaves triplas
{{{ }}}com o auxiliar de texto, não chaves duplas!
Três exemplos básicos three-basic-examples
Três exemplos básicos são:
Casos de uso comuns common-use-cases
Alguns casos de uso comuns incluem:
Com loops with-loops
Um caso de uso comum com loops inclui:
Auxiliares - Validação de atributo helpers-attribute-validation
Ambos os auxiliares validam nomes de atributos antes de incluí-los na saída.
Nomes de atributo válidos:
-
Deve começar com uma letra (a-z, A-Z)
-
Pode conter apenas letras, dígitos, hifens e sublinhados; consulte as Convenções de nomenclatura
-
Não diferencia maiúsculas de minúsculas
-
Por exemplo:
- Válido:
class,id,data-value,aria-label,my_attr,dataIndex1
- Inválido:
123-attr,-class,@special,$money
- Válido:
Nomes de atributos inválidos são ignorados silenciosamente com um aviso nos logs:
Lembre-se:
- Verifique nos logs do servidor se há avisos de “Formato de nome de atributo inválido bloqueado”.
Comparação de saída direta com auxiliares comparing-direct-output-to-helpers
Quando gerar saída direta {{{fields.xxx}}}:
- Você não precisa de um estilo personalizado
- Você deseja a saída padrão como está
- O campo contém HTML complexos que você não deseja modificar
Quando usar auxiliares:
- É necessário adicionar classes CSS para o estilo
- Você precisa adicionar atributos personalizados do HTML (
data-*,aria-*e outros) - Você deseja uma estrutura consistente e controlada do HTML
Comparação:
Referência rápida quick-reference
Algumas informações de referência rápida são fornecidas para referência.
Variáveis de contexto context-variables
As variáveis de contexto:
Acesso ao campo field-access
Como acessar campos:
Fluxo de controle control-flow
O fluxo de controle:
Variáveis de loop loop-variables
As variáveis de loop:
Auxiliares de modelo personalizado custom-template-helpers
Os assistentes do modelo personalizado:
Recursos adicionais additional-resources
Recursos adicionais estão disponíveis: