Crear un componente personalizado custom-component
- El Editor universal para editar contenido sin encabezado de forma visual.
- El Editor de fragmentos de contenido para la edición de contenido sin encabezado basada en formularios.
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:
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 -
Implemente el código base en una instancia local de AEM mediante Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackageSi usa AEM 6.x, agregue el perfil
classic:code language-shell $ 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.appsen el IDE que desee. -
Vaya a
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/componentsy cree una carpeta llamadacustom-component. -
Cree un archivo con el nombre
.content.xmldebajo de la carpetacustom-component. Rellenecustom-component/.content.xmlcon lo siguiente: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 nodo es un componente de AEM.jcr:titlees el valor que se muestra a los autores de contenido ycomponentGroupdetermina 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_dialogcree un archivo denominado.content.xmly rellénelo con lo siguiente: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>
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 untextfieldsimple denominadoMessagey 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
messagea través del modelo JSON.note note 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, como select,textarea,pathfield, disponibles debajo de/libs/granite/ui/components/coral/foundation/formen 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.javayCustomComponentImpl.javaya se han creado y tachado como parte del código de inicio del capítulo.note note NOTE Si utiliza el IDE de código de Visual Studio, puede resultar útil instalar extensiones para Java™. -
Abra la interfaz de Java™
CustomComponent.javaencore/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.javapara que extienda la interfazComponentExporter: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(); }La implementación de la interfaz
ComponentExporteres un requisito para que la API del modelo JSON recoja automáticamente el modelo Sling.La interfaz
CustomComponentincluye 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.javaa 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@Modelidentifica la clase Java™ como modelo Sling. La anotación@Exporterpermite serializar y exportar la clase Java™ a través del Exportador de modelos Sling. -
Actualice la variable estática
RESOURCE_TYPEpara que apunte al componente de AEMwknd-spa-angular/components/custom-componentcreado en el ejercicio anterior.code language-java 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 claseCustomComponentImplpara devolver el tipo de recurso de componente:code language-java @Override public String getExportedType() { return CustomComponentImpl.RESOURCE_TYPE; }Este método es necesario al implementar la interfaz
ComponentExportery 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 propiedadmessageconservada por el cuadro de diálogo de autor. Usar la anotación@ValueMapes asignar el valor JCRmessagea una variable 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; }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 note 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
MapTodesde AEM SPA Editor JS SDK y utilícelo para asignarlo al 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.htmly observe que el valor de{{message}}se muestra en una etiqueta<h2>. -
Abra
custom.component.cssy agregue la regla siguiente:code language-css :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-contextu 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:
code language-shell $ 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.
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'Debería ver las dos líneas anteriores que indican que
CustomComponentImplestá asociado con el componentewknd-spa-angular/components/custom-componenty 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 Componentcomo componente permitido:
Guarde los cambios en la directiva y observe
Custom Componentcomo 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 ComponentaLayout 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:code language-json "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. congratulations
¡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 next-steps
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.