Mappa SPA komponenter till AEM map-components

Lär dig hur du mappar komponentkomponenter till Adobe Experience Manager (AEM) med AEM SPA Editor JS SDK. Komponentmappning gör att användare kan göra dynamiska uppdateringar av SPA komponenter i AEM SPA Editor, på samma sätt som vid traditionell AEM.

I det här kapitlet finns en djupdykning i AEM JSON-modell-API:t och hur JSON-innehåll som exponeras av en AEM automatiskt kan injiceras i en Angular som props.

Syfte

  1. Lär dig hur du mappar AEM komponenter till SPA.
  2. Förstå skillnaden mellan Container-komponenter och Content-komponenter.
  3. Skapa en ny komponentkomponent som mappar till en befintlig AEM.

Vad du ska bygga

I det här kapitlet granskas hur den tillhandahållna Text-SPA mappas till AEM Textkomponenten. En ny Image SPA-komponent skapas som kan användas i SPA och redigeras i AEM. Funktionerna i Layoutbehållaren och Mallredigeraren kommer också att användas för att skapa en vy som är lite mer varierad.

Slutredigering av kapitelexempel

Förutsättningar

Granska de verktyg och instruktioner som krävs för att konfigurera en lokal utvecklingsmiljö.

Hämta koden

  1. 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/map-components-start
    
  2. 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
    

Du kan alltid visa den färdiga koden på GitHub eller checka ut koden lokalt genom att växla till grenen Angular/map-components-solution.

Mappningsmetod

Det grundläggande konceptet är att mappa en SPA till en AEM. AEM komponenter, kör serversidan, exportera innehåll som en del av JSON-modellens API. JSON-innehållet används av SPA, som kör klientsidan i webbläsaren. En 1:1-mappning skapas mellan SPA och en AEM.

Översikt på hög nivå över mappning av en AEM till en Angular-komponent

Översikt på hög nivå över mappning av en AEM till en Angular-komponent

Inspect textkomponenten

AEM Project Archetype innehåller en Text-komponent som är mappad till AEM Text-komponent. Detta är ett exempel på en content -komponent, eftersom den återger innehåll från AEM.

Låt oss se hur komponenten fungerar.

Inspect JSON-modellen

  1. Innan du hoppar in i SPA är det viktigt att förstå den JSON-modell som AEM tillhandahåller. Navigera till Core Component Library och visa sidan för Text-komponenten. Core Component Library innehåller exempel på alla AEM Core Components.

  2. Välj fliken JSON för ett av exemplen:

    Text-JSON-modell

    Du bör se tre egenskaper: text, richText och :type.

    :type är en reserverad egenskap som visar sling:resourceType (eller sökväg) för AEM. Värdet :type är det som används för att mappa AEM till SPA.

    text och richText är ytterligare egenskaper som exponeras för SPA.

Inspect komponenten Text

  1. Öppna en ny terminal och navigera till mappen ui.frontend i projektet. Kör npm install och sedan npm start för att starta webbpaketets dev-server:

    code language-shell
    $ cd ui.frontend
    $ npm run start:mock
    

    Modulen ui.frontend är för närvarande inställd på att använda JSON-modellen mock.

  2. Ett nytt webbläsarfönster öppnas för http://localhost:4200/content/wknd-spa-angular/us/en/home.html

    Webbpaketets dev-server med modellinnehåll

  3. I den utvecklingsmiljö du väljer öppnar du AEM för WKND-SPA. Expandera modulen ui.frontend och öppna filen text.component.ts under ui.frontend/src/app/components/text/text.component.ts:

    Komponenten Text.js Angular Source Code

  4. Det första området som ska inspekteras är class TextComponent på ~rad 35:

    code language-js
    export class TextComponent {
        @Input() richText: boolean;
        @Input() text: string;
        @Input() itemName: string;
    
        @HostBinding('innerHtml') get content() {
            return this.richText
            ? this.sanitizer.bypassSecurityTrustHtml(this.text)
            : this.text;
        }
        @HostBinding('attr.data-rte-editelement') editAttribute = true;
    
        constructor(private sanitizer: DomSanitizer) {}
    }
    

    @Input() används för att deklarera fält vars värden anges via det mappade JSON-objektet som granskats tidigare.

    @HostBinding('innerHtml') get content() är en metod som visar det redigerade textinnehållet från värdet this.text. Om innehållet är RTF-text (som bestäms av flaggan this.richText) kringgås Angularnas inbyggda säkerhet. Angularnas DomSanitizer används för att"rensa" HTML och förhindra serveröverskridande skriptproblem (cross site scripting). Metoden är bunden till egenskapen innerHtml med dekoratorn @HostBinding.

  5. Kontrollera sedan TextEditConfig på ~rad 24:

    code language-js
    const TextEditConfig = {
        emptyLabel: 'Text',
        isEmpty: cqModel =>
            !cqModel || !cqModel.text || cqModel.text.trim().length < 1
    };
    

    Koden ovan avgör när platshållaren ska återges i AEM redigeringsmiljö. Om metoden isEmpty returnerar true återges platshållaren.

  6. Ta till sist en titt på MapTo-anropet på ~rad 53:

    code language-js
    MapTo('wknd-spa-angular/components/text')(TextComponent, TextEditConfig );
    

    MapTo tillhandahålls av AEM JS SDK för SPA (@adobe/cq-angular-editable-components). Sökvägen wknd-spa-angular/components/text representerar sling:resourceType för AEM. Den här sökvägen matchas med :type som exponeras av JSON-modellen som observerats tidigare. MapTo tolkar JSON-modellsvaret och skickar de korrekta värdena till @Input() -variablerna i SPA.

    Du hittar AEM Text-komponentdefinitionen på ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/text.

  7. Experimentera genom att ändra filen en.model.jsonui.frontend/src/mocks/json/en.model.json.

    På ~rad 62 uppdaterar du det första Text-värdet till att använda en H1 - och u -tagg:

    code language-json
        "text": {
            "text": "<h1><u>Hello World!</u></h1>",
            "richText": true,
            ":type": "wknd-spa-angular/components/text"
        }
    

    Gå tillbaka till webbläsaren för att se de effekter som hanteras av webbpaketets dev-server:

    Uppdaterad textmodell

    Försök att växla egenskapen richText mellan true / false för att se hur återgivningslogiken fungerar.

  8. Inspect text.component.html at ui.frontend/src/app/components/text/text.component.html.

    Den här filen är tom eftersom hela innehållet i komponenten anges av egenskapen innerHTML.

  9. Inspect the app.module.ts at ui.frontend/src/app/app.module.ts.

    code language-js
    @NgModule({
    imports: [
        BrowserModule,
        SpaAngularEditableComponentsModule,
        AppRoutingModule
    ],
    providers: [ModelManagerService, { provide: APP_BASE_HREF, useValue: '/' }],
    declarations: [AppComponent, TextComponent, PageComponent, HeaderComponent],
    entryComponents: [TextComponent, PageComponent],
    bootstrap: [AppComponent]
    })
    export class AppModule {}
    

    TextComponent inkluderas inte explicit, utan dynamiskt via AEMResponsiveGridComponent som tillhandahålls av AEM JS SDK för SPA. Därför måste finnas med i listan i arrayen app.module.ts entryComponents .

Skapa bildkomponenten

Skapa sedan en Image-Angular-komponent som är mappad till AEM Image-komponent. Komponenten Image är ett annat exempel på en content-komponent.

Inspect the JSON

Innan du hoppar in i SPA ska du kontrollera JSON-modellen som finns i AEM.

  1. Navigera till Bildexemplen i Core Component Library.

    Image Core Component JSON

    Egenskaper för src, alt och title används för att fylla i SPA Image -komponenten.

    note note
    NOTE
    Andra bildegenskaper visas (lazyEnabled, widths) som gör att en utvecklare kan skapa en adaptiv och lat inläsningskomponent. Komponenten som är inbyggd i den här självstudiekursen är enkel och använder inte dessa avancerade egenskaper.
  2. Återgå till din IDE och öppna en.model.jsonui.frontend/src/mocks/json/en.model.json. Eftersom det här är en ny komponent i vårt projekt måste vi"göra dummy" av Image JSON.

    På ~rad 70 lägger du till en JSON-post för modellen image (glöm inte bort det avslutande kommatecknet , efter den andra text_386303036) och uppdaterar arrayen :itemsOrder.

    code language-json
    ...
    ":items": {
                ...
                "text_386303036": {
                    "text": "<p>A new text component.</p>\r\n",
                    "richText": true,
                    ":type": "wknd-spa-angular/components/text"
                    },
                "image": {
                    "alt": "Rock Climber in New Zealand",
                    "title": "Rock Climber in New Zealand",
                    "src": "/mocks/images/adobestock-140634652.jpeg",
                    ":type": "wknd-spa-angular/components/image"
                }
            },
            ":itemsOrder": [
                "text",
                "text_386303036",
                "image"
            ],
    

    Projektet innehåller en exempelbild på /mock-content/adobestock-140634652.jpeg som används med webpack-dev-servern.

    Du kan visa den fullständiga versionen av en.model.json här.

  3. Lägg till ett stockfoto som ska visas av komponenten.

    Skapa en ny mapp med namnet images under ui.frontend/src/mocks. Hämta adobestock-140634652.jpeg och placera den i mappen images som du nyss skapade. Du kan använda din egen bild om du vill.

Implementera komponenten Bild

  1. Stoppa webbpaketets dev-server om den startas.

  2. Skapa en ny Image-komponent genom att köra Angular CLI ng generate component-kommandot från mappen ui.frontend:

    code language-shell
    $ ng generate component components/image
    
  3. Öppna image.component.ts vid ui.frontend/src/app/components/image/image.component.ts i den integrerade utvecklingsmiljön och uppdatera enligt följande:

    code language-js
    import {Component, Input, OnInit} from '@angular/core';
    import {MapTo} from '@adobe/cq-angular-editable-components';
    
    const ImageEditConfig = {
    emptyLabel: 'Image',
    isEmpty: cqModel =>
        !cqModel || !cqModel.src || cqModel.src.trim().length < 1
    };
    
    @Component({
    selector: 'app-image',
    templateUrl: './image.component.html',
    styleUrls: ['./image.component.scss']
    })
    export class ImageComponent implements OnInit {
    
    @Input() src: string;
    @Input() alt: string;
    @Input() title: string;
    
    constructor() { }
    
    get hasImage() {
        return this.src && this.src.trim().length > 0;
    }
    
    ngOnInit() { }
    }
    
    MapTo('wknd-spa-angular/components/image')(ImageComponent, ImageEditConfig);
    

    ImageEditConfig är konfigurationen som avgör om författarplatshållaren ska återges i AEM utifrån om egenskapen src fylls i.

    @Input() av src, alt och title är de egenskaper som mappas från JSON API.

    hasImage() är en metod som avgör om bilden ska återges eller inte.

    MapTo mappar SPA till AEM på ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/image.

  4. Öppna image.component.html och uppdatera den enligt följande:

    code language-html
    <ng-container *ngIf="hasImage">
        <img class="image" [src]="src" [alt]="alt" [title]="title"/>
    </ng-container>
    

    Detta återger elementet <img> om hasImage returnerar true.

  5. Öppna image.component.scss och uppdatera den enligt följande:

    code language-scss
    :host-context {
        display: block;
    }
    
    .image {
        margin: 1rem 0;
        width: 100%;
        border: 0;
    }
    
    note note
    NOTE
    Regeln :host-context är kritisk för att AEM platshållare för SPA ska fungera korrekt. Alla SPA komponenter som ska redigeras i den AEM sidredigeraren behöver den här regeln som mest.
  6. Öppna app.module.ts och lägg till ImageComponent i arrayen entryComponents:

    code language-js
    entryComponents: [TextComponent, PageComponent, ImageComponent],
    

    Precis som TextComponent läses ImageComponent in dynamiskt och måste inkluderas i entryComponents-arrayen.

  7. Starta webbpaketets dev-server för att se renderingen ImageComponent.

    code language-shell
    $ npm run start:mock
    

    Bilden har lagts till i modellen

    Bilden har lagts till i SPA

    note note
    NOTE
    Bonusutmaning: Implementera en ny metod för att visa värdet för title som en bildtext under bilden.

Uppdatera principer i AEM

Komponenten ImageComponent visas bara på webbpaketets dev-server. Distribuera sedan den uppdaterade SPA för att AEM och uppdatera mallprofilerna.

  1. Stoppa webpack-dev-servern och från root i projektet, distribuera ändringarna till AEM med dina Maven-kunskaper:

    code language-shell
    $ cd aem-guides-wknd-spa
    $ mvn clean install -PautoInstallSinglePackage
    
  2. Navigera från AEM startskärm till Tools > Templates > WKND SPA Angular.

    Markera och redigera SPA sida:

    Redigera SPA sidmall

  3. Markera layoutbehållaren och klicka på dess policy-ikon för att redigera profilen:

    Policy för layoutbehållare

  4. Under Tillåtna komponenter > WKND SPA Angular - Innehåll > kontrollerar du Image -komponenten:

    Bildkomponenten har valts

    Under Standardkomponenter > Lägg till mappning och välj Angularna Bild - WKND SPA - Innehåll:

    Ange standardkomponenter

    Ange mime-typen av image/*.

    Klicka på Klar om du vill spara principuppdateringarna.

  5. I layoutbehållaren klickar du på ikonen policy för komponenten Text :

    Ikon för textkomponentpolicy

    Skapa en ny princip med namnet WKND SPA Text. Under Plugins > Formatering > markerar du alla rutor för att aktivera ytterligare formateringsalternativ:

    Aktivera RTE-formatering

    Under Plugins > Styckeformat > markerar du kryssrutan för att aktivera styckeformat:

    Aktivera styckeformat

    Klicka på Klar för att spara principuppdateringen.

  6. Navigera till hemsidan http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.

    Du bör också kunna redigera komponenten Text och lägga till ytterligare styckeformat i helskärmsläge .

    RTF-redigering i helskärmsläge

  7. Du bör också kunna dra och släppa en bild från Resurssökaren:

    Dra och släpp bild

  8. Lägg till egna bilder via AEM Assets eller installera den färdiga kodbasen för standardreferensplatsen WKND. WKND-referenswebbplatsen innehåller många bilder som kan återanvändas på WKND-SPA. Paketet kan installeras med AEM Package Manager.

    Pakethanteraren installerades wknd.all

Inspect layoutbehållaren

Stöd för layoutbehållaren tillhandahålls automatiskt av AEM SDK för SPA. Layoutbehållaren, som anges av namnet, är en container-komponent. Behållarkomponenter är komponenter som accepterar JSON-strukturer som representerar andra komponenter och instansierar dem dynamiskt.

Låt oss inspektera layoutbehållaren ytterligare.

  1. Öppna responsive-grid.component.tsui.frontend/src/app/components/responsive-grid i IDE:

    code language-js
    import { AEMResponsiveGridComponent,MapTo } from '@adobe/cq-angular-editable-components';
    
    MapTo('wcm/foundation/components/responsivegrid')(AEMResponsiveGridComponent);
    

    AEMResponsiveGridComponent implementeras som en del av AEM SPA Editor SDK och ingår i projektet via import-components.

  2. I en webbläsare går du till http://localhost:4502/content/wknd-spa-angular/us/en.model.json

    JSON-modell-API - responsivt stödraster

    Komponenten Layoutbehållare har sling:resourceType wcm/foundation/components/responsivegrid och känns igen av SPA Editor med egenskapen :type, precis som komponenterna Text och Image.

    Samma funktioner för att ändra storlek på en komponent med layoutläget finns i SPA Editor.

  3. Gå tillbaka till http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html. Lägg till ytterligare Bild-komponenter och försök ändra storlek på dem med alternativet Layout :

    Ändra storlek på bilden i layoutläge

  4. Öppna JSON-modellen http://localhost:4502/content/wknd-spa-angular/us/en.model.json igen och observera columnClassNames som en del av JSON:

    Klassnamn för kolumn

    Klassnamnet aem-GridColumn--default--4 anger att komponenten ska vara 4 kolumner bred baserat på ett 12-kolumnsrutnät. Mer information om det responsiva rutnätet finns här.

  5. Återgå till IDE och i modulen ui.apps finns ett klientbibliotek definierat vid ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/clientlibs/clientlib-grid. Öppna filen less/grid.less.

    Den här filen avgör vilka brytpunkter (default, tablet och phone) som används av layoutbehållaren. Den här filen är avsedd att anpassas efter projektspecifikationer. För närvarande är brytpunkterna inställda på 1200px och 650px.

  6. Du bör kunna använda responsiva funktioner och uppdaterade RTF-principer för komponenten Text för att skapa en vy som följande:

    Slutredigering av kapitelexempel

Grattis! congratulations

Du lärde dig att mappa SPA till AEM komponenter och du implementerade en ny Image-komponent. Du har också en chans att utforska de responsiva funktionerna i layoutbehållaren.

Du kan alltid visa den färdiga koden på GitHub eller checka ut koden lokalt genom att växla till grenen Angular/map-components-solution.

Nästa steg next-steps

Navigering och routning - Lär dig hur flera vyer i SPA kan användas genom att mappa till AEM sidor med SPA Editor SDK. Dynamisk navigering implementeras med Angular Router och läggs till i en befintlig Header-komponent.

Bonus - Beständiga konfigurationer till källkontroll bonus

I många fall, särskilt i början av ett AEM projekt, är det viktigt att behålla konfigurationer som mallar och relaterade innehållsprinciper för källkontroll. Detta garanterar att alla utvecklare arbetar mot samma uppsättning innehåll och konfigurationer och kan säkerställa ytterligare enhetlighet mellan miljöer. När ett projekt når en viss mognadsnivå kan rutinen med mallhantering överföras till en särskild grupp med avancerade användare.

Nästa steg kommer att utföras med Visual Studio Code IDE och VSCode AEM Sync men kan utföras med alla verktyg och alla IDE som du har konfigurerat till pull - eller import -innehåll från en lokal AEM.

  1. I Visual Studio Code IDE kontrollerar du att du har VSCode AEM Sync installerat via Marketplace-tillägget:

    Synkronisering AEM VSCode

  2. Utöka modulen ui.content i Project Explorer och gå till /conf/wknd-spa-angular/settings/wcm/templates.

  3. Högerklicka på mappen templates och välj Importera från AEM server:

    VSCode-importmall

  4. Upprepa stegen för att importera innehåll men välj mappen policies/conf/wknd-spa-angular/settings/wcm/policies.

  5. Inspect filen filter.xmlui.content/src/main/content/META-INF/vault/filter.xml.

    code language-xml
    <!--ui.content filter.xml-->
    <?xml version="1.0" encoding="UTF-8"?>
     <workspaceFilter version="1.0">
         <filter root="/conf/wknd-spa-angular" mode="merge"/>
         <filter root="/content/wknd-spa-angular" mode="merge"/>
         <filter root="/content/dam/wknd-spa-angular" mode="merge"/>
         <filter root="/content/experience-fragments/wknd-spa-angular" mode="merge"/>
     </workspaceFilter>
    

    Filen filter.xml ansvarar för att identifiera sökvägarna till noder som har installerats med paketet. Observera mode="merge" på vart och ett av filtren som anger att befintligt innehåll inte ändras, endast nytt innehåll läggs till. Eftersom innehållsförfattare kan uppdatera dessa sökvägar är det viktigt att en koddistribution inte skriver över innehåll. Mer information om hur du arbetar med filterelement finns i dokumentationen för FileVault.

    Jämför ui.content/src/main/content/META-INF/vault/filter.xml och ui.apps/src/main/content/META-INF/vault/filter.xml för att förstå de olika noder som hanteras av varje modul.

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