Mappare i componenti dell’SPA ai componenti dell’AEM map-components

Scopri come mappare i componenti React ai componenti Adobe Experience Manager (AEM) con l’SDK JS dell’editor AEM SPA. La mappatura dei componenti consente agli utenti di apportare aggiornamenti dinamici ai componenti SPA nell’Editor SPA dell’AEM, in modo simile all’authoring AEM tradizionale.

Questo capitolo approfondisce l’analisi dell’API del modello JSON AEM e di come il contenuto JSON esposto da un componente AEM possa essere inserito automaticamente in un componente React come prop.

Obiettivo

  1. Scopri come mappare i componenti dell’AEM ai componenti dell’SPA.
  2. Inspect come un componente React utilizza le proprietà dinamiche passate dall’AEM.
  3. Scopri come utilizzare React AEM Core Components pronto all'uso.

Cosa verrà creato

In questo capitolo viene verificato il modo in cui il componente SPA Text fornito è mappato al componente Text dell'AEM. I componenti core React come il componente SPA Image vengono utilizzati nell'SPA e creati nell'AEM. Le funzionalità predefinite dei criteri Contenitore di layout e Editor modelli consentono inoltre di creare una visualizzazione con un aspetto leggermente più variabile.

Authoring finale del capitolo

Prerequisiti

Esaminare gli strumenti e le istruzioni necessari per configurare un ambiente di sviluppo locale. Questo capitolo è una continuazione del capitolo Integrare l'SPA, tuttavia seguire tutto ciò che ti serve è un progetto AEM abilitato per l'SPA.

Approccio di mappatura

Il concetto di base è quello di mappare un componente SPA a un componente AEM. I componenti AEM, esegui lato server, esportano contenuti come parte dell’API del modello JSON. Il contenuto JSON viene utilizzato dall’SPA, che esegue il lato client nel browser. Viene creata una mappatura 1:1 tra i componenti SPA e un componente AEM.

Panoramica di alto livello sulla mappatura di un componente AEM a un componente React

Panoramica di alto livello sulla mappatura di un componente AEM a un componente React

Inspect il componente Testo

L'Archetipo progetto AEM fornisce un componente Text mappato al Componente testo dell'AEM. Questo è un esempio di un componente content, in quanto esegue il rendering di content dall'AEM.

Vediamo come funziona il componente.

Inspect il modello JSON

  1. Prima di passare al codice SPA, è importante comprendere il modello JSON fornito dall’AEM. Passa alla libreria dei componenti core e visualizza la pagina per il componente Testo. La libreria dei componenti core fornisce esempi di tutti i componenti core dell’AEM.

  2. Selezionare la scheda JSON per uno degli esempi:

    Modello JSON di testo

    Dovrebbero essere visualizzate tre proprietà: text, richText e :type.

    :type è una proprietà riservata che elenca sling:resourceType (o percorso) del componente AEM. Il valore di :type è quello utilizzato per mappare il componente AEM al componente SPA.

    text e richText sono proprietà aggiuntive esposte al componente SPA.

  3. Visualizza l'output JSON in http://localhost:4502/content/wknd-spa-react/us/en.model.json. Dovresti essere in grado di trovare una voce simile a:

    code language-json
    "text": {
        "id": "text-a647cec03a",
        "text": "<p>Hello World! Updated content!</p>\r\n",
        "richText": true,
        ":type": "wknd-spa-react/components/text",
        "dataLayer": {}
       }
    

Inspect il componente Testo SPA

  1. Nell'IDE che preferisci, apri il Progetto AEM per l'SPA. Espandere il modulo ui.frontend e aprire il file Text.js in ui.frontend/src/components/Text/Text.js.

  2. La prima area da controllare è class Text a ~riga 40:

    code language-js
    class Text extends Component {
    
        get richTextContent() {
            return (<div
                    id={extractModelId(this.props.cqPath)}
                    data-rte-editelement
                    dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(this.props.text)}} />
                    );
        }
    
        get textContent() {
            return <div>{this.props.text}</div>;
        }
    
        render() {
            return this.props.richText ? this.richTextContent : this.textContent;
        }
    }
    

    Text è un componente React standard. Il componente utilizza this.props.richText per determinare se il contenuto da riprodurre sarà in formato Rich Text o testo normale. Il "contenuto" effettivo utilizzato proviene da this.props.text.

    Per evitare un potenziale attacco XSS, al testo RTF viene applicato l'escape tramite DOMPurify prima di utilizzare dangerouslySetInnerHTML per il rendering del contenuto. Richiama le proprietà richText e text dal modello JSON in precedenza nell'esercizio.

  3. Apri ui.frontend/src/components/import-components.js, quindi dai un'occhiata a TextEditConfig alla ~riga 86:

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

    Il codice di cui sopra è responsabile di determinare quando eseguire il rendering del segnaposto nell’ambiente di authoring dell’AEM. Se il metodo isEmpty restituisce true, viene eseguito il rendering del segnaposto.

  4. Infine, dare un'occhiata alla chiamata MapTo a ~riga 94:

    code language-js
    export default MapTo('wknd-spa-react/components/text')(LazyTextComponent, TextEditConfig);
    

    MapTo è fornito dall'SDK JS dell'editor SPA dell'AEM (@adobe/aem-react-editable-components). Il percorso wknd-spa-react/components/text rappresenta sling:resourceType del componente AEM. Questo percorso viene confrontato con :type esposto dal modello JSON osservato in precedenza. MapTo si occupa di analizzare la risposta del modello JSON e di passare i valori corretti come props al componente SPA.

    La definizione del componente Text dell'AEM è disponibile in ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/text.

Utilizzare i componenti core React

Componenti WCM AEM - Implementazione React Core e Componenti WCM AEM - Editor SPA - Implementazione React Core. Si tratta di un set di componenti riutilizzabili dell’interfaccia utente mappati su componenti AEM predefiniti. La maggior parte dei progetti può riutilizzare questi componenti come punto di partenza per la propria implementazione.

  1. Nel codice del progetto apri il file import-components.js in ui.frontend/src/components.
    Questo file importa tutti i componenti SPA mappati ai componenti AEM. Data la natura dinamica dell’implementazione dell’Editor SPA, è necessario fare riferimento esplicito a qualsiasi componente SPA associato ai componenti compatibili con l’AEM. Questo consente all’autore di AEM di scegliere di utilizzare un componente in qualsiasi posizione all’interno dell’applicazione.

  2. Le seguenti istruzioni di importazione includono i componenti SPA scritti nel progetto:

    code language-js
    import './Page/Page';
    import './Text/Text';
    import './Container/Container';
    import './ExperienceFragment/ExperienceFragment';
    
  3. Ci sono molti altri imports da @adobe/aem-core-components-react-spa e @adobe/aem-core-components-react-base. Questi componenti importano i componenti core React e li rendono disponibili nel progetto corrente. Questi vengono quindi mappati a componenti AEM specifici del progetto utilizzando MapTo, come nell'esempio precedente del componente Text.

Aggiornamento delle politiche AEM

Le policy sono una funzione dei modelli AEM che offre agli sviluppatori e agli utenti avanzati un controllo granulare sui componenti disponibili per l’utilizzo. I componenti core React sono inclusi nel codice SPA, ma devono essere abilitati tramite una policy prima di poter essere utilizzati nell’applicazione.

  1. Dalla schermata iniziale dell'AEM, passa a Strumenti > Modelli > WKND SPA React.

  2. Seleziona e apri il modello Pagina SPA per la modifica.

  3. Seleziona il Contenitore di layout e fai clic sulla relativa icona criterio per modificare il criterio:

    criterio contenitore layout

  4. In Componenti consentiti > Reazione SPA WKND - Contenuto > selezionare Immagine, Teaser e Titolo.

    Componenti aggiornati disponibili

    In Componenti predefiniti > Aggiungi mappatura e scegli Immagine - Reazione SPA WKND - Contenuto componente:

    Imposta componenti predefiniti

    Immetti un tipo mime di image/*.

    Fai clic su Fine per salvare gli aggiornamenti dei criteri.

  5. Nel Contenitore di layout fare clic sull'icona criterio per il componente Testo.

    Crea un nuovo criterio denominato Testo SPA WKND. In Plug-in > Formattazione > seleziona tutte le caselle per abilitare opzioni di formattazione aggiuntive:

    Abilita formattazione editor Rich Text

    In Plug-in > Stili di paragrafo > seleziona la casella per Abilitare gli stili di paragrafo:

    Abilita stili paragrafo

    Fai clic su Fine per salvare l'aggiornamento dei criteri.

Contenuto autore

  1. Passa alla home page http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html.

  2. Ora dovresti essere in grado di utilizzare i componenti aggiuntivi Immagine, Teaser e Titolo nella pagina.

    Componenti aggiuntivi

  3. Dovresti anche poter modificare il componente Text e aggiungere altri stili di paragrafo in modalità schermo intero.

    Modifica Rich Text A Schermo Intero

  4. Dovresti anche essere in grado di trascinare e rilasciare un'immagine da Asset Finder:

    Trascina e rilascia limmagine

  5. Esperienza con i componenti Title e Teaser.

  6. 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'SPA WKND. È possibile installare il pacchetto utilizzando Gestione pacchetti AEM.

    Gestione pacchetti installa wknd.all

Inspect il contenitore di layout

Il supporto per Contenitore di layout viene fornito automaticamente dall'SDK dell'editor SPA dell'AEM. 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.

  1. In un browser passa a http://localhost:4502/content/wknd-spa-react/us/en.model.json

    API modello JSON - Griglia reattiva

    Il componente Contenitore di layout ha sling:resourceType di wcm/foundation/components/responsivegrid ed è riconosciuto dall'editor SPA tramite la proprietà :type, proprio come i componenti Text e Image.

    Con l'editor SPA sono disponibili le stesse funzionalità di ridimensionamento di un componente mediante la modalità layout.

  2. Torna a http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html. Aggiungi altri componenti Immagine e prova a ridimensionarli utilizzando l'opzione Layout:

    Ridimensiona limmagine utilizzando la modalità Layout

  3. Riapri il modello JSON http://localhost:4502/content/wknd-spa-react/us/en.model.json e osserva columnClassNames come parte del JSON:

    Nomi classi colonna

    Il nome di classe aem-GridColumn--default--4 indica 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.

  4. Tornare all'IDE e nel modulo ui.apps è presente una libreria lato client definita in ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/clientlibs/clientlib-grid. Aprire il file less/grid.less.

    Questo file determina i punti di interruzione (default, tablet e phone) 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 su 1200px e 768px.

  5. Dovresti essere in grado di utilizzare le funzionalità reattive e i criteri Rich Text aggiornati del componente Text per creare una visualizzazione simile alla seguente:

    Authoring finale del capitolo

Congratulazioni. congratulations

Congratulazioni, hai imparato a mappare i componenti SPA ai componenti AEM e hai utilizzato i componenti core React. Hai anche la possibilità di esplorare le funzionalità reattive del Contenitore di layout.

Passaggi successivi next-steps

Navigazione e indirizzamento - Scopri come è possibile supportare più visualizzazioni nell'SPA effettuando il mapping alle pagine AEM con l'SDK dell'editor SPA. La navigazione dinamica viene implementata utilizzando React Router e React Core Components.

(Bonus) Mantenere le configurazioni per il controllo del codice sorgente bonus-configs

In molti casi, soprattutto all’inizio di un progetto AEM, è utile mantenere le configurazioni, come i modelli e le relative policy di contenuto, per il 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 qualsiasi IDE configurato per richiamare o importare contenuto da un'istanza locale di AEM.

  1. Nell'IDE di Visual Studio Code verificare che sia installato VSCode AEM Sync tramite l'estensione Marketplace:

    Sincronizzazione AEM VSCode

  2. Espandi il modulo ui.content in Esplora progetti e passa a /conf/wknd-spa-react/settings/wcm/templates.

  3. Fare clic con il pulsante destro del mouse sulla cartella templates e selezionare Importa da server AEM:

    Modello di importazione VSCode

  4. Ripeti i passaggi per importare il contenuto, ma seleziona la cartella criteri che si trova in /conf/wknd-spa-react/settings/wcm/templates/policies.

  5. Inspect il file filter.xml che si trova in ui.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-react" mode="merge"/>
         <filter root="/content/wknd-spa-react" mode="merge"/>
         <filter root="/content/dam/wknd-spa-react" mode="merge"/>
         <filter root="/content/experience-fragments/wknd-spa-react" mode="merge"/>
     </workspaceFilter>
    

    Il file filter.xml è responsabile dell'identificazione dei percorsi dei nodi installati con il pacchetto. Osserva mode="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, vedere la documentazione di FileVault.

    Confrontare ui.content/src/main/content/META-INF/vault/filter.xml e ui.apps/src/main/content/META-INF/vault/filter.xml per comprendere i diversi nodi gestiti da ciascun modulo.

(Bonus) Creare un componente immagine personalizzato bonus-image

I componenti core React hanno già fornito un componente Immagine SPA. Tuttavia, se desideri ulteriore pratica, crea la tua implementazione React che mappi al componente immagine dell'AEM. Il componente Image è un altro esempio di un componente content.

Inspect il JSON

Prima di passare al codice SPA, controlla il modello JSON fornito dall’AEM.

  1. Passa a Esempi di immagini nella libreria dei componenti core.

    Componente core immagine JSON

    Le proprietà di src, alt e title vengono utilizzate per popolare il componente SPA Image.

    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.

Implementare il componente Immagine

  1. Creare una nuova cartella denominata Image in ui.frontend/src/components.

  2. Nella cartella Image creare un nuovo file denominato Image.js.

    File Image.js

  3. Aggiungi le seguenti istruzioni import a Image.js:

    code language-js
    import React, {Component} from 'react';
    import {MapTo} from '@adobe/aem-react-editable-components';
    
  4. Quindi aggiungi ImageEditConfig per determinare quando visualizzare il segnaposto in AEM:

    code language-js
    export const ImageEditConfig = {
    
        emptyLabel: 'Image',
    
        isEmpty: function(props) {
            return !props || !props.src || props.src.trim().length < 1;
        }
    };
    

    Il segnaposto verrà visualizzato se la proprietà src non è impostata.

  5. Implementazione successiva della classe Image:

    code language-js
     export default class Image extends Component {
    
        get content() {
            return <img     className="Image-src"
                            src={this.props.src}
                            alt={this.props.alt}
                            title={this.props.title ? this.props.title : this.props.alt} />;
        }
    
        render() {
            if(ImageEditConfig.isEmpty(this.props)) {
                return null;
            }
    
            return (
                    <div className="Image">
                        {this.content}
                    </div>
            );
        }
    }
    

    Il codice riportato sopra eseguirà il rendering di <img> in base alle proprietà src, alt e title trasmesse dal modello JSON.

  6. Aggiungere il codice MapTo per mappare il componente React al componente AEM:

    code language-js
    MapTo('wknd-spa-react/components/image')(Image, ImageEditConfig);
    

    La stringa wknd-spa-react/components/image corrisponde alla posizione del componente AEM in ui.apps in: ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/image.

  7. Creare un nuovo file denominato Image.css nella stessa directory e aggiungere quanto segue:

    code language-scss
    .Image-src {
        margin: 1rem 0;
        width: 100%;
        border: 0;
    }
    
  8. In Image.js aggiungere un riferimento al file nella parte superiore sotto le istruzioni import:

    code language-js
    import React, {Component} from 'react';
    import {MapTo} from '@adobe/aem-react-editable-components';
    
    require('./Image.css');
    
  9. Aprire il file ui.frontend/src/components/import-components.js e aggiungere un riferimento al nuovo componente Image:

    code language-js
    import './Page/Page';
    import './Text/Text';
    import './Container/Container';
    import './ExperienceFragment/ExperienceFragment';
    import './Image/Image'; //add reference to Image component
    
  10. In import-components.js commento l'immagine del componente core React:

    code language-js
    //MapTo('wknd-spa-react/components/image')(ImageV2, {isEmpty: ImageV2IsEmptyFn});
    

    In questo modo verrà utilizzato il componente immagine personalizzato.

  11. Dalla directory principale del progetto, distribuisci il codice SPA all’AEM utilizzando Maven:

    code language-shell
    $ cd aem-guides-wknd-spa.react
    $ mvn clean install -PautoInstallSinglePackage
    
  12. Inspect l'SPA nell'AEM. Tutti i componenti Immagine sulla pagina continueranno a funzionare. Inspect ha eseguito il rendering dell’output e dovresti visualizzare il markup per il componente immagine personalizzato anziché il componente core React.

    Markup del componente immagine personalizzato

    code language-html
    <div class="Image">
        <img class="Image-src" src="/content/image-src.jpg">
    </div>
    

    Markup immagine componente core React

    code language-html
    <div class="cmp-image cq-dd-image">
        <img src="/content/image-src.jpg" class="cmp-image__image">
    </div>
    

    Questa è una buona introduzione per estendere e implementare i propri componenti.

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