Componenti contenitore modificabili

IMPORTANT
L'editor per applicazioni a pagina singola (o editor SPA) è stato dichiarato obsoleto per i nuovi progetti. Continua a essere supportato da Adobe per i progetti esistenti, ma non dovrebbe essere utilizzato per i nuovi progetti. Gli editor preferiti per la gestione dei contenuti headless in AEM sono ora i seguenti:

I componenti fissi offrono una certa flessibilità per l'authoring dei contenuti SPA, tuttavia questo approccio è rigido e richiede agli sviluppatori di definire la composizione esatta dei contenuti modificabili. Per supportare la creazione di esperienze eccezionali da parte degli autori, l’Editor SPA supporta l’utilizzo di componenti contenitore nell’SPA. I componenti contenitore consentono agli autori di trascinare e rilasciare i componenti consentiti nel contenitore e di crearli, come fanno nell’authoring AEM Sites tradizionale.

Componenti contenitore modificabili

In questo capitolo, viene aggiunto un contenitore modificabile alla visualizzazione Home che consente agli autori di comporre e creare il layout di esperienze con contenuti avanzati utilizzando i componenti React modificabili direttamente nell’applicazione a pagina singola.

Aggiornare l’app WKND

Per aggiungere un componente contenitore alla vista Home:

  • Importa il componente ResponsiveGrid del componente AEM React Editable
  • Importare e registrare componenti React modificabili personalizzati (testo e immagine) da utilizzare nel componente ResponsiveGrid

Utilizzare il componente ResponsiveGrid

Per aggiungere un'area modificabile alla vista Home:

  1. Apri e modifica react-app/src/components/Home.js

  2. Importare il componente ResponsiveGrid da @adobe/aem-react-editable-components e aggiungerlo al componente Home.

  3. Imposta i seguenti attributi sul componente <ResponsiveGrid...>

    1. pagePath = '/content/wknd-app/us/en/home'
    2. itemPath = 'root/responsivegrid'

    Questo indica al componente ResponsiveGrid di recuperare il contenuto dalla risorsa AEM:

    1. /content/wknd-app/us/en/home/jcr:content/root/responsivegrid

    itemPath è mappato al nodo responsivegrid definito nel modello AEM Remote SPA Page e viene creato automaticamente nelle nuove pagine AEM create dal modello AEM Remote SPA Page.

    Aggiornare Home.js per aggiungere il componente <ResponsiveGrid...>.

    code language-javascript
    ...
    import { ResponsiveGrid } from '@adobe/aem-react-editable-components';
    ...
    
    function Home() {
        return (
            <div className="Home">
                <ResponsiveGrid
                    pagePath='/content/wknd-app/us/en/home'
                    itemPath='root/responsivegrid'/>
    
                <EditableTitle
                    pagePath='/content/wknd-app/us/en/home'
                    itemPath='title'/>
    
                <Adventures />
            </div>
        );
    }
    

Il file Home.js deve essere simile al seguente:

Home.js

Creare componenti modificabili

Ottenere il pieno effetto dei contenitori di esperienza di authoring flessibili forniti nell’editor SPA. È già stato creato un componente Titolo modificabile, ma creiamo alcuni altri che consentono agli autori di utilizzare componenti Testo e Immagine modificabili nel componente ResponsiveGrid appena aggiunto.

I nuovi componenti Text e Image React modificabili vengono creati utilizzando il modello di definizione del componente modificabile esportato in componenti fissi modificabili.

Componente testo modificabile

  1. Apri il progetto SPA nell’IDE

  2. Crea un componente React in src/components/editable/core/Text.js

  3. Aggiungi il seguente codice a Text.js

    code language-javascript
    import React from 'react'
    
    const TextPlain = (props) => <div className={props.baseCssClass}><p className="cmp-text__paragraph">{props.text}</p></div>;
    const TextRich = (props) => {
    const text = props.text;
    const id = (props.id) ? props.id : (props.cqPath ? props.cqPath.substr(props.cqPath.lastIndexOf('/') + 1) : "");
        return <div className={props.baseCssClass} id={id} data-rte-editelement dangerouslySetInnerHTML={{ __html: text }} />
    };
    
    export const Text = (props) => {
        if (!props.baseCssClass) {
            props.baseCssClass = 'cmp-text'
        }
    
        const { richText = false } = props
    
        return richText ? <TextRich {...props} /> : <TextPlain {...props} />
        }
    
        export function textIsEmpty(props) {
        return props.text == null || props.text.length === 0;
    }
    
  4. Crea un componente React modificabile in src/components/editable/EditableText.js

  5. Aggiungi il seguente codice a EditableText.js

    code language-javascript
    import React from 'react'
    import { EditableComponent, MapTo } from '@adobe/aem-react-editable-components';
    import { Text, textIsEmpty } from "./core/Text";
    import { withConditionalPlaceHolder } from "./core/util/withConditionalPlaceholder";
    import { withStandardBaseCssClass } from "./core/util/withStandardBaseCssClass";
    
    const RESOURCE_TYPE = "wknd-app/components/text";
    
    const EditConfig = {
        emptyLabel: "Text",
        isEmpty: textIsEmpty,
        resourceType: RESOURCE_TYPE
    };
    
    export const WrappedText = (props) => {
        const Wrapped = withConditionalPlaceHolder(withStandardBaseCssClass(Text, "cmp-text"), textIsEmpty, "Text V2")
        return <Wrapped {...props} />
    };
    
    const EditableText = (props) => <EditableComponent config={EditConfig} {...props}><WrappedText /></EditableComponent>
    
    MapTo(RESOURCE_TYPE)(EditableText);
    
    export default EditableText;
    

L’implementazione del componente Testo modificabile deve essere simile alla seguente:

Componente testo modificabile

Componente immagine

  1. Apri il progetto SPA nell’IDE

  2. Crea un componente React in src/components/editable/core/Image.js

  3. Aggiungi il seguente codice a Image.js

    code language-javascript
    import React from 'react'
    import { RoutedLink } from "./RoutedLink";
    
    export const imageIsEmpty = (props) => (!props.src) || props.src.trim().length === 0
    
    const ImageInnerContents = (props) => {
    return (<>
        <img src={props.src}
            className={props.baseCssClass + '__image'}
            alt={props.alt} />
        {
            !!(props.title) && <span className={props.baseCssClass + '__title'} itemProp="caption">{props.title}</span>
        }
        {
            props.displayPopupTitle && (!!props.title) && <meta itemProp="caption" content={props.title} />
        }
        </>);
    };
    
    const ImageContents = (props) => {
        if (props.link && props.link.trim().length > 0) {
            return (
            <RoutedLink className={props.baseCssClass + '__link'} isRouted={props.routed} to={props.link}>
                <ImageInnerContents {...props} />
            </RoutedLink>
            )
        }
        return <ImageInnerContents {...props} />
    };
    
    export const Image = (props) => {
        if (!props.baseCssClass) {
            props.baseCssClass = 'cmp-image'
        }
    
        const { isInEditor = false } = props;
        const cssClassName = (isInEditor) ? props.baseCssClass + ' cq-dd-image' : props.baseCssClass;
    
        return (
            <div className={cssClassName}>
                <ImageContents {...props} />
            </div>
        )
    };
    
  4. Crea un componente React modificabile in src/components/editable/EditableImage.js

  5. Aggiungi il seguente codice a EditableImage.js

import { EditableComponent, MapTo } from '@adobe/aem-react-editable-components';
import { Image, imageIsEmpty } from "./core/Image";
import React from 'react'

import { withConditionalPlaceHolder } from "./core/util/withConditionalPlaceholder";
import { withStandardBaseCssClass } from "./core/util/withStandardBaseCssClass";

const RESOURCE_TYPE = "wknd-app/components/image";

const EditConfig = {
    emptyLabel: "Image",
    isEmpty: imageIsEmpty,
    resourceType: RESOURCE_TYPE
};

const WrappedImage = (props) => {
    const Wrapped = withConditionalPlaceHolder(withStandardBaseCssClass(Image, "cmp-image"), imageIsEmpty, "Image V2");
    return <Wrapped {...props}/>
}

const EditableImage = (props) => <EditableComponent config={EditConfig} {...props}><WrappedImage /></EditableComponent>

MapTo(RESOURCE_TYPE)(EditableImage);

export default EditableImage;
  1. Creare un file SCSS src/components/editable/EditableImage.scss che fornisce stili personalizzati per EditableImage.scss. Questi stili sono destinati alle classi CSS del componente React modificabile.

  2. Aggiungi il seguente SCSS a EditableImage.scss

    code language-css
    .cmp-image__image {
        margin: 1rem 0;
        width: 100%;
        border: 0;
     }
    
  3. Importa EditableImage.scss in EditableImage.js

    code language-javascript
    ...
    import './EditableImage.scss';
    ...
    

L’implementazione del componente Immagine modificabile sarà simile alla seguente:

Componente immagine modificabile

Importare i componenti modificabili

Nell'applicazione a pagina singola viene fatto riferimento ai componenti React EditableText e EditableImage appena creati e vengono create dinamicamente in base al JSON restituito da AEM. Per assicurarsi che questi componenti siano disponibili per l'applicazione a pagina singola, creare le relative istruzioni di importazione in Home.js

  1. Apri il progetto SPA nell’IDE

  2. Apri il file in src/Home.js

  3. Aggiungi istruzioni di importazione per AEMText e AEMImage

    code language-javascript
    ...
    // The following need to be imported, so that MapTo is run for the components
    import EditableText from './editable/EditableText';
    import EditableImage from './editable/EditableImage';
    ...
    

The result should look like:

Home.js

If these imports are not added, the EditableText and EditableImage code is not be invoked by SPA, and thus, the components are not mapped to the provided resource types.

Configuring the container in AEM

AEM container components use policies to dictate their allowed components. This is a critical configuration when using SPA Editor, since only AEM Components that have mapped SPA component counterparts are render-able by the SPA. Ensure only the components which we've provided SPA implementations for are allowed:

  • EditableTitle mapped to wknd-app/components/title
  • EditableText mapped to wknd-app/components/text
  • EditableImage mapped to wknd-app/components/image

To configure the Remote SPA Page template's reponsivegrid container:

  1. Accedi ad AEM Author

  2. Navigate to Tools > General > Templates > WKND App

  3. Edit Report SPA Page

    Responsive Grid policies

  4. Select Structure in the mode switcher in the top right

  5. Tap to select the Layout Container

  6. Tap the Policy icon in the popup bar

    Responsive Grid policies

  7. On the right, under the Allowed Components tab, expand WKND APP - CONTENT

  8. Ensure only following are selected:

    1. Immagine
    2. Testo
    3. Titolo

    Remote SPA Page

  9. Tocca Fine

Authoring the container in AEM

After the SPA updated to embed the <ResponsiveGrid...>, wrappers for three editable React components (EditableTitle, EditableText, and EditableImage), and AEM is updated with a matching Template policy, we can start authoring content in the container component.

  1. Accedi ad AEM Author

  2. Passa a Sites > App WKND

  3. Tocca Home e seleziona Modifica dalla barra delle azioni superiore

    1. A "Hello World" Text component displays, as this was automatically added when generating the project from the AEM Project archetype
  4. Select Edit from the mode-selector in the top right of the Page Editor

  5. Locate the Layout Container editable area beneath the Title

  6. Apri la barra laterale dell'Editor pagine e seleziona la visualizzazione Componenti

  7. Drag the following components into the Layout Container

    1. Immagine
    2. Titolo
  8. Drag the components to reorder them to the following order:

    1. Titolo
    2. Immagine
    3. Testo
  9. Author the Title component

    1. Tap the Title component, and tap the wrench icon to edit the Title component

    2. Add the following text:

      1. Title: Summer is coming, let's make the most of it!
      2. Type: H1
    3. Tocca Fine

  10. Author the Image component

    1. Drag an image in from the Side bar (after switching to the Assets view) on the Image component
    2. Tap the Image component, and tap the wrench icon to edit
    3. Check the Image is decorative checkbox
    4. Tocca Fine
  11. Author the Text component

    1. Edit the Text component by tapping the Text component, and tapping the wrench icon
    2. Add the following text:
      1. Right now, you can get 15% on all 1-week adventures, and 20% off on all adventures that are 2 weeks or longer! At checkout, add the campaign code SUMMERISCOMING to get your discounts!
    3. Tocca Fine
  12. I componenti ora sono creati, ma si sovrappongono in verticale.

    Componenti creati

    Utilizza la modalità Layout di AEM per regolare le dimensioni e il layout dei componenti.

  13. Passa a Modalità layout utilizzando il selettore modalità in alto a destra

  14. Ridimensiona i componenti Immagine e Testo in modo che siano affiancati

    1. Il componente Immagine deve avere 8 colonne
    2. Il componente Testo deve avere 3 colonne

    Componenti layout

  15. Visualizza in anteprima le modifiche nell'Editor pagina di AEM

  16. Aggiorna l'app WKND in esecuzione localmente su http://localhost:3000 per visualizzare le modifiche create.

    Componente contenitore nellapplicazione a pagina singola

Congratulazioni.

Hai aggiunto un componente contenitore che consente agli autori di aggiungere componenti modificabili all’app WKND. Ora sai come:

  • Utilizzare il componente ResponsiveGrid del componente modificabile AEM React nell'applicazione a pagina singola
  • Creare e registrare componenti React modificabili (testo e immagine) da utilizzare nell’applicazione a pagina singola tramite il componente contenitore
  • Configura il modello Pagina applicazione a pagina singola remota per consentire i componenti abilitati per l’applicazione a pagina singola
  • Aggiungere componenti modificabili al componente contenitore
  • Componenti di authoring e layout nell’editor SPA

Passaggi successivi

Il passaggio successivo utilizza la stessa tecnica per aggiungere un componente modificabile a un percorso Dettagli avventura nell'applicazione a pagina singola.

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