Crear un componente personalizado custom-component
AEM SPA Obtenga información sobre cómo crear un componente personalizado para utilizarlo con el Editor de. Aprenda a desarrollar cuadros de diálogo de autor y modelos Sling para ampliar el modelo JSON y rellenar un componente personalizado.
Objetivo
- AEM Comprenda el papel de los modelos Sling en la manipulación de la API del modelo JSON proporcionada por los usuarios de la interfaz de usuario de.
- AEM Obtenga información sobre cómo crear cuadros de diálogo de componentes de.
- AEM SPA Aprenda a crear un componente personalizado de la aplicación que sea compatible con el marco de trabajo del editor de.
Qué va a generar
SPA AEM El enfoque de los capítulos anteriores era el desarrollo de componentes de y su asignación a componentes principales existentes. AEM AEM Este capítulo se centra en cómo crear y ampliar nuevos componentes de y en cómo manipular el modelo JSON proporcionado por los usuarios de la aplicación de código de tiempo de la aplicación de código de tiempo de la aplicación de código de tiempo.
AEM Un Custom Component
simple ilustra los pasos necesarios para crear un nuevo componente de red de la red de la red (net-new) de la red de la red de la red.
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
-
AEM Implemente el código base en una instancia de local mediante Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackage
AEM Si usa 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. SPA Las imágenes proporcionadas por el sitio de referencia WKND se reutilizarán en el WKND de la. AEM El paquete se puede instalar usando el Administrador de paquetes de.
Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/custom-component-solution
.
AEM Definición del componente de
AEM Un componente 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
. AEM A continuación, cree el componente de 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: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"/>
AEM
jcr:primaryType="cq:Component"
: identifica que este nodo es un componente de la.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: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 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 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/form
en CRXDE-Lite.AEM Con un componente tradicional de la, se suele requerir un script HTL. SPA Dado que el procesa el componente, no se necesita ningún 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™. AEM Los modelos Sling suelen funcionar para encapsular lógica empresarial compleja del lado del servidor para componentes de la.
SPA En el contexto del Editor de modelos de Sling, los modelos de Sling exponen el contenido de un componente a través del modelo JSON mediante una función que utiliza el Exportador del modelo 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 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.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
: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
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. -
AEM Actualice la variable estática
RESOURCE_TYPE
para que apunte al componente de lawknd-spa-angular/components/custom-component
creado en el ejercicio anterior.code language-java static final String RESOURCE_TYPE = "wknd-spa-angular/components/custom-component";
AEM El tipo de recurso del componente es el que enlaza el modelo Sling al componente de y, en última instancia, se asigna al componente de Angular.
-
Agregue el método
getExportedType()
a la claseCustomComponentImpl
para 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
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™: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í.
Actualización del componente Angular
Ya se ha creado el código de Angular del componente personalizado. A continuación, realice algunas actualizaciones para asignar el componente de Angular AEM al componente de.
-
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. -
AEM SPA AEM Importe el objeto
MapTo
desde el SDK de JS de Editor de y utilícelo para asignarlo al componente de: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.html
y observe que el valor de{{message}}
se muestra en una etiqueta<h2>
. -
Abra
custom.component.css
y agregue la regla siguiente:code language-css :host-context { display: block; }
AEM Para que el marcador de posición del Editor de la se muestre correctamente cuando el componente está vacío,
:host-context
u otro<div>
debe establecerse endisplay: block;
. -
AEM Implemente las actualizaciones en un entorno de trabajo local 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
AEM SPA A continuación, navegue hasta la para comprobar las actualizaciones y permitir que se agregue Custom Component
a la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos de la lista de elementos.
-
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
CustomComponentImpl
está asociado con el componentewknd-spa-angular/components/custom-component
y que está registrado a través del Exportador de modelos Sling. -
SPA Vaya a la plantilla de página de la página de 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
AEM SPA A continuación, cree el Custom Component
mediante el Editor de de trabajo.
-
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
: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
AEM ¡Enhorabuena! Ha aprendido a crear un componente de personalizado y cómo los modelos Sling y los cuadros de diálogo funcionan 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
AEM SPA Ampliar un componente principal: aprenda a ampliar un componente principal existente para utilizarlo con el Editor de. AEM SPA Comprender cómo añadir propiedades y contenido a un componente existente es una técnica potente para ampliar las capacidades de una implementación de Editor de segmentos de tiempo de ejecución de la aplicación de un editor de segmentos de tiempo de ejecución de la aplicación de un editor de tiempo de ejecución de la.