Erstellen einer benutzerdefinierten Komponente custom-component
- der universelle Editor zum visuellen Bearbeiten von Headless-Inhalten.
- der Inhaltsfragmenteditor zur formularbasierten Bearbeitung von Headless-Inhalten
Erfahren Sie, wie Sie eine benutzerdefinierte Komponente erstellen, die mit dem AEM-SPA-Editor verwendet werden kann. Erfahren Sie, wie Sie Autorendialogfelder und Sling-Modelle entwickeln, um das JSON-Modell zu erweitern und eine benutzerdefinierte Komponente zu füllen.
Ziel
- Machen Sie sich mit der Rolle von Sling-Modellen bei der Bearbeitung der von AEM bereitgestellten JSON-Modell-API vertraut.
- Erfahren Sie, wie Sie AEM-Komponentendialogfelder erstellen.
- Erfahren Sie, wie Sie eine benutzerdefinierte AEM-Komponente erstellen, die mit dem SPA-Editor-Framework kompatibel ist.
Was Sie erstellen werden
Der Schwerpunkt früherer Kapitel lag in der Entwicklung der SPA-Komponenten und deren Zuordnung zu vorhandenen AEM-Kernkomponenten. In diesem Kapitel wird beschrieben, wie Sie neue AEM-Komponenten erstellen und erweitern und das von AEM bereitgestellte JSON-Modell bearbeiten.
Eine einfache Custom Component veranschaulicht die Schritte, die zum Erstellen einer neuen AEM-Komponente erforderlich sind.
Voraussetzungen
Vergegenwärtigen Sie sich die erforderlichen Tools und Anweisungen zum Einrichten einer lokalen Entwicklungsumgebung.
Abrufen des Codes
-
Laden Sie den Ausgangspunkt für dieses Tutorial über Git herunter:
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 -
Stellen Sie die Code-Basis mithilfe von Maven in einer lokalen AEM-Instanz bereit:
code language-shell $ mvn clean install -PautoInstallSinglePackageWenn Sie AEM 6.x verwenden, fügen Sie das Profil
classichinzu:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic -
Installieren Sie das fertige Paket für die herkömmliche WKND-Referenz-Site. Die Bilder von der WKND-Referenz-Site werden auf der WKND-SPA wiederverwendet. Das Paket kann mit AEM Package Manager installiert werden.
Sie können den fertigen Code jederzeit auf GitHub einsehen oder den Code lokal auschecken, indem Sie zur Verzweigung Angular/custom-component-solution wechseln.
Definieren der AEM-Komponente
Eine AEM-Komponente ist definiert als ein Knoten und Eigenschaften. Im Projekt werden diese Knoten und Eigenschaften als XML-Dateien im ui.apps-Modul dargestellt. Erstellen Sie anschließend die AEM-Komponente im ui.apps-Modul.
-
Öffnen Sie den Ordner
ui.appsin der IDE Ihrer Wahl. -
Navigieren Sie zu
ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/componentsund erstellen Sie einen Ordner namenscustom-component. -
Erstellen Sie eine Datei mit dem Namen
.content.xmlunter dem Ordnercustom-component. Befüllen Siecustom-component/.content.xmlmit dem Folgenden: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": gibt an, dass dieser Knoten eine AEM-Komponente ist.jcr:titleist der Wert, der den Inhaltsautorinnen und -autoren angezeigt wird, undcomponentGroupbestimmt die Gruppierung von Komponenten in der Authoring-Benutzeroberfläche. -
Erstellen Sie unter dem Ordner
custom-componenteinen weiteren Ordner mit dem Namen_cq_dialog. -
Legen Sie unter dem Ordner
_cq_dialogeine Datei mit dem Namen.content.xmlan und befüllen Sie sie mit folgendem Inhalt: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>
Die obige XML-Datei generiert ein einfaches Dialogfeld für
Custom Component. Der kritische Teil der Datei ist der innere<message>-Knoten. Dieses Dialogfeld enthält ein einfachestextfieldmit NamenMessageund behält den Wert des Textfelds in einer Eigenschaft mit dem Namenmessagebei.Als Nächstes wird ein Sling-Modell erstellt, um den Wert der
message-Eigenschaft über das JSON-Modell offenzulegen.note note NOTE Sie können viele weitere Beispiele für Dialoge in den Definitionen der Kernkomponenten sehen. Sie können auch zusätzliche Formularfelder anzeigen, zum Beispiel select,textarea,pathfield, verfügbar unter/libs/granite/ui/components/coral/foundation/formin CRXDE-Lite.Bei einer herkömmlichen AEM-Komponente ist normalerweise ein HTL-Skript erforderlich. Da die SPA die Komponente rendert, ist kein HTL-Skript erforderlich.
Erstellen des Sling-Modells
Sling-Modelle sind von Anmerkungen gesteuerte Java™-„POJOs“ (Plain Old Java™ Objects), die die Zuordnung von Daten aus JCR zu Java™-Variablen erleichtern. Sling-Modelle dienen normalerweise zum Einkapseln komplexer Server-seitiger Business-Logik für AEM-Komponenten.
Im Zusammenhang mit dem SPA-Editor stellen Sling-Modelle den Inhalt einer Komponente durch das JSON-Modell über eine Funktion mit dem Sling-Modell-Exporter dar.
-
Öffnen Sie das
core-Modul in der IDE Ihrer Wahl.CustomComponent.javaundCustomComponentImpl.javawurden bereits als Teil des Codes zu Beginn des Kapitels erstellt und ausgelagert.note note NOTE Bei Verwendung der Visual Studio Code-IDE kann es hilfreich sein, die Erweiterungen für Java™ zu installieren. -
Öffnen Sie die Java™-Benutzeroberfläche
CustomComponent.javauntercore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/CustomComponent.java:
Dies ist die Java™-Schnittstelle, die vom Sling-Modell implementiert wird.
-
Aktualisieren Sie
CustomComponent.javaso, dass es die SchnittstelleComponentExportererweitert: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(); }Das Implementieren der
ComponentExporter-Schnittstelle ist eine Voraussetzung dafür, dass das Sling-Modell automatisch von der JSON-Modell-API erfasst wird.Die
CustomComponent-Schnittstelle enthält eine einzige Getter-MethodegetMessage(). Dies ist die Methode, die den Wert des Autorendialogfelds über das JSON-Modell verfügbar macht. Nur Getter-Methoden mit leeren Parametern()werden im JSON-Modell exportiert. -
Öffnen von
CustomComponentImpl.javabeicore/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/impl/CustomComponentImpl.java.Dies ist die Implementierung der
CustomComponent-Schnittstelle. Die Anmerkung@Modelidentifiziert die Java™-Klasse als Sling-Modell. Die Anmerkung@Exporterermöglicht die Serialisierung und den Export der Java™-Klasse über den Sling-Modell-Exporter. -
Aktualisieren Sie die statische Variable
RESOURCE_TYPEso, dass sie auf die in der vorherigen Übung erstellte AEM-Komponentewknd-spa-angular/components/custom-componentverweist.code language-java static final String RESOURCE_TYPE = "wknd-spa-angular/components/custom-component";Es ist der Ressourcentyp der Komponente, der das Sling-Modell an die AEM-Komponente bindet und letztendlich der Angular-Komponente zuordnet.
-
Fügen Sie die Methode
getExportedType()zurCustomComponentImpl-Klasse hinzu, um den Komponenten-Ressourcentyp zurückzugeben:code language-java @Override public String getExportedType() { return CustomComponentImpl.RESOURCE_TYPE; }Diese Methode ist erforderlich, wenn die
ComponentExporter-Schnittstelle implementiert wird, und gibt den Ressourcentyp an, der die Zuordnung zur Angular-Komponente ermöglicht. -
Aktualisieren Sie die Methode
getMessage()so, dass sie den Wert dermessage-Eigenschaft zurückgibt, die vom Autorendialogfeld persistiert wird. Verwenden Sie die Anmerkung@ValueMap, um den JCR-Wertmessageeiner Java™-Variable zuzuordnen:code language-java import org.apache.commons.lang3.StringUtils; ... @ValueMapValue private String message; @Override public String getMessage() { return StringUtils.isNotBlank(message) ? message.toUpperCase() : null; }Es wird eine zusätzliche „Business-Logik“ hinzugefügt, um den Wert der Nachricht in Großbuchstaben zurückzugeben. Auf diese Weise können wir den Unterschied zwischen dem im Autorendialogfeld gespeicherten Rohwert und dem vom Sling-Modell bereitgestellten Wert sehen.
note note NOTE Sie können die fertige CustomComponentImpl.java hier ansehen.
Update der Angular-Komponente
Der Angular-Code für die benutzerdefinierte Komponente wurde bereits erstellt. Nehmen Sie als Nächstes einige Aktualisierungen vor, um die Angular-Komponente der AEM-Komponente zuzuordnen.
-
Öffnen Sie im Modul
ui.frontenddie Dateiui.frontend/src/app/components/custom/custom.component.ts -
Beobachten Sie die Zeile
@Input() message: string;. Es wird erwartet, dass der umgewandelte Wert in Großbuchstaben dieser Variablen zugeordnet wird. -
Importieren Sie das
MapTo-Objekt vom AEM SPA Editor JS SDK und verwenden Sie es, um es der AEM-Komponente zuzuordnen: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); -
Öffnen Sie
cutom.component.htmlund beachten Sie, dass der Wert von{{message}}neben einem<h2>-Tag angezeigt wird. -
Öffnen Sie
custom.component.cssund fügen Sie die folgende Regel hinzu:code language-css :host-context { display: block; }Damit der AEM-Editor-Platzhalter richtig angezeigt wird, wenn die Komponente leer ist, muss
:host-contextoder ein anderes<div>aufdisplay: block;gesetzt werden. -
Stellen Sie die Aktualisierungen mithilfe Ihrer Maven-Kenntnisse in einer lokalen AEM-Umgebung aus dem Stammverzeichnis des Projektverzeichnisses bereit:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage
Aktualisieren der Vorlagenrichtlinie
Navigieren Sie anschließend zu AEM, um die Aktualisierungen zu überprüfen und zuzulassen, dass Custom Component zu der SPA hinzugefügt wird.
-
Überprüfen Sie die Registrierung des neuen Sling-Modells, indem Sie zu http://localhost:4502/system/console/status-slingmodels navigieren.
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'Sie sollten die beiden obigen Zeilen sehen, die anzeigen, dass
CustomComponentImplmit der Komponentewknd-spa-angular/components/custom-componentverbunden ist und dass sie über den Sling-Modell-Exporter registriert ist. -
Navigieren Sie zur SPA-Seitenvorlage unter http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.
-
Aktualisieren Sie die Richtlinie des Layout-Containers, um die neue
Custom Componentals zulässige Komponente hinzuzufügen:
Speichern Sie die Änderungen an der Richtlinie und betrachten Sie die
Custom Componentals zulässige Komponente:
Erstellen der benutzerdefinierten Komponente
Als Nächstes erstellen Sie die Custom Component mit dem AEM-SPA-Editor.
-
Navigieren Sie zu http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.
-
Fügen Sie die
Custom Componentim ModusEditdemLayout Containerhinzu:
-
Öffnen Sie das Dialogfeld der Komponente und geben Sie eine Nachricht ein, die einige Kleinbuchstaben enthält.
Dies ist das Dialogfeld, das basierend auf der XML-Datei früher im Kapitel erstellt wurde.
-
Speichern Sie die Änderungen. Beachten Sie, dass die angezeigte Nachricht vollständig in Großbuchstaben geschrieben ist.
-
Zeigen Sie das JSON-Modell durch Navigieren zu http://localhost:4502/content/wknd-spa-angular/us/en.model.json an. Suchen Sie nach
wknd-spa-angular/components/custom-component:code language-json "custom_component_208183317": { "message": "HELLO WORLD", ":type": "wknd-spa-angular/components/custom-component" }Beachten Sie, dass der JSON-Wert aufgrund der zum Sling-Modell hinzugefügten Logik auf ausschließlich Großbuchstaben eingestellt ist.
Herzlichen Glückwunsch! congratulations
Herzlichen Glückwunsch! Sie haben gelernt, wie eine benutzerdefinierte AEM-Komponente erstellt wird und wie Sling-Modelle und -Dialogfelder mit dem JSON-Modell funktionieren.
Sie können sich den fertigen Code jederzeit auf GitHub ansehen oder den Code lokal herunterladen, indem Sie zu der Verzweigung Angular/custom-component-solution wechseln.
Nächste Schritte next-steps
Erweitern einer Kernkomponente – erfahren Sie, wie Sie eine vorhandene Kernkomponente erweitern, um sie mit dem AEM-SPA-Editor zu verwenden. Das Verständnis, wie Eigenschaften und Inhalte zu einer vorhandenen Komponente hinzugefügt werden, ist eine leistungsstarke Methode, um die Funktionen einer Implementierung des AEM-SPA-Editors zu erweitern.