Componentes de contenedor editables

IMPORTANT
El editor de SPA ha quedado obsoleto para nuevos proyectos. Sigue siendo compatible con Adobe para los proyectos existentes, pero no debe utilizarse para nuevos proyectos. Los editores preferidos para administrar contenido en AEM ahora son:

Los componentes fijos proporcionan cierta flexibilidad para la creación de contenido de SPA; sin embargo, este enfoque es rígido y requiere que los desarrolladores definan la composición exacta del contenido editable. Para admitir la creación de experiencias excepcionales por parte de los autores, el Editor de SPA admite el uso de componentes de contenedor en la SPA. Los componentes de contenedor permiten a los autores arrastrar y soltar los componentes permitidos en el contenedor y crearlos, tal como lo pueden hacer en la creación tradicional de AEM Sites.

Componentes de contenedor editables

En este capítulo, agregamos un contenedor editable a la vista de inicio que permite a los autores componer y diseñar experiencias de contenido enriquecido mediante componentes de React editables directamente en la SPA.

Actualización de la aplicación WKND

Para agregar un componente de contenedor a la vista Inicio:

  • Import the AEM React Editable Component's ResponsiveGrid component
  • Importar y registrar componentes React editables personalizados (texto e imagen) para utilizarlos en el componente Cuadrícula interactiva

Uso del componente Cuadrícula interactiva

Para agregar un área editable a la vista Inicio:

  1. Abrir y editar react-app/src/components/Home.js

  2. Importar el componente ResponsiveGrid desde @adobe/aem-react-editable-components y agregarlo al componente Home.

  3. Establezca los siguientes atributos en el componente <ResponsiveGrid...>

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

    Esto indica al componente ResponsiveGrid que recupere su contenido del recurso de AEM:

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

    itemPath se asigna al nodo responsivegrid definido en la plantilla de AEM Remote SPA Page y se crea automáticamente en las nuevas páginas de AEM creadas a partir de la plantilla de AEM Remote SPA Page.

    Update Home.js to add the <ResponsiveGrid...> component.

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

El archivo Home.js debe tener el siguiente aspecto:

Home.js

Create editable components

Para obtener el efecto completo de la flexibilidad que ofrecen los contenedores de experiencia de creación en el Editor de SPA. Ya hemos creado un componente Título editable, pero vamos a hacer algunos más que permitan a los autores utilizar componentes Texto e Imagen editables en el componente Cuadrícula interactiva recién agregado.

Los nuevos componentes Texto editable y Reacción de imagen se crean utilizando el patrón de definición de componente editable exportado en componentes fijos editables.

Componente de texto editable

  1. Abra el proyecto SPA en su IDE

  2. Crear un componente de React en src/components/editable/core/Text.js

  3. Agregar el siguiente código 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. Crear un componente React editable en src/components/editable/EditableText.js

  5. Agregar el siguiente código 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;
    

La implementación del componente Texto editable debería tener un aspecto similar al siguiente:

Componente de texto editable

Componente de imagen

  1. Abra el proyecto SPA en su IDE

  2. Crear un componente de React en src/components/editable/core/Image.js

  3. Agregar el siguiente código 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. Crear un componente React editable en src/components/editable/EditableImage.js

  5. Agregar el siguiente código 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. Cree un archivo SCSS src/components/editable/EditableImage.scss que proporcione estilos personalizados para EditableImage.scss. Estos estilos se dirigen a las clases CSS del componente React editable.

  2. Agregar el SCSS siguiente a EditableImage.scss

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

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

La implementación del componente Imagen editable debe tener un aspecto similar al siguiente:

Componente de imagen editable

Importar los componentes editables

Se hace referencia en la SPA a los componentes EditableText y EditableImage React recién creados y se crean instancias de forma dinámica en función del JSON devuelto por AEM. Para asegurarse de que estos componentes están disponibles para la SPA, cree instrucciones de importación para ellos en Home.js

  1. Abra el proyecto SPA en su IDE

  2. Abra el archivo src/Home.js

  3. Agregar instrucciones de importación para AEMText y 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';
    ...
    

El resultado debería ser similar al siguiente:

Home.js

Si se agregan estas importaciones no, la SPA no invocará el código EditableText y EditableImage y, por lo tanto, los componentes no están asignados a los tipos de recursos proporcionados.

Configuración del contenedor en AEM

Los componentes de contenedor de AEM utilizan directivas para dictar los componentes permitidos. Esta configuración es crítica al utilizar el Editor de SPA, ya que solo los componentes de AEM que tienen equivalentes de componentes de SPA asignados se pueden procesar mediante la SPA. Asegúrese de que solo se permiten los componentes para los que hemos proporcionado implementaciones de SPA:

  • EditableTitle se asignó a wknd-app/components/title
  • EditableText se asignó a wknd-app/components/text
  • EditableImage se asignó a wknd-app/components/image

Para configurar el contenedor de cuadrícula adaptable de la plantilla de la SPA remota:

  1. Iniciar sesión en AEM Author

  2. Vaya a Herramientas > General > Plantillas > Aplicación WKND

  3. Editar página de SPA de informe

    Políticas de cuadrícula adaptable

  4. Seleccione Estructura en el conmutador de modo en la parte superior derecha

  5. Pulse para seleccionar Contenedor de diseño

  6. Pulse el icono Directiva en la barra emergente

    Políticas de cuadrícula adaptable

  7. A la derecha, en la ficha Componentes permitidos, expanda WKND APP - CONTENT

  8. Asegúrese de que solo están seleccionadas las siguientes opciones:

    1. Imagen
    2. Texto
    3. Título

    Página de SPA remota

  9. Pulse Listo

Creación del contenedor en AEM

Después de actualizar el SPA para incrustar <ResponsiveGrid...>, los contenedores de tres componentes React editables (EditableTitle, EditableText y EditableImage) y de actualizar AEM con una directiva de plantilla coincidente, se puede empezar a crear contenido en el componente contenedor.

  1. Log in to AEM Author

  2. Navigate to Sites > WKND App

  3. Tap Home and select Edit from the top action bar

    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. Open the Page Editor's side bar, and select the Components view

  7. Drag the following components into the Layout Container

    1. Imagen
    2. Título
  8. Drag the components to reorder them to the following order:

    1. Título
    2. Imagen
    3. Texto
  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. Tap Done

  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. Tap Done
  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. Tap Done
  12. Your components are now authored, but stack vertically.

    Authored components

    Use AEM's Layout Mode to allow us to adjust the size and layout of the components.

  13. Switch to Layout Mode using the mode-selector in the top-right

  14. Resize the Image and Text components, such that they are side by side

    1. Image component should be 8 columns wide
    2. Text component should be 3 columns wide

    Layout components

  15. Preview your changes in AEM Page Editor

  16. Refresh the WKND App running locally on http://localhost:3000 to see the authored changes!

    Container component in SPA

Enhorabuena.

You've added a container component that allows for editable components to be added by authors to the WKND App! You now know how to:

  • Use the AEM React Editable Component's ResponsiveGrid component in the SPA
  • Create and register editable React components (Text and Image) for use in the SPA via the container component
  • Configure the Remote SPA Page template to allow the SPA-enabled components
  • Add editable components to the container component
  • Author and layout components in SPA Editor

Próximos pasos

The next step uses this same technique to add an editable component to an Adventure Details route in the SPA.

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