Mappare i componenti dell’applicazione a pagina singola ai componenti di AEM map-components
- Editor universale per la modifica visiva di contenuti headless.
- Editor frammenti di contenuto per la modifica di contenuti headless basata su modulo.
Scopri come mappare i componenti di Angular ai componenti di Adobe Experience Manager (AEM) con AEM SPA Editor JS SDK. La mappatura dei componenti consente agli utenti di apportare aggiornamenti dinamici ai componenti delle applicazioni a pagina singola nell’Editor delle applicazioni a pagina singola di AEM, in modo simile all’authoring tradizionale AEM.
Questo capitolo approfondisce l’analisi dell’API del modello JSON AEM e di come il contenuto JSON esposto da un componente AEM può essere inserito automaticamente in un componente Angular come proprietà.
Obiettivo
- Scopri come mappare i componenti di AEM ai componenti SPA.
- Understand the difference between Container components and Content components.
- Create a new Angular component that maps to an existing AEM component.
Cosa verrà creato
This chapter will inspect how the provided Text SPA component is mapped to the AEM Textcomponent. A new Image SPA component is created that can be used in the SPA and authored in AEM. Out of the box features of the Layout Container and Template Editor policies will also be used to create a view that is a little more varied in appearance.
Prerequisiti
Rivedi gli strumenti e le istruzioni necessari per configurare un ambiente di sviluppo locale.
Ottieni il codice
-
Scarica il punto di partenza per questa esercitazione tramite 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 -
Implementa la base di codice in un’istanza AEM locale utilizzando Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackageSe utilizzi AEM 6.x, aggiungi il profilo
classic:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic
You can always view the finished code on GitHub or check the code out locally by switching to the branch Angular/map-components-solution.
Mapping Approach
The basic concept is to map a SPA Component to an AEM Component. AEM components, run server-side, export content as part of the JSON model API. The JSON content is consumed by the SPA, running client-side in the browser. A 1:1 mapping between SPA components and an AEM component is created.
High-level overview of mapping an AEM Component to a Angular Component
Inspect the Text Component
The AEM Project Archetype provides a Text component that is mapped to the AEM Text component. This is an example of a content component, in that it renders content from AEM.
Let's see how the component works.
Inspect the JSON model
-
Before jumping into the SPA code, it is important to understand the JSON model that AEM provides. Navigate to the Core Component Library and view the page for the Text component. La libreria dei componenti core fornisce esempi di tutti i componenti core di AEM.
-
Selezionare la scheda JSON per uno degli esempi:
Dovrebbero essere visualizzate tre proprietà:
text,richTexte:type.:typeè una proprietà riservata che elencasling:resourceType(o percorso) del componente AEM. Il valore di:typeè ciò che viene utilizzato per mappare il componente AEM al componente SPA.texterichTextsono proprietà aggiuntive esposte al componente SPA.
Controllare il componente Testo
-
Aprire un nuovo terminale e passare alla cartella
ui.frontendall'interno del progetto. Eseguirenpm installe quindinpm startper avviare il server di sviluppo Webpack:code language-shell $ cd ui.frontend $ npm run start:mockIl modulo
ui.frontendè attualmente configurato per utilizzare il modello JSON fittizio. -
Dovresti visualizzare una nuova finestra del browser aperta per http://localhost:4200/content/wknd-spa-angular/us/en/home.html
-
Nell’IDE che preferisci, apri il progetto AEM per l’applicazione a pagina singola WKND. Espandere il modulo
ui.frontende aprire il file text.component.ts inui.frontend/src/app/components/text/text.component.ts:
-
La prima area da ispezionare è
class TextComponenta ~riga 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() decorator viene utilizzato per dichiarare i campi i cui valori sono impostati tramite l'oggetto JSON mappato, rivisto in precedenza.
@HostBinding('innerHtml') get content()è un metodo che espone il contenuto del testo creato dal valore dithis.text. Nel caso in cui il contenuto sia in formato Rich Text (determinato dal flagthis.richText), la sicurezza integrata di Angular viene ignorata. DomSanitizer di Angular viene utilizzato per "scorrere" il HTML non elaborato e impedire vulnerabilità cross-site scripting. Il metodo è associato alla proprietàinnerHtmlutilizzando il decoratore @HostBinding. -
Ispeziona
TextEditConfigalla riga 24:code language-js const TextEditConfig = { emptyLabel: 'Text', isEmpty: cqModel => !cqModel || !cqModel.text || cqModel.text.trim().length < 1 };Il codice di cui sopra è responsabile di determinare quando eseguire il rendering del segnaposto nell’ambiente di authoring di AEM. Se il metodo
isEmptyrestituisce true, viene eseguito il rendering del segnaposto. -
Infine, dare un'occhiata alla chiamata
MapToa ~riga 53:code language-js MapTo('wknd-spa-angular/components/text')(TextComponent, TextEditConfig );MapTo è fornito da AEM SPA Editor JS SDK (
@adobe/cq-angular-editable-components). Il percorsowknd-spa-angular/components/textrappresentasling:resourceTypedel componente AEM. Questo percorso viene confrontato con:typeesposto dal modello JSON osservato in precedenza. MapTo analizza la risposta del modello JSON e trasmette i valori corretti alle variabili@Input()del componente SPA.La definizione del componente AEM
Textè disponibile inui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/text. -
Prova a modificare il file en.model.json in
ui.frontend/src/mocks/json/en.model.json.Alla ~riga 62 aggiornare il primo valore
Textper utilizzare un tagH1eu:code language-json "text": { "text": "<h1><u>Hello World!</u></h1>", "richText": true, ":type": "wknd-spa-angular/components/text" }Torna al browser per visualizzare gli effetti gestiti dal server di sviluppo webpack:
Prova a impostare la proprietà
richTexttra true / false per visualizzare la logica di rendering in azione. -
Esaminare text.component.html in
ui.frontend/src/app/components/text/text.component.html.Questo file è vuoto perché l'intero contenuto del componente è impostato dalla proprietà
innerHTML. -
Controlla app.module.ts in
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 non è incluso in modo esplicito, ma in modo dinamico tramite AEMResponsiveGridComponent fornito da AEM SPA Editor JS SDK. Pertanto deve essere elencato nell'array app.module.ts' entryComponents.
Creare il componente Immagine
Creare quindi un componente Angular Image mappato al componente immagine di AEM. Il componente Image è un altro esempio di un componente content.
Ispezionare JSON
Prima di passare al codice SPA, controlla il modello JSON fornito da AEM.
-
Passa a Esempi di immagini nella libreria dei componenti core.
Le proprietà di
src,altetitlesono utilizzate per popolare il componente SPAImage.note note NOTE Sono esposte altre proprietà Image ( lazyEnabled,widths) che consentono a uno sviluppatore di creare un componente adattivo e a caricamento lento. Il componente creato in questa esercitazione è semplice e non utilizza queste proprietà avanzate. -
Torna all'IDE e apri
en.model.jsonalleui.frontend/src/mocks/json/en.model.json. Poiché si tratta di un componente nuovo per il nostro progetto, dobbiamo "simulare" il JSON dell’immagine.Alla ~riga 70 aggiungere una voce JSON per il modello
image(non dimenticare la virgola finale,dopo il secondotext_386303036) e aggiornare l'array: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" ],Il progetto include un'immagine di esempio in
/mock-content/adobestock-140634652.jpegutilizzata con il server di sviluppo Webpack.Puoi visualizzare il en.model.json completo qui.
-
Aggiungete una foto d'archivio che verrà visualizzata dal componente.
Crea una nuova cartella denominata images sotto
ui.frontend/src/mocks. Scarica adobestock-140634652.jpeg e inseriscilo nella cartella images appena creata. Se lo desideri, puoi usare la tua immagine personale.
Implementare il componente Immagine
-
Arrestare il server di sviluppo webpack se avviato.
-
Creare un nuovo componente Immagine eseguendo il comando Angular CLI
ng generate componentdalla cartellaui.frontend:code language-shell $ ng generate component components/image -
Nell'IDE, apri image.component.ts in
ui.frontend/src/app/components/image/image.component.tse aggiorna come segue: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è la configurazione per determinare se eseguire il rendering del segnaposto autore in AEM, in base al popolamento della proprietàsrc.@Input()disrc,altetitlesono le proprietà mappate dall'API JSON.hasImage()è un metodo che determinerà se l'immagine deve essere sottoposta a rendering.MapToassocia il componente SPA al componente AEM situato inui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/image. -
Apri image.component.html e aggiornalo come segue:
code language-html <ng-container *ngIf="hasImage"> <img class="image" [src]="src" [alt]="alt" [title]="title"/> </ng-container>L'elemento
<img>verrà eseguito sehasImagerestituisce true. -
Apri image.component.scss e aggiornalo come segue:
code language-scss :host-context { display: block; } .image { margin: 1rem 0; width: 100%; border: 0; }note note NOTE La regola :host-contextè critica perché il segnaposto dell'editor SPA di AEM funzioni correttamente. Questa regola è necessaria almeno per tutti i componenti SPA destinati a essere creati nell’editor di pagine di AEM. -
Apri
app.module.tse aggiungiImageComponentall'arrayentryComponents:code language-js entryComponents: [TextComponent, PageComponent, ImageComponent],Come
TextComponent,ImageComponentè caricato in modo dinamico e deve essere incluso nell'arrayentryComponents. -
Start the webpack dev server to see the
ImageComponentrender.code language-shell $ npm run start:mock
Image added to the SPA
note note NOTE Bonus challenge: Implement a new method to display the value of titleas a caption beneath the image.
Update Policies in AEM
The ImageComponent component is only visible in the webpack dev server. Next, deploy the updated SPA to AEM and update the template policies.
-
Stop the webpack dev server and from the root of the project, deploy the changes to AEM using your Maven skills:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage -
From the AEM Start screen navigate to Tools > Templates > WKND SPA Angular.
Select and edit the SPA Page:
-
Select the Layout Container and click it's policy icon to edit the policy:
-
Under Allowed Components > WKND SPA Angular - Content > check the Image component:
Under Default Components > Add mapping and choose the Image - WKND SPA Angular - Content component:
Enter a mime type of
image/*.Click Done to save the policy updates.
-
In the Layout Container click the policy icon for the Text component:
Create a new policy named WKND SPA Text. Under Plugins > Formatting > check all the boxes to enable additional formatting options:
Under Plugins > Paragraph Styles > check the box to Enable paragraph styles:
Fai clic su Fine per salvare l'aggiornamento dei criteri.
-
Passa alla home page http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.
Dovresti anche poter modificare il componente
Texte aggiungere altri stili di paragrafo in modalità schermo intero.
-
Dovresti anche essere in grado di trascinare e rilasciare un'immagine da Asset Finder:
-
Aggiungi le tue immagini tramite AEM Assets o installa la base di codice completata per il sito di riferimento WKND standard. Il sito di riferimento WKND include molte immagini che possono essere riutilizzate nell'applicazione a pagina singola WKND. È possibile installare il pacchetto utilizzando Gestione pacchetti di AEM.
Ispezionare il contenitore di layout
Il supporto per Contenitore di layout viene fornito automaticamente da AEM SPA Editor SDK. Il contenitore di layout, come indicato dal nome, è un componente contenitore. I componenti contenitore sono componenti che accettano strutture JSON che rappresentano altri componenti e ne creano un'istanza dinamica.
Esaminiamo ulteriormente il Contenitore di layout.
-
Nell'IDE, apri responsive-grid.component.ts alle
ui.frontend/src/app/components/responsive-grid:code language-js import { AEMResponsiveGridComponent,MapTo } from '@adobe/cq-angular-editable-components'; MapTo('wcm/foundation/components/responsivegrid')(AEMResponsiveGridComponent);AEMResponsiveGridComponentè implementato come parte del SDK dell'Editor SPA di AEM ed è incluso nel progetto tramiteimport-components. -
In un browser passa a http://localhost:4502/content/wknd-spa-angular/us/en.model.json
Il componente Contenitore di layout ha
sling:resourceTypediwcm/foundation/components/responsivegrided è riconosciuto dall'editor SPA tramite la proprietà:type, proprio come i componentiTexteImage.Le stesse funzionalità di ridimensionamento di un componente mediante la modalità Layout sono disponibili con l'editor SPA.
-
Torna a http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html. Aggiungi altri componenti Immagine e prova a ridimensionarli utilizzando l'opzione Layout:
-
Riapri il modello JSON http://localhost:4502/content/wknd-spa-angular/us/en.model.json e osserva
columnClassNamescome parte del codice JSON:
Il nome di classe
aem-GridColumn--default--4indica che il componente deve avere una larghezza di 4 colonne in base a una griglia a 12 colonne. Ulteriori dettagli sulla griglia reattiva sono disponibili qui. -
Tornare all'IDE e nel modulo
ui.appsè presente una libreria lato client definita inui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/clientlibs/clientlib-grid. Apri il file inless/grid.less.Questo file determina i punti di interruzione (
default,tabletephone) utilizzati dal Contenitore di layout. Questo file è stato progettato per essere personalizzato in base alle specifiche del progetto. Attualmente i punti di interruzione sono impostati su1200pxe650px. -
Dovresti essere in grado di utilizzare le funzionalità reattive e i criteri Rich Text aggiornati del componente
Textper creare una visualizzazione simile alla seguente:
Congratulazioni. congratulations
Congratulazioni, hai imparato a mappare i componenti SPA ai componenti AEM e hai implementato un nuovo componente Image. Hai anche la possibilità di esplorare le funzionalità reattive del Contenitore di layout.
Puoi sempre visualizzare il codice finito su GitHub o estrarre il codice localmente passando al ramo Angular/map-components-solution.
Passaggi successivi next-steps
Navigazione e indirizzamento - Scopri come è possibile supportare più visualizzazioni nell'applicazione a pagina singola effettuando il mapping alle pagine di AEM con l'editor di applicazioni a pagina singola SDK. La navigazione dinamica viene implementata utilizzando Angular Router e aggiunta a un componente Intestazione esistente.
Bonus: mantenere le configurazioni per il controllo del codice sorgente bonus
In molti casi, soprattutto all’inizio di un progetto AEM, è utile mantenere le configurazioni, come i modelli e i criteri dei contenuti correlati, nel controllo del codice sorgente. In questo modo tutti gli sviluppatori lavorano sullo stesso set di contenuti e configurazioni e possono garantire ulteriore coerenza tra gli ambienti. Quando un progetto raggiunge un certo livello di maturità, la pratica di gestione dei modelli può essere affidata a uno speciale gruppo di utenti esperti.
I passaggi successivi verranno eseguiti utilizzando l'IDE del codice di Visual Studio e VSCode AEM Sync, ma potrebbero essere eseguiti utilizzando qualsiasi strumento e IDE configurato per richiamare o importare contenuto da un'istanza locale di AEM.
-
Nell'IDE di Visual Studio Code verificare che sia installato VSCode AEM Sync tramite l'estensione Marketplace:
-
Espandi il modulo ui.content in Esplora progetti e passa a
/conf/wknd-spa-angular/settings/wcm/templates. -
Fai clic con il pulsante destro del mouse sulla cartella
templatese seleziona Importa da AEM Server:
-
Ripeti i passaggi per importare il contenuto, ma seleziona la cartella criteri che si trova in
/conf/wknd-spa-angular/settings/wcm/policies. -
Controllare il file
filter.xmlche si trova inui.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>Il file
filter.xmlè responsabile dell'identificazione dei percorsi dei nodi installati con il pacchetto. Osservamode="merge"su ciascuno dei filtri che indica che il contenuto esistente non verrà modificato, ma che verrà aggiunto solo il nuovo contenuto. Poiché gli autori di contenuto potrebbero aggiornare questi percorsi, è importante che una distribuzione del codice non sovrascriva il contenuto. Per ulteriori informazioni sull'utilizzo degli elementi del filtro, consulta la documentazione di FileVault.Confronta
ui.content/src/main/content/META-INF/vault/filter.xmleui.apps/src/main/content/META-INF/vault/filter.xmlper comprendere i diversi nodi gestiti da ciascun modulo.