Skapa en anpassad komponent custom-component
Lär dig hur du skapar en anpassad komponent som ska användas med AEM SPA. Lär dig hur du utvecklar redigeringsdialogrutor och Sling-modeller för att utöka JSON-modellen så att den fyller i en anpassad komponent.
Syfte
- Förstå Sling Models roll när det gäller att hantera JSON-modellens API som tillhandahålls av AEM.
- Lär dig hur du skapar AEM komponentdialogrutor.
- Lär dig att skapa en anpassad AEM-komponent som är kompatibel med SPA redigeringsramverk.
Vad du ska bygga
Fokus på tidigare kapitel var att utveckla SPA komponenter och mappa dem till befintliga AEM kärnkomponenter. I det här kapitlet fokuseras på hur du skapar och utökar nya AEM komponenter och manipulerar den JSON-modell som AEM hanterar.
En enkel Custom Component
illustrerar de steg som behövs för att skapa en ny AEM.
Förutsättningar
Granska de verktyg och instruktioner som krävs för att konfigurera en lokal utvecklingsmiljö.
Hämta koden
-
Hämta startpunkten för den här självstudiekursen via 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
-
Distribuera kodbasen till en lokal AEM med Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackage
Om du använder AEM 6.x lägger du till profilen
classic
:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic
-
Installera det färdiga paketet för den traditionella WKND-referensplatsen. Bilderna som tillhandahålls av WKND-referensplatsen återanvänds på WKND-SPA. Paketet kan installeras med AEM Package Manager.
Du kan alltid visa den färdiga koden på GitHub eller checka ut koden lokalt genom att växla till grenen Angular/custom-component-solution
.
Definiera AEM
En AEM definieras som en nod och egenskaper. I projektet representeras dessa noder och egenskaper som XML-filer i modulen ui.apps
. Skapa sedan AEM i modulen ui.apps
.
-
Öppna mappen
ui.apps
i den utvecklingsmiljö du vill använda. -
Navigera till
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components
och skapa en mapp med namnetcustom-component
. -
Skapa en fil med namnet
.content.xml
under mappencustom-component
. Fyll icustom-component/.content.xml
med följande: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"
- identifierar att den här noden är en AEM.jcr:title
är det värde som visas för innehållsförfattare ochcomponentGroup
bestämmer grupperingen av komponenter i redigeringsgränssnittet. -
Skapa en annan mapp med namnet
_cq_dialog
under mappencustom-component
. -
Under mappen
_cq_dialog
skapar du en fil med namnet.content.xml
och fyller i den med följande: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>
XML-filen ovan genererar en enkel dialogruta för
Custom Component
. Den kritiska delen av filen är den inre<message>
-noden. Den här dialogrutan innehåller en enkeltextfield
med namnetMessage
och behåller textfältets värde till egenskapenmessage
.En Sling-modell skapas bredvid för att visa värdet för egenskapen
message
via JSON-modellen.note note NOTE Du kan visa fler exempel på dialogrutor genom att visa Core Component Definition. Du kan även visa ytterligare formulärfält, som select
,textarea
,pathfield
, som är tillgängliga under/libs/granite/ui/components/coral/foundation/form
i CRXDE-Lite.I en traditionell AEM krävs vanligtvis ett HTML-skript. Eftersom SPA återger komponenten behövs inget HTML-skript.
Skapa segmentmodellen
Sling Models är annoteringsdrivna Java™ "POJOs" (Plain Old Java™ Objects) som gör det enklare att mappa data från JCR till Java™-variabler. Sling Models fungerar vanligtvis för att kapsla in komplex affärslogik på serversidan för AEM komponenter.
I SPA Editor visar Sling Models en komponents innehåll via JSON-modellen via en funktion som använder Sling Model Exporter.
-
Öppna modulen
core
i den IDE du väljer.CustomComponent.java
ochCustomComponentImpl.java
har redan skapats och bäddats ut som en del av kapitelstartkoden.note note NOTE Om du använder Visual Studio Code IDE kan det vara praktiskt att installera tillägg för Java™. -
Öppna Java™-gränssnittet
CustomComponent.java
påcore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/CustomComponent.java
:Detta är det Java™-gränssnitt som implementeras av Sling Model.
-
Uppdatera
CustomComponent.java
så att det utökar gränssnittet förComponentExporter
: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(); }
Implementering av gränssnittet
ComponentExporter
är ett krav för att Sling-modellen ska hämtas automatiskt av JSON-modellens API.Gränssnittet
CustomComponent
innehåller en enda get-metod,getMessage()
. Det här är metoden som visar värdet för författardialogrutan via JSON-modellen. Endast get-metoder med tomma parametrar()
exporteras i JSON-modellen. -
Öppna
CustomComponentImpl.java
core/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/impl/CustomComponentImpl.java
.Detta är implementeringen av gränssnittet
CustomComponent
. Anteckningen@Model
identifierar Java™-klassen som en Sling Model. Anteckningen@Exporter
gör att Java™-klassen kan serialiseras och exporteras via Sling Model Exporter. -
Uppdatera den statiska variabeln
RESOURCE_TYPE
så att den pekar på den AEM komponentenwknd-spa-angular/components/custom-component
som skapades i föregående övning.code language-java static final String RESOURCE_TYPE = "wknd-spa-angular/components/custom-component";
Komponentens resurstyp är den som binder Sling-modellen till AEM-komponenten och mappar slutligen till komponenten Angular.
-
Lägg till metoden
getExportedType()
i klassenCustomComponentImpl
för att returnera komponentresurstypen:code language-java @Override public String getExportedType() { return CustomComponentImpl.RESOURCE_TYPE; }
Den här metoden krävs vid implementering av
ComponentExporter
-gränssnittet och visar den resurstyp som tillåter mappningen till Angular-komponenten. -
Uppdatera metoden
getMessage()
för att returnera värdet för egenskapenmessage
som bevaras av författardialogrutan. Använd@ValueMap
-anteckningen för att mappa JCR-värdetmessage
till en Java™-variabel:code language-java import org.apache.commons.lang3.StringUtils; ... @ValueMapValue private String message; @Override public String getMessage() { return StringUtils.isNotBlank(message) ? message.toUpperCase() : null; }
Ytterligare"affärslogik" läggs till för att returnera värdet för meddelandet som versal. På så sätt kan vi se skillnaden mellan det råvärde som lagras av författardialogrutan och det värde som exponeras av Sling-modellen.
note note NOTE Du kan visa den färdiga CustomComponentImpl.java här.
Uppdatera Angular-komponenten
Koden för den anpassade Angularna har redan skapats. Därefter gör du några uppdateringar för att mappa Angularna till AEM.
-
Öppna filen
ui.frontend/src/app/components/custom/custom.component.ts
i modulenui.frontend
-
Observera raden
@Input() message: string;
. Det omformade versalvärdet förväntas mappas till den här variabeln. -
Importera objektet
MapTo
från AEM JS SDK för redigeraren och använd det för att mappa till den AEM komponenten: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);
-
Öppna
cutom.component.html
och observera att värdet för{{message}}
visas i en<h2>
-tagg. -
Öppna
custom.component.css
och lägg till följande regel:code language-css :host-context { display: block; }
För att AEM platshållare för redigeraren ska visas korrekt när komponenten är tom måste
:host-context
eller en annan<div>
anges tilldisplay: block;
. -
Distribuera uppdateringarna i en lokal AEM från projektets rot med hjälp av dina Maven-kunskaper:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage
Uppdatera mallprincipen
Navigera sedan till AEM för att verifiera uppdateringarna och tillåt att Custom Component
läggs till i SPA.
-
Verifiera registreringen av den nya Sling-modellen genom att gå till 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'
Du bör se de två raderna ovan som anger att
CustomComponentImpl
är associerad med komponentenwknd-spa-angular/components/custom-component
och att den är registrerad via Sling Model Exporter. -
Navigera till SPA sidmall på http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.
-
Uppdatera layoutbehållarens princip så att den nya
Custom Component
läggs till som en tillåten komponent:Spara ändringarna i principen och observera
Custom Component
som en tillåten komponent:
Skapa den anpassade komponenten
Därefter redigerar du Custom Component
med AEM SPA Editor.
-
Gå till http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.
-
I
Edit
-läget lägger du tillCustom Component
iLayout Container
: -
Öppna komponentens dialogruta och skriv ett meddelande som innehåller gemener.
Det här är den dialogruta som skapades baserat på XML-filen tidigare i kapitlet.
-
Spara ändringarna. Observera att det visade meddelandet är i versaler.
-
Visa JSON-modellen genom att gå till http://localhost:4502/content/wknd-spa-angular/us/en.model.json. Sök efter
wknd-spa-angular/components/custom-component
:code language-json "custom_component_208183317": { "message": "HELLO WORLD", ":type": "wknd-spa-angular/components/custom-component" }
Observera att JSON-värdet är inställt på alla versala bokstäver baserat på den logik som lagts till i Sling-modellen.
Grattis! congratulations
Grattis! Du har lärt dig att skapa en anpassad AEM och att Sling-modeller och dialogrutor fungerar med JSON-modellen.
Du kan alltid visa den färdiga koden på GitHub eller checka ut koden lokalt genom att växla till grenen Angular/custom-component-solution
.
Nästa steg next-steps
Utöka en kärnkomponent - Lär dig hur du utökar en befintlig kärnkomponent som ska användas med AEM SPA. Att förstå hur du lägger till egenskaper och innehåll i en befintlig komponent är en kraftfull teknik som utökar funktionerna i en AEM redigeringsimplementering.