Crear un componente personalizado
- Se aplica a:
- Experience Manager as a Cloud Service
Creado para:
- Principiante
- Desarrollador
Obtenga información sobre cómo crear un componente personalizado para utilizarlo con el Editor de SPA de AEM. Aprenda a desarrollar cuadros de diálogo de autor y modelos Sling para ampliar el modelo JSON y rellenar un componente personalizado.
Objetivo
- Comprenda el papel de los modelos Sling en la manipulación de la API del modelo JSON proporcionada por AEM.
- Obtenga información sobre cómo crear cuadros de diálogo de componentes de AEM.
- Aprenda a crear un componente de AEM custom que sea compatible con el marco del editor de SPA.
Qué va a generar
El enfoque de los capítulos anteriores era desarrollar componentes de SPA y asignarlos a componentes principales de AEM existentes. Este capítulo se centra en cómo crear y ampliar nuevos componentes de AEM y manipular el modelo JSON servido por AEM.
Un Custom Component
simple ilustra los pasos necesarios para crear un componente de AEM nuevo.
Requisitos previos
Revise las herramientas y las instrucciones necesarias para configurar un entorno de desarrollo local.
Obtener el código
-
Descargue el punto de partida para este tutorial mediante Git:
$ git clone git@github.com:adobe/aem-guides-wknd-spa.git $ cd aem-guides-wknd-spa $ git checkout Angular/custom-component-start
-
Implemente el código base en una instancia local de AEM mediante Maven:
$ mvn clean install -PautoInstallSinglePackage
Si usa AEM 6.x, agregue el perfil
classic
:$ mvn clean install -PautoInstallSinglePackage -Pclassic
-
Instale el paquete terminado para el sitio de referencia WKND tradicional. Las imágenes proporcionadas por el sitio de referencia WKND se reutilizarán en el SPA de WKND. El paquete se puede instalar usando Administrador de paquetes de AEM.
Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/custom-component-solution
.
Definición del componente de AEM
Un componente de AEM se define como un nodo y propiedades. En el proyecto, estos nodos y propiedades se representan como archivos XML en el módulo ui.apps
. A continuación, cree el componente AEM en el módulo ui.apps
.
-
Abra la carpeta
ui.apps
en el IDE que desee. -
Vaya a
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components
y cree una carpeta llamadacustom-component
. -
Cree un archivo con el nombre
.content.xml
debajo de la carpetacustom-component
. Rellenecustom-component/.content.xml
con lo siguiente:<?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 nodo es un componente de AEM.jcr:title
es el valor que se muestra a los autores de contenido ycomponentGroup
determina la agrupación de componentes en la interfaz de usuario de creación. -
Debajo de la carpeta
custom-component
, cree otra carpeta denominada_cq_dialog
. -
Debajo de la carpeta
_cq_dialog
cree un archivo denominado.content.xml
y rellénelo con lo siguiente:<?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>
El archivo XML anterior genera un cuadro de diálogo sencillo para
Custom Component
. La parte crítica del archivo es el nodo<message>
interno. Este cuadro de diálogo contiene untextfield
simple denominadoMessage
y persiste el valor del campo de texto en una propiedad denominadamessage
.Se crea un modelo Sling junto a para exponer el valor de la propiedad
message
a través del modelo JSON.NOTE
Puede ver muchos más ejemplos de cuadros de diálogo al ver las definiciones de los componentes principales. También puede ver campos de formulario adicionales, comoselect
,textarea
,pathfield
, disponibles debajo de/libs/granite/ui/components/coral/foundation/form
en CRXDE-Lite.Con un componente tradicional de AEM, normalmente se requiere un script HTL. Dado que la SPA procesa el componente, no se necesita script HTL.
Creación del modelo Sling
Los modelos Sling son objetos Java™ "POJO" (Plain Old Java™ Objects) impulsados por anotaciones que facilitan la asignación de datos de las variables JCR a Java™. Los modelos Sling suelen funcionar para encapsular lógica empresarial compleja del lado del servidor para componentes de AEM.
En el contexto del editor de SPA, los modelos Sling exponen el contenido de un componente a través del modelo JSON mediante una función que utiliza Exportador de modelos Sling.
-
En el IDE de su elección, abra el módulo
core
.CustomComponent.java
yCustomComponentImpl.java
ya se han creado y tachado como parte del código de inicio del capítulo.NOTE
Si utiliza el IDE de código de Visual Studio, puede resultar útil instalar extensiones para Java™. -
Abra la interfaz de Java™
CustomComponent.java
encore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/CustomComponent.java
:Esta es la interfaz Java™ que implementa el modelo Sling.
-
Actualizar
CustomComponent.java
para que extienda la interfazComponentExporter
: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(); }
La implementación de la interfaz
ComponentExporter
es un requisito para que la API del modelo JSON recoja automáticamente el modelo Sling.La interfaz
CustomComponent
incluye un solo método de captadorgetMessage()
. Este es el método que expone el valor del cuadro de diálogo de autor a través del modelo JSON. En el modelo JSON solo se exportan los métodos de captador con parámetros vacíos()
. -
Abra
CustomComponentImpl.java
a lascore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/impl/CustomComponentImpl.java
.Esta es la implementación de la interfaz
CustomComponent
. La anotación@Model
identifica la clase Java™ como modelo Sling. La anotación@Exporter
permite serializar y exportar la clase Java™ a través del Exportador de modelos Sling. -
Actualice la variable estática
RESOURCE_TYPE
para que apunte al componente de AEMwknd-spa-angular/components/custom-component
creado en el ejercicio anterior.static final String RESOURCE_TYPE = "wknd-spa-angular/components/custom-component";
El tipo de recurso del componente es el que enlaza el modelo Sling al componente AEM y, en última instancia, se asigna al componente Angular.
-
Agregue el método
getExportedType()
a la claseCustomComponentImpl
para devolver el tipo de recurso de componente:@Override public String getExportedType() { return CustomComponentImpl.RESOURCE_TYPE; }
Este método es necesario al implementar la interfaz
ComponentExporter
y expone el tipo de recurso que permite la asignación al componente de Angular. -
Actualice el método
getMessage()
para devolver el valor de la propiedadmessage
conservada por el cuadro de diálogo de autor. Usar la anotación@ValueMap
es asignar el valor JCRmessage
a una variable Java™:import org.apache.commons.lang3.StringUtils; ... @ValueMapValue private String message; @Override public String getMessage() { return StringUtils.isNotBlank(message) ? message.toUpperCase() : null; }
Se agrega alguna "lógica empresarial" adicional para devolver el valor del mensaje como mayúsculas. Esto nos permite ver la diferencia entre el valor sin procesar almacenado por el cuadro de diálogo del autor y el valor expuesto por el modelo Sling.
NOTE
Puede ver CustomComponentImpl.java finalizado aquí.
Actualizar el componente de Angular
Ya se ha creado el código Angular para el componente personalizado. A continuación, realice algunas actualizaciones para asignar el componente Angular al componente AEM.
-
En el módulo
ui.frontend
, abra el archivoui.frontend/src/app/components/custom/custom.component.ts
-
Observe la línea
@Input() message: string;
. Se espera que el valor en mayúsculas transformado se asigne a esta variable. -
Importe el objeto
MapTo
desde AEM SPA Editor JS SDK y utilícelo para asignarlo al componente AEM:+ 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.html
y observe que el valor de{{message}}
se muestra en una etiqueta<h2>
. -
Abra
custom.component.css
y agregue la regla siguiente::host-context { display: block; }
Para que el marcador de posición del editor de AEM se muestre correctamente cuando el componente está vacío,
:host-context
u otro<div>
debe establecerse endisplay: block;
. -
Implemente las actualizaciones en un entorno local de AEM desde la raíz del directorio del proyecto con sus habilidades con Maven:
$ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage
Actualizar la directiva de plantilla
A continuación, vaya a AEM para comprobar las actualizaciones y permitir que Custom Component
se agregue al SPA.
-
Compruebe el registro del nuevo modelo Sling navegando hasta http://localhost:4502/system/console/status-slingmodels.
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'
Debería ver las dos líneas anteriores que indican que
CustomComponentImpl
está asociado con el componentewknd-spa-angular/components/custom-component
y que está registrado a través del Exportador de modelos Sling. -
Vaya a la plantilla de página de la SPA en http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.
-
Actualice la directiva del contenedor de diseño para agregar el nuevo
Custom Component
como componente permitido:Guarde los cambios en la directiva y observe
Custom Component
como un componente permitido:
Crear el componente personalizado
A continuación, cree Custom Component
con el Editor de SPA de AEM.
-
Vaya a http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.
-
En el modo
Edit
, agregueCustom Component
aLayout Container
: -
Abra el cuadro de diálogo del componente e introduzca un mensaje que contenga letras minúsculas.
Este es el cuadro de diálogo que se creó en función del archivo XML anteriormente en el capítulo.
-
Guarde los cambios. Observe que el mensaje que se muestra está en mayúsculas.
-
Vea el modelo JSON navegando a http://localhost:4502/content/wknd-spa-angular/us/en.model.json. Buscar
wknd-spa-angular/components/custom-component
:"custom_component_208183317": { "message": "HELLO WORLD", ":type": "wknd-spa-angular/components/custom-component" }
Observe que el valor JSON se establece en mayúsculas en función de la lógica agregada al modelo Sling.
Enhorabuena.
¡Enhorabuena! Ha aprendido a crear un componente personalizado de AEM y a trabajar los modelos Sling y los cuadros de diálogo con el modelo JSON.
Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/custom-component-solution
.
Siguientes pasos
Ampliar un componente principal: aprenda a ampliar un componente principal existente para utilizarlo con el Editor de SPA de AEM. Entender cómo añadir propiedades y contenido a un componente existente es una técnica potente para expandir las capacidades de una implementación de AEM SPA Editor.