Personalizar os Componentes principais do AEM CIF customize-cif-components
O Projeto CIF Venia é uma base de código de referência para usar os Componentes principais do CIF. Neste tutorial, você estende ainda mais o componente Teaser do produto para exibir um atributo personalizado do Adobe Commerce. Você também pode saber mais sobre a integração do GraphQL entre o AEM e o Adobe Commerce e os ganchos de extensão fornecidos pelos Componentes principais do CIF.
O que você vai criar
Recentemente, a marca Venia começou a fabricar alguns produtos usando materiais sustentáveis, e a empresa gostaria de exibir uma medalha Eco Friendly como parte do Teaser do produto. Um novo atributo personalizado é criado no Adobe Commerce para indicar se um produto usa o material Eco friendly. Esse atributo personalizado é adicionado como parte da consulta do GraphQL e exibido no Teaser do produto de produtos especificados.
Pré-requisitos prerequisites
Um ambiente de desenvolvimento local é necessário para concluir este tutorial. Esse ambiente inclui uma instância do AEM em execução que está configurada e conectada a uma instância do Adobe Commerce. Revise os requisitos e as etapas para configurar um desenvolvimento local com o AEM as a Cloud Service SDK. Para seguir o tutorial completamente, você precisa de permissão para adicionar Atributos a um Produto no Adobe Commerce.
Você também precisa do GraphQL IDE, como o GraphiQL, ou de uma extensão de navegador para executar amostras de código e tutoriais. Se você instalar uma extensão de navegador, verifique se ela pode definir cabeçalhos de solicitação. No Google Chrome, o Cliente Altair GraphQL é uma extensão que pode realizar o trabalho.
Clonar o projeto Venia clone-venia-project
Clonar o Projeto Venia e substituir os estilos padrão.
-
Execute o seguinte comando do Git para clonar o projeto:
code language-shell $ git clone git@github.com:adobe/aem-cif-guides-venia.git
-
Crie e implante o projeto em uma instância local do AEM:
code language-shell $ cd aem-cif-guides-venia/ $ mvn clean install -PautoInstallSinglePackage,cloud
-
Adicione as configurações OSGi necessárias para conectar a instância do AEM a uma instância do Adobe Commerce ou adicione as configurações ao projeto criado.
-
Nesse ponto, você deve ter uma versão funcional de uma loja conectada a uma instância do Adobe Commerce. Navegue até a página
US
>Home
em: http://localhost:4502/editor.html/content/venia/us/en.html.Você verá que a vitrine está usando o tema Venia. Ao expandir o Menu principal da loja, você verá várias categorias, indicando que a conexão com o Adobe Commerce está funcionando.
Criação do Teaser do produto author-product-teaser
O Teaser do produto é apresentado em todo este tutorial. Como primeira etapa, adicione uma instância do Teaser do produto à página inicial para entender a funcionalidade da linha de base.
-
Navegue até a Home Page do site: http://localhost:4502/editor.html/content/acme/us/en.html
-
Insira um novo Teaser do produto no container do layout principal da página.
-
Expanda o painel lateral (se ainda não estiver sendo exibido) e alterne a lista suspensa do localizador de ativos para Produtos. Essa lista deve exibir uma lista de produtos disponíveis em uma instância conectada do Adobe Commerce. Selecione, arraste e solte um produto no Teaser do produto exibido na página.
note note NOTE Observação: você também pode configurar o produto exibido definindo o componente na caixa de diálogo (clicando na chave inglesa). -
Agora você já deve estar vendo um produto no teaser. O nome e o preço do produto são atributos exibidos por padrão.
Adicionar um atributo personalizado no Adobe Commerce add-custom-attribute
Os produtos e os dados do produto exibidos no AEM são armazenados no Adobe Commerce. Em seguida, adicione um atributo para Eco Friendly como parte do atributo de produto definido ao usar a interface do usuário do Adobe Commerce.
-
Faça logon na sua instância do Adobe Commerce.
-
Navegue até Catálogo > Produtos.
-
Atualize o filtro de pesquisa para encontrar o Produto Configurável usado quando adicionado ao componente Teaser no exercício anterior. Abra o produto no modo de edição.
-
Na exibição do produto, clique em Adicionar atributo > Criar novo atributo.
-
Preencha o formulário Novo Atributo com os seguintes valores (deixe as configurações padrão para outros valores)
table 0-row-3 1-row-3 2-row-3 3-row-3 Conjunto de campos Rótulo do campo Valor Propriedades do atributo Rótulo do atributo Amigável(A) Com Eco Propriedades do atributo Tipo de entrada do catálogo Sim/Não Propriedades Avançadas de Atributo Código do atributo eco_friendly Clique em Salvar atributo quando terminar.
-
Role até a parte inferior do produto e expanda o cabeçalho Atributos. Você deve ver o novo campo Eco-Friendly. Alterne a opção para Sim.
Salve as alterações no produto.
note tip TIP Mais detalhes sobre o gerenciamento dos Atributos do produto podem ser encontrados no guia do usuário do Adobe Commerce. -
Navegue até Sistema > Ferramentas > Gerenciamento de Cache. Como foi feita uma atualização no esquema de dados, você deve invalidar alguns dos Tipos de cache no Adobe Commerce.
-
Marque a caixa ao lado de Configuração e envie o tipo de cache para Atualização
note tip TIP Mais detalhes sobre o Gerenciamento de Cache podem ser encontrados no guia do usuário do Adobe Commerce.
Usar um GraphQL IDE para verificar o atributo use-graphql-ide
Antes de entrar no código AEM, é útil explorar a Visão geral do GraphQL usando um GraphQL IDE. A integração do Adobe Commerce com o AEM é feita principalmente por meio de uma série de queries do GraphQL. Entender e modificar as consultas do GraphQL é uma das principais maneiras de estender os Componentes principais do CIF.
Em seguida, use um GraphQL IDE para verificar se o atributo eco_friendly
foi adicionado ao conjunto de atributos do produto. As capturas de tela deste tutorial estão usando a extensão do Google Chrome para Cliente Altair GraphQL.
-
Abra o GraphQL IDE e insira o URL
http://<commerce-server>/graphql
na barra de URL do IDE ou da extensão. -
Adicione a seguinte consulta de produtos, onde
YOUR_SKU
é a SKU do produto usado no exercício anterior:code language-json { products( filter: { sku: { eq: "YOUR_SKU" } } ) { items { name sku eco_friendly } } }
-
Execute a query e você receberá uma resposta como a seguinte:
code language-json { "data": { "products": { "items": [ { "name": "Valeria Two-Layer Tank", "sku": "VT11", "eco_friendly": 1 } ] } } }
O valor de Sim é um inteiro de 1. Esse valor é útil ao escrever a consulta do GraphQL em Java™.
note tip TIP Para obter mais informações, consulte Adobe Commerce GraphQL.
Atualizar o Modelo do Sling para o Teaser do produto updating-sling-model-product-teaser
Em seguida, estenda a lógica de negócios do Teaser do produto implementando um Modelo do Sling. Os Modelos do Sling são objetos POJO (Plain Old Java™ Objects) orientados por anotações que implementam a lógica de negócios exigida pelo componente. Os Modelos do Sling são usados com os scripts HTL como parte do componente. Siga o padrão de delegação para Modelos do Sling para que você possa estender partes do modelo existente do Teaser do produto.
Os Modelos do Sling são implementados como Java™ e podem ser encontrados no módulo core do projeto gerado.
Use o IDE de sua escolha para importar o projeto Venia. As capturas de tela usadas são do IDE Visual Studio Code.
-
No IDE, navegue no módulo core para:
core/src/main/java/com/venia/core/models/commerce/MyProductTeaser.java
.MyProductTeaser.java
é uma interface Java™ que estende a interface ProductTeaser do CIF.Já foi adicionado um novo método chamado
isShowBadge()
para exibir uma medalha se o produto for considerado "Novo". -
Adicionar
isEcoFriendly()
à interface:code language-java @ProviderType public interface MyProductTeaser extends ProductTeaser { // Extend the existing interface with the additional properties which you // want to expose to the HTL template. public Boolean isShowBadge(); public Boolean isEcoFriendly(); }
Este novo método é introduzido para encapsular a lógica para indicar se o produto tem o atributo
eco_friendly
definido como Sim ou Não. -
Em seguida, inspecione o
MyProductTeaserImpl.java
emcore/src/main/java/com/venia/core/models/commerce/MyProductTeaserImpl.java
.O padrão de delegação para Modelos do Sling permite que
MyProductTeaserImpl
faça referência ao modeloProductTeaser
por meio da propriedadesling:resourceSuperType
:code language-java @Self @Via(type = ResourceSuperType.class) private ProductTeaser productTeaser;
Para os métodos que você não deseja substituir ou alterar, você pode retornar o valor retornado por
ProductTeaser
. Por exemplo:code language-java @Override public String getImage() { return productTeaser.getImage(); }
Este método minimiza a quantidade de código Java™ que uma implementação deve gravar.
-
Um dos pontos de extensão adicionais fornecidos pelos Componentes principais do AEM CIF é o
AbstractProductRetriever
, que fornece acesso a atributos específicos do produto. Inspecione o métodoinitModel()
:code language-java import javax.annotation.PostConstruct; ... @Model(adaptables = SlingHttpServletRequest.class, adapters = MyProductTeaser.class, resourceType = MyProductTeaserImpl.RESOURCE_TYPE) public class MyProductTeaserImpl implements MyProductTeaser { ... private AbstractProductRetriever productRetriever; /* add this method to initialize the productRetriever */ @PostConstruct public void initModel() { productRetriever = productTeaser.getProductRetriever(); if (productRetriever != null) { productRetriever.extendProductQueryWith(p -> p.createdAt()); } } ...
A anotação
@PostConstruct
garante que esse método seja chamado quando o Modelo Sling for inicializado.Observe que a consulta GraphQL do produto já foi estendida usando o método
extendProductQueryWith
para recuperar o atributocreated_at
adicional. Este atributo é usado posteriormente como parte do métodoisShowBadge()
. -
Atualize a consulta GraphQL para incluir o atributo
eco_friendly
na consulta parcial:code language-java //MyProductTeaserImpl.java private static final String ECO_FRIENDLY_ATTRIBUTE = "eco_friendly"; @PostConstruct public void initModel() { productRetriever = productTeaser.getProductRetriever(); if (productRetriever != null) { productRetriever.extendProductQueryWith(p -> p .createdAt() .addCustomSimpleField(ECO_FRIENDLY_ATTRIBUTE) ); } }
Adicionar ao método
extendProductQueryWith
é uma maneira eficiente de garantir que atributos de produto adicionais estejam disponíveis para o restante do modelo. Essa ação também minimiza o número de consultas executadas.No código acima, o
addCustomSimpleField
é usado para recuperar o atributoeco_friendly
. Este atributo ilustra como você pode consultar qualquer atributo personalizado que faça parte do esquema do Adobe Commerce.note note NOTE O método createdAt()
foi implementado como parte da Interface do Produto. A maioria dos atributos de esquema encontrados com frequência foram implementados, portanto, use oaddCustomSimpleField
somente para atributos verdadeiramente personalizados. -
Adicione um agente de log para depurar o código Java™:
code language-java import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... @Model(adaptables = SlingHttpServletRequest.class, adapters = MyProductTeaser.class, resourceType = MyProductTeaserImpl.RESOURCE_TYPE) public class MyProductTeaserImpl implements MyProductTeaser { private static final Logger LOGGER = LoggerFactory.getLogger(MyProductTeaserImpl.class);
-
Em seguida, implemente o método
isEcoFriendly()
:code language-java @Override public Boolean isEcoFriendly() { Integer ecoFriendlyValue; try { ecoFriendlyValue = productRetriever.fetchProduct().getAsInteger(ECO_FRIENDLY_ATTRIBUTE); if(ecoFriendlyValue != null && ecoFriendlyValue.equals(Integer.valueOf(1))) { LOGGER.info("*** Product is Eco Friendly**"); return true; } } catch (SchemaViolationError e) { LOGGER.error("Error retrieving eco friendly attribute"); } LOGGER.info("*** Product is not Eco Friendly**"); return false; }
No método acima, o
productRetriever
é usado para buscar o produto e o métodogetAsInteger()
é usado para obter o valor do atributoeco_friendly
. Com base nas consultas GraphQL executadas anteriormente, você sabe que o valor esperado quando o atributoeco_friendly
é definido como "Sim" é na verdade um inteiro de 1.Agora que o Modelo do Sling foi atualizado, a marcação do Componente deve ser atualizada para realmente exibir um indicador de Compatível com a tecnologia Eco com base no Modelo do Sling.
Personalização da marcação do Teaser do produto customize-markup-product-teaser
Uma extensão comum de componentes do AEM é modificar a marcação gerada pelo componente. Essa edição é feita substituindo o script HTL que o componente usa para renderizar sua marcação. A Linguagem de modelo do HTML (HTL) é uma linguagem de modelo leve que os componentes do AEM usam para renderizar dinamicamente a marcação com base no conteúdo criado, permitindo que os componentes sejam reutilizados. O Teaser do produto, por exemplo, pode ser reutilizado várias vezes para exibir produtos diferentes.
Nesse caso, renderize um banner sobre o teaser para indicar que o produto é "Eco Friendly" com base em um atributo personalizado. O padrão de design para personalizar a marcação de um componente é padrão para todos os Componentes do AEM, não apenas para os Componentes Principais do AEM CIF.
cif.shell.picker
necessária para as caixas de diálogo do componente. Consulte Uso do seletor de produto e categoria do CIF para obter detalhes.-
No IDE, navegue e expanda o módulo
ui.apps
e expanda a hierarquia de pastas para:ui.apps/src/main/content/jcr_root/apps/venia/components/commerce/productteaser
e inspecione o arquivo.content.xml
.code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" jcr:description="Product Teaser Component" jcr:primaryType="cq:Component" jcr:title="Product Teaser" sling:resourceSuperType="core/cif/components/commerce/productteaser/v1/productteaser" componentGroup="Venia - Commerce"/>
A definição de componente acima é para o Teaser do produto em seu projeto. Observe a propriedade
sling:resourceSuperType="core/cif/components/commerce/productteaser/v1/productteaser"
. Esta propriedade é um exemplo de criação de um Componente proxy. Em vez de copiar e colar os scripts HTL do Teaser do produto dos Componentes principais do AEM CIF, você pode usar osling:resourceSuperType
para herdar toda a funcionalidade. -
Abra o arquivo
productteaser.html
. Este arquivo é uma cópia do arquivoproductteaser.html
do Teaser do produto CIF.code language-html <!--/* productteaser.html */--> <sly data-sly-use.product="com.venia.core.models.commerce.MyProductTeaser" data-sly-use.templates="core/wcm/components/commons/v1/templates.html" data-sly-use.actionsTpl="actions.html" data-sly-test.isConfigured="${properties.selection}" data-sly-test.hasProduct="${product.url}" ></sly>
Observe que o Modelo Sling para
MyProductTeaser
é usado e atribuído à variávelproduct
. -
Modifique
productteaser.html
para poder chamar o métodoisEcoFriendly
implementado no exercício anterior:code language-html ... <div data-sly-test="${isConfigured && hasProduct}" class="item__root" data-cmp-is="productteaser" data-virtual="${product.virtualProduct}" > <div data-sly-test="${product.showBadge}" class="item__badge"> <span>${properties.text || 'New'}</span> </div> <!--/* Insert call to Eco Friendly here */--> <div data-sly-test="${product.ecoFriendly}" class="item__eco"> <span>Eco Friendly</span> </div> ... </div>
Ao chamar um método Modelo do Sling no HTL, a parte
get
eis
do método é descartada e a primeira letra é em minúsculas. EntãoisShowBadge()
torna-se.showBadge
eisEcoFriendly
torna-se.ecoFriendly
. Com base no valor booleano retornado de.isEcoFriendly()
, determina se<span>Eco Friendly</span>
é exibido.Mais informações sobre
data-sly-test
e outras instruções em bloco HTL podem ser encontradas em A Especificação do HTL. -
Salve as alterações e implante as atualizações no AEM usando suas habilidades em Maven em um terminal de linha de comando:
code language-shell $ cd aem-cif-guides-venia/ $ mvn clean install -PautoInstallSinglePackage,cloud
-
Abra uma nova janela de navegador e navegue até o AEM e o console OSGi > Status > Modelos Sling: http://localhost:4502/system/console/status-slingmodels
-
Pesquise por
MyProductTeaserImpl
e você deverá ver uma linha como a seguinte:code language-plain com.venia.core.models.commerce.MyProductTeaserImpl - venia/components/commerce/productteaser
Essa linha indica que o modelo Sling foi corretamente implantado e mapeado para o componente correto.
-
Atualize para a Página inicial Venia em http://localhost:4502/editor.html/content/venia/us/en.html onde o Teaser do produto foi adicionado.
Se o produto tiver o atributo
eco_friendly
definido como Sim, você deverá ver o texto "Eco Friendly" na página. Tente alternar para produtos diferentes para ver a mudança de comportamento. -
Em seguida, abra o AEM
error.log
para ver as instruções de log adicionadas. Oerror.log
está em<AEM SDK Install Location>/crx-quickstart/logs/error.log
.Pesquise nos logs do AEM para ver as instruções de log adicionadas no Modelo Sling:
code language-plain 2020-08-28 12:57:03.114 INFO [com.venia.core.models.commerce.MyProductTeaserImpl] *** Product is Eco Friendly** ... 2020-08-28 13:01:00.271 INFO [com.venia.core.models.commerce.MyProductTeaserImpl] *** Product is not Eco Friendly** ...
note caution CAUTION Você também pode ver alguns rastreamentos de pilha se o produto usado no teaser não tiver o atributo eco_friendly
como parte de seu conjunto de atributos.
Adicione estilos para o selo ecológico add-styles
Neste ponto, a lógica de quando exibir o símbolo Eco Friendly está funcionando, no entanto, o texto sem formatação poderia usar alguns estilos. Em seguida, adicione um ícone e estilos ao módulo ui.frontend
para concluir a implementação.
-
Baixe o arquivo eco_friendly.svg. Este arquivo é usado como o selo Eco Friendly.
-
Retorne ao IDE e navegue até a pasta
ui.frontend
. -
Adicionar o arquivo
eco_friendly.svg
à pastaui.frontend/src/main/resources/images
: -
Abra o arquivo
productteaser.scss
emui.frontend/src/main/styles/commerce/_productteaser.scss
. -
Adicionar as seguintes regras Sass dentro da classe
.productteaser
:code language-scss .productteaser { ... .item__eco { width: 60px; height: 60px; left: 0px; overflow: hidden; position: absolute; padding: 5px; span { display: block; position: absolute; width: 45px; height: 45px; text-indent: -9999px; background: no-repeat center center url('../resources/images/eco_friendly.svg'); } } ... }
note note NOTE Confira os Componentes principais do CIF de estilo para obter mais detalhes sobre fluxos de trabalho de front-end. -
Salve as alterações e implante as atualizações no AEM usando suas habilidades em Maven em um terminal de linha de comando:
code language-shell $ cd aem-cif-guides-venia/ $ mvn clean install -PautoInstallSinglePackage,cloud
-
Atualize para a Página inicial Venia em http://localhost:4502/editor.html/content/venia/us/en.html onde o Teaser do produto foi adicionado.
Parabéns congratulations
Você personalizou seu primeiro componente CIF do AEM. Você pode baixar os arquivos de solução aqui.
Desafio extra bonus-challenge
Revise a funcionalidade do selo Novo que já foi implementado no Teaser do produto. Tente adicionar uma caixa de seleção extra para os autores controlarem quando o símbolo Eco-Friendly deverá ser exibido. Atualizar a caixa de diálogo do componente em ui.apps/src/main/content/jcr_root/apps/venia/components/commerce/productteaser/_cq_dialog/.content.xml
.