Criar um componente personalizado custom-component
- O editor universal para editar conteúdo headless visualmente.
- O editor de fragmentos de conteúdo para editar conteúdo headless com base em formulários.
Saiba como criar um componente personalizado a ser usado com o Editor SPA do AEM. Saiba como desenvolver caixas de diálogo de criação e Modelos Sling para estender o modelo JSON e preencher um componente personalizado.
Objetivo
- Entenda a função dos Modelos do Sling na manipulação da API do modelo JSON fornecida pelo AEM.
- Entenda como criar caixas de diálogo de componente do AEM.
- Saiba como criar um Componente AEM personalizado que seja compatível com a estrutura do editor de SPA.
O que você vai criar
O foco dos capítulos anteriores era desenvolver componentes de SPA e mapeá-los para Componentes principais do AEM existentes. Este capítulo se concentra em como criar e estender novos componentes do AEM e manipular o modelo JSON fornecido pelo AEM.
Um simples Custom Component ilustra as etapas necessárias para criar um novo componente do AEM.
Pré-requisitos
Revise as ferramentas e instruções necessárias para configurar um ambiente de desenvolvimento local.
Obter o código
-
Baixe o ponto de partida para este tutorial pelo Git:
code language-shell $ git clone git@github.com:adobe/aem-guides-wknd-spa.git $ cd aem-guides-wknd-spa $ git checkout Angular/custom-component-start -
Implante a base de código em uma instância do AEM local usando Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackageSe estiver usando o AEM 6.x, adicione o perfil
classic:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic -
Instale o pacote concluído para o site de referência WKND tradicional. As imagens fornecidas pelo site de referência WKND são reutilizadas no SPA do WKND. O pacote pode ser instalado usando o Gerenciador de Pacotes da AEM.
do Gerenciador de Pacotes
Você sempre pode exibir o código concluído em GitHub ou conferir o código localmente alternando para a ramificação Angular/custom-component-solution.
Definir o componente do AEM
Um componente do AEM é definido como um nó e propriedades. No projeto, esses nós e propriedades são representados como arquivos XML no módulo ui.apps. Em seguida, crie o componente AEM no módulo ui.apps.
-
Abra a pasta
ui.appsno IDE de sua escolha. -
Navegue até
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/componentse crie uma pasta chamadacustom-component. -
Crie um arquivo chamado
.content.xmlabaixo da pastacustom-component. Preencha ocustom-component/.content.xmlcom o seguinte: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:primaryType="cq:Component" jcr:title="Custom Component" componentGroup="WKND SPA Angular - Content"/>
jcr:primaryType="cq:Component"- identifica que este nó é um componente do AEM.jcr:titleé o valor exibido para os Autores de Conteúdo ecomponentGroupdetermina o agrupamento de componentes na interface de criação. -
Abaixo da pasta
custom-component, crie outra pasta chamada_cq_dialog. -
Abaixo da pasta
_cq_dialog, crie um arquivo chamado.content.xmle preencha-o com o seguinte:code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:granite="http://www.adobe.com/jcr/granite/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" jcr:primaryType="nt:unstructured" jcr:title="Custom Component" sling:resourceType="cq/gui/components/authoring/dialog"> <content jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/container"> <items jcr:primaryType="nt:unstructured"> <tabs jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/tabs" maximized="{Boolean}true"> <items jcr:primaryType="nt:unstructured"> <properties jcr:primaryType="nt:unstructured" jcr:title="Properties" sling:resourceType="granite/ui/components/coral/foundation/container" margin="{Boolean}true"> <items jcr:primaryType="nt:unstructured"> <columns jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns" margin="{Boolean}true"> <items jcr:primaryType="nt:unstructured"> <column jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/container"> <items jcr:primaryType="nt:unstructured"> <message jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield" fieldDescription="The text to display on the component." fieldLabel="Message" name="./message"/> </items> </column> </items> </columns> </items> </properties> </items> </tabs> </items> </content> </jcr:root>
O arquivo XML acima gera uma caixa de diálogo simples para
Custom Component. A parte crítica do arquivo é o nó interno<message>. Esta caixa de diálogo contém umtextfieldsimples chamadoMessagee mantém o valor do campo de texto para uma propriedade chamadamessage.Um Modelo Sling é criado próximo a expor o valor da propriedade
messagepor meio do modelo JSON.note note NOTE Você pode exibir muito mais exemplos de caixas de diálogo ao exibir as definições dos Componentes principais. Você também pode exibir campos de formulário adicionais, como select,textarea,pathfield, disponíveis em/libs/granite/ui/components/coral/foundation/formno CRXDE-Lite.Com um componente tradicional do AEM, geralmente é necessário um script HTL. Como o SPA renderiza o componente, nenhum script HTL é necessário.
Criar o modelo do Sling
Os Modelos do Sling são objetos POJO (Plain Old Java™ Objects) do Java™ orientados por anotações que facilitam o mapeamento de dados do JCR para as variáveis do Java™. Os Modelos do Sling geralmente funcionam para encapsular uma lógica de negócios complexa do lado do servidor para Componentes do AEM.
No contexto do Editor SPA, os Modelos Sling expõem o conteúdo de um componente por meio do modelo JSON por meio de um recurso que usa o Exportador de Modelo Sling.
-
No IDE de sua escolha, abra o módulo
core.CustomComponent.javaeCustomComponentImpl.javajá foram criados e extraídos como parte do código inicial do capítulo.note note NOTE Se estiver usando o Visual Studio Code IDE, pode ser útil instalar extensões para o Java™. -
Abra a interface Java™
CustomComponent.javaemcore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/CustomComponent.java:
Essa é a interface Java™ implementada pelo Modelo Sling.
-
Atualizar
CustomComponent.javapara que ele estenda a interfaceComponentExporter:code language-java package com.adobe.aem.guides.wknd.spa.angular.core.models; import com.adobe.cq.export.json.ComponentExporter; public interface CustomComponent extends ComponentExporter { public String getMessage(); }A implementação da interface
ComponentExporteré um requisito para que o Modelo Sling seja selecionado automaticamente pela API do modelo JSON.A interface
CustomComponentinclui um único método gettergetMessage(). Esse é o método que expõe o valor da caixa de diálogo do autor por meio do modelo JSON. Somente métodos Getter com parâmetros vazios()são exportados no modelo JSON. -
Abrir
CustomComponentImpl.javaemcore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/impl/CustomComponentImpl.java.Esta é a implementação da interface
CustomComponent. A anotação@Modelidentifica a classe Java™ como um Modelo Sling. A anotação@Exporterpermite que a classe Java™ seja serializada e exportada por meio do Exportador de Modelo do Sling. -
Atualize a variável estática
RESOURCE_TYPEpara apontar para o componente AEMwknd-spa-angular/components/custom-componentcriado no exercício anterior.code language-java static final String RESOURCE_TYPE = "wknd-spa-angular/components/custom-component";O tipo de recurso do componente é o que vincula o Modelo do Sling ao componente do AEM e, por fim, mapeia para o componente do Angular.
-
Adicione o método
getExportedType()à classeCustomComponentImplpara retornar o tipo de recurso do componente:code language-java @Override public String getExportedType() { return CustomComponentImpl.RESOURCE_TYPE; }Este método é necessário ao implementar a interface
ComponentExportere expõe o tipo de recurso que permite o mapeamento para o componente do Angular. -
Atualize o método
getMessage()para retornar o valor da propriedademessagepersistida pela caixa de diálogo do autor. Use a anotação@ValueMappara mapear o valor JCRmessagepara uma variável Java™:code language-java import org.apache.commons.lang3.StringUtils; ... @ValueMapValue private String message; @Override public String getMessage() { return StringUtils.isNotBlank(message) ? message.toUpperCase() : null; }Alguma "lógica de negócios" adicional é adicionada para retornar o valor da mensagem como maiúsculas. Isso nos permite ver a diferença entre o valor bruto armazenado pela caixa de diálogo do autor e o valor exposto pelo Modelo do Sling.
note note NOTE Você pode exibir o CustomComponentImpl.java concluído aqui.
Atualizar o componente do Angular
O código Angular do componente personalizado já foi criado. Em seguida, faça algumas atualizações para mapear o componente Angular para o componente AEM.
-
No módulo
ui.frontend, abra o arquivoui.frontend/src/app/components/custom/custom.component.ts -
Observe a linha
@Input() message: string;. Espera-se que o valor em maiúsculas transformado seja mapeado para essa variável. -
Importe o objeto
MapTodo AEM SPA Editor JS SDK e use-o para mapear para o componente AEM:code language-diff + import {MapTo} from '@adobe/cq-angular-editable-components'; ... export class CustomComponent implements OnInit { ... } + MapTo('wknd-spa-angular/components/custom-component')(CustomComponent, CustomEditConfig); -
Abra
cutom.component.htmle observe que o valor de{{message}}é exibido ao lado de uma tag<h2>. -
Abra
custom.component.csse adicione a seguinte regra:code language-css :host-context { display: block; }Para que o Espaço Reservado do Editor do AEM seja exibido corretamente, quando o componente estiver vazio, o
:host-contextou outro<div>precisa ser definido comodisplay: block;. -
Implante as atualizações em um ambiente local do AEM a partir da raiz do diretório do projeto, usando suas habilidades em Maven:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage
Atualizar a política do modelo
Em seguida, navegue até o AEM para verificar as atualizações e permitir que o Custom Component seja adicionado ao SPA.
-
Verifique o registro do novo Modelo do Sling navegando até http://localhost:4502/system/console/status-slingmodels.
code language-plain com.adobe.aem.guides.wknd.spa.angular.core.models.impl.CustomComponentImpl - wknd-spa-angular/components/custom-component com.adobe.aem.guides.wknd.spa.angular.core.models.impl.CustomComponentImpl exports 'wknd-spa-angular/components/custom-component' with selector 'model' and extension '[Ljava.lang.String;@6fb4a693' with exporter 'jackson'Você deve ver as duas linhas acima que indicam que
CustomComponentImplestá associado ao componentewknd-spa-angular/components/custom-componente que ele está registrado por meio do Exportador de Modelo do Sling. -
Navegue até o Modelo de página do SPA em http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.
-
Atualize a política do Contêiner de Layout para adicionar o novo
Custom Componentcomo um componente permitido:
Salve as alterações na política e observe o
Custom Componentcomo um componente permitido:
Criar o componente personalizado
Em seguida, crie o Custom Component usando o Editor SPA do AEM.
-
Navegue até http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.
-
No modo
Edit, adicione oCustom ComponentaoLayout Container:
-
Abra a caixa de diálogo do componente e insira uma mensagem que contenha algumas letras minúsculas.
Esta é a caixa de diálogo que foi criada com base no arquivo XML mencionado anteriormente no capítulo.
-
Salve as alterações. Observe que a mensagem exibida está em maiúsculas.
-
Exiba o modelo JSON navegando até http://localhost:4502/content/wknd-spa-angular/us/en.model.json. Pesquisar por
wknd-spa-angular/components/custom-component:code language-json "custom_component_208183317": { "message": "HELLO WORLD", ":type": "wknd-spa-angular/components/custom-component" }Observe que o valor JSON está definido como todas as letras maiúsculas com base na lógica adicionada ao Modelo Sling.
Parabéns! congratulations
Parabéns, você aprendeu a criar um componente AEM personalizado e como os Modelos e caixas de diálogo do Sling funcionam com o modelo JSON.
Você sempre pode exibir o código concluído em GitHub ou conferir o código localmente alternando para a ramificação Angular/custom-component-solution.
Próximas etapas next-steps
Estender um Componente Principal - Saiba como estender um Componente Principal existente para ser usado com o Editor SPA do AEM. Entender como adicionar propriedades e conteúdo a um componente existente é uma técnica poderosa para expandir os recursos de uma implementação do Editor SPA do AEM.