Een aangepaste component maken custom-component

Leer hoe u een aangepaste component maakt die wordt gebruikt met de AEM SPA Editor. Leer hoe u dialoogvensters met auteurs en Sling Models ontwikkelt om het JSON-model uit te breiden en een aangepaste component te vullen.

Doelstelling

  1. Begrijp de rol van Sling Models in het manipuleren van JSON model API die door AEM wordt verstrekt.
  2. Begrijp hoe u AEM componentdialoogvensters maakt.
  3. Leer om a douane AEM Component tot stand te brengen die met het SPA redacteurskader compatibel is.

Wat u gaat maken

De nadruk van vorige hoofdstukken ontwikkelde SPA componenten en in kaart brengend hen aan bestaande AEM de Componenten van de Kern. Dit hoofdstuk concentreert zich op hoe te om nieuwe AEM componenten tot stand te brengen en uit te breiden en het model te manipuleren JSON dat door AEM wordt gediend.

Met een eenvoudige Custom Component worden de stappen geïllustreerd die nodig zijn om een nieuwe AEM te maken.

Bericht dat in Alle Kapitalen wordt getoond

Vereisten

Herzie het vereiste tooling en de instructies voor vestiging a lokale ontwikkelomgeving.

De code ophalen

  1. Download het beginpunt voor deze zelfstudie 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
    
  2. Implementeer de basis van de code op een lokale AEM met Maven:

    code language-shell
    $ mvn clean install -PautoInstallSinglePackage
    

    Als het gebruiken van AEM 6.xhet classic profiel toevoegt:

    code language-shell
    $ mvn clean install -PautoInstallSinglePackage -Pclassic
    
  3. Installeer het gebeëindigde pakket voor de traditionele WKND verwijzingsplaats. De beelden die door worden verstrekt WKND verwijzingsplaatsworden opnieuw gebruikt op de SPA WKND. Het pakket kan worden geïnstalleerd gebruikend AEM de Manager van het Pakket.

    Manager van het Pakket installeert wknd.all

U kunt de gebeëindigde code op GitHubaltijd bekijken of de code plaatselijk controleren door aan de tak Angular/custom-component-solution te schakelen.

De AEM component definiëren

Een AEM component wordt gedefinieerd als een knooppunt en eigenschappen. In het project, worden deze knopen en eigenschappen vertegenwoordigd als dossiers van XML in de ui.apps module. Maak vervolgens de AEM component in de module ui.apps .

NOTE
Een snelle verfrisser op de grondbeginselen van AEM componenten kan nuttig zijn.
  1. Open de map ui.apps in de IDE van uw keuze.

  2. Ga naar ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components en maak een map met de naam custom-component .

  3. Maak een bestand met de naam .content.xml onder de map custom-component . Vul de custom-component/.content.xml met het volgende:

    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"/>
    

    creeer de definitie van de Component van de Douane

    jcr:primaryType="cq:Component" - identificeert dat dit knooppunt een AEM component is.

    jcr:title is de waarde die wordt weergegeven aan Content Authors en componentGroup bepaalt de groepering van componenten in de ontwerpinterface.

  4. Maak onder de map custom-component een andere map met de naam _cq_dialog .

  5. Onder de map _cq_dialog maakt u een bestand met de naam .content.xml en vult u dit met het volgende:

    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>
    

    de definitie van de Component van 0} Douane

    Het bovenstaande XML-bestand genereert een eenvoudig dialoogvenster voor de Custom Component . Het kritieke deel van het bestand is de binnenste <message> -node. Dit dialoogvenster bevat een eenvoudige textfield naam Message en blijft de waarde van het veld textiel bevatten voor een eigenschap met de naam message .

    Er wordt een verkoopmodel gemaakt naast de waarde van de eigenschap message via het JSON-model.

    note note
    NOTE
    U kunt veel meer voorbeelden van dialogen bekijken door de definities van de Component van de Kern te bekijken. U kunt extra vormgebieden, zoals select, textarea, pathfield ook bekijken, beschikbaar onder /libs/granite/ui/components/coral/foundation/form in CRXDE-Lite.

    Met een traditionele AEM component, wordt een HTMLmanuscript typisch vereist. Aangezien de SPA de component rendert, is er geen HTML-script nodig.

Het verkoopmodel maken

Sling-modellen zijn annotaties die worden aangedreven door Java™ "POJO's" (gewone oude Java™-objecten) en die het gemakkelijker maken gegevens van de JCR aan Java™-variabelen toe te wijzen. het Sling Modellenfunctioneren typisch om complexe server-kant bedrijfslogica voor AEM Componenten in te kapselen.

In de context van de SPA Redacteur, blootstellen het Verdelen Modellen de inhoud van een component door het model JSON door een eigenschap gebruikend het Verdelen ModelExporter.

  1. Open de module core in de IDE van uw keuze. CustomComponent.java en CustomComponentImpl.java zijn al gemaakt en uitgestald als onderdeel van de begincode van het hoofdstuk.

    note note
    NOTE
    Als het gebruiken van winde van de Code van Visual Studio, kan het nuttig zijn om uitbreidingen voor Java™te installeren.
  2. Open de Java™-interface CustomComponent.java op core/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/CustomComponent.java :

    interface CustomComponent.java

    Dit is de Java™ interface die door het het Verkopen Model wordt uitgevoerd.

  3. Werk CustomComponent.java bij zodat de interface van ComponentExporter wordt uitgebreid:

    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();
    
    }
    

    Het implementeren van de interface ComponentExporter is een vereiste dat het Sling-model automatisch wordt opgenomen door de JSON-model-API.

    De interface CustomComponent bevat één methode getter getMessage() . Dit is de methode die de waarde van de auteurdialoog door het model JSON blootstelt. Alleen methoden getter met lege parameters () worden geëxporteerd in het JSON-model.

  4. Open CustomComponentImpl.java om core/src/main/java/com/adobe/aem/guides/wknd/spa/angular/core/models/impl/CustomComponentImpl.java .

    Dit is de implementatie van de interface CustomComponent . In de annotatie @Model wordt de Java™-klasse aangeduid als een Sling Model. Met de @Exporter -annotatie kan de Java™-klasse via serienummering worden geserialiseerd en geëxporteerd via de Sling Model Exporter.

  5. Werk de statische variabele RESOURCE_TYPE bij om naar de AEM component wknd-spa-angular/components/custom-component te wijzen die in de vorige oefening is gemaakt.

    code language-java
    static final String RESOURCE_TYPE = "wknd-spa-angular/components/custom-component";
    

    Het middeltype van de component is wat het Sling Model aan de AEM component bindt en uiteindelijk aan de component van de Angular in kaart brengt.

  6. Voeg de methode getExportedType() toe aan de klasse CustomComponentImpl om het type van componentbron te retourneren:

    code language-java
    @Override
    public String getExportedType() {
        return CustomComponentImpl.RESOURCE_TYPE;
    }
    

    Deze methode is vereist wanneer het uitvoeren van de ComponentExporter interface en stelt het middeltype bloot dat de afbeelding aan de component van de Angular toestaat.

  7. Werk de methode getMessage() bij om de waarde te retourneren van de eigenschap message die door het dialoogvenster van de auteur wordt voortgezet. Gebruik de @ValueMap -annotatie om de JCR-waarde message toe te wijzen aan een Java™-variabele:

    code language-java
    import org.apache.commons.lang3.StringUtils;
    ...
    
    @ValueMapValue
    private String message;
    
    @Override
    public String getMessage() {
        return StringUtils.isNotBlank(message) ? message.toUpperCase() : null;
    }
    

    Er worden extra 'bedrijfslogica' toegevoegd om de waarde van het bericht als hoofdletter te retourneren. Hierdoor kunnen we het verschil zien tussen de onbewerkte waarde die is opgeslagen door het dialoogvenster van de auteur en de waarde die wordt weergegeven door het model Sling.

    note note
    NOTE
    U kunt gebeëindigd CustomComponentImpl.java hier bekijken.

De component Angular bijwerken

De code van de Angular voor de Component van de Douane is reeds gecreeerd. Voer vervolgens een aantal updates uit om de component Angular toe te wijzen aan de AEM.

  1. Open het bestand in de module ui.frontend ui.frontend/src/app/components/custom/custom.component.ts

  2. Bekijk de regel @Input() message: string; . Verwacht wordt dat de getransformeerde hoofdletterwaarde aan deze variabele wordt toegewezen.

  3. Importeer het MapTo -object van de AEM SPA Editor JS SDK en gebruik dit om het toe te wijzen aan de AEM component:

    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);
    
  4. Open cutom.component.html en controleer of de waarde van {{message}} wordt weergegeven naast een <h2> -tag.

  5. Open custom.component.css en voeg de volgende regel toe:

    code language-css
    :host-context {
        display: block;
    }
    

    De tijdelijke aanduiding voor de AEM Editor wordt alleen correct weergegeven wanneer de component leeg is, als :host-context of een andere <div> is ingesteld op display: block; .

  6. Stel de updates aan een lokaal AEM milieu van de wortel van de projectfolder op, gebruikend uw Maven vaardigheden:

    code language-shell
    $ cd aem-guides-wknd-spa
    $ mvn clean install -PautoInstallSinglePackage
    

Sjabloonbeleid bijwerken

Navigeer vervolgens naar AEM om de updates te controleren en Custom Component toe te staan om aan de SPA te worden toegevoegd.

  1. Verifieer de registratie van het nieuwe Verschuivende Model door aan http://localhost:4502/system/console/status-slingmodelste navigeren.

    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'
    

    De bovenstaande twee regels geven aan dat de CustomComponentImpl is gekoppeld aan de wknd-spa-angular/components/custom-component -component en dat deze is geregistreerd via de Sling Model Exporter.

  2. Navigeer aan het Malplaatje van de SPA Pagina in http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.

  3. Werk het beleid van de Container van de Lay-out bij om nieuwe Custom Component als toegestane component toe te voegen:

    het beleid van de Container van de Lay-out van de Update

    Sla de wijzigingen in het beleid op en bekijk de Custom Component als een toegestane component:

    Component van de Douane als toegestane component

Auteur van de aangepaste component

Maak vervolgens de Custom Component met de AEM SPA Editor.

  1. Navigeer aan http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.

  2. Voeg in de modus Edit de Custom Component toe aan de Layout Container :

    Tussenvoegsel Nieuwe Component

  3. Open het dialoogvenster van de component en voer een bericht in dat kleine letters bevat.

    vorm de Component van de Douane

    Dit is het dialoogvenster dat is gemaakt op basis van het XML-bestand dat eerder in het hoofdstuk is opgenomen.

  4. Sla de wijzigingen op. Merk op dat het getoonde bericht in alle gekapitaliseerd is.

    Bericht dat in Alle Kapitalen wordt getoond

  5. Bekijk het model JSON door aan http://localhost:4502/content/wknd-spa-angular/us/en.model.jsonte navigeren. Zoeken naar wknd-spa-angular/components/custom-component :

    code language-json
    "custom_component_208183317": {
        "message": "HELLO WORLD",
        ":type": "wknd-spa-angular/components/custom-component"
    }
    

    De JSON-waarde wordt ingesteld op alle hoofdletters op basis van de logica die aan het Sling-model is toegevoegd.

Gefeliciteerd! congratulations

Gefeliciteerd, hebt u geleerd hoe u een aangepaste AEM component kunt maken en hoe de modellen en dialoogvensters voor verkopers werken met het JSON-model.

U kunt de gebeëindigde code op GitHubaltijd bekijken of de code plaatselijk controleren door aan de tak Angular/custom-component-solution te schakelen.

Volgende stappen next-steps

breidt een Component van de Kernuit - leer hoe te om een bestaande Component van de Kern uit te breiden die met de AEM SPARedacteur moet worden gebruikt. Het begrip hoe te om eigenschappen en inhoud aan een bestaande component toe te voegen is een krachtige techniek om de mogelijkheden van een implementatie van AEM SPARedacteur uit te breiden.

recommendation-more-help
e25b6834-e87f-4ff3-ba56-4cd16cdfdec4