SPA AEM Asignación de componentes de a componentes de map-components

Obtenga información sobre cómo asignar componentes de Angular a componentes de Adobe Experience Manager AEM AEM SPA () con el SDK de JS de Editor de. SPA AEM SPA AEM La asignación de componentes permite a los usuarios realizar actualizaciones dinámicas en los componentes de la de componentes del Editor de componentes, de forma similar a la creación tradicional de los componentes de la.

AEM AEM En este capítulo se profundiza en la API del modelo JSON de y en cómo el contenido JSON expuesto por un componente de la se puede insertar automáticamente en un componente de Angular como props.

Objetivo

  1. AEM SPA Obtenga información sobre cómo asignar componentes de la a componentes de la aplicación.
  2. Comprenda la diferencia entre los componentes Contenedor y los componentes Contenido.
  3. Cree un nuevo componente de Angular AEM que se asigne a un componente de existente.

Qué va a generar

SPA AEM En este capítulo se analizará cómo se asigna el componente de Text proporcionado al componente Textde la aplicación de la aplicación de la aplicación de la aplicación de la aplicación de la aplicación de la aplicación de la aplicación. SPA SPA AEM Se crea un nuevo componente de la Image que se puede usar en el y crear en el mismo. Las características predeterminadas de las directivas Contenedor de diseño y Editor de plantillas también se usarán para crear una vista que tenga un aspecto un poco más variado.

Creación final de ejemplo de capítulo

Requisitos previos

Revise las herramientas y las instrucciones necesarias para configurar un entorno de desarrollo local.

Obtener el código

  1. Descargue el punto de partida para este tutorial mediante 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. AEM Implemente el código base en una instancia de local mediante Maven:

    code language-shell
    $ mvn clean install -PautoInstallSinglePackage
    

    AEM Si usa 6.x, agregue el perfil classic:

    code language-shell
    $ mvn clean install -PautoInstallSinglePackage -Pclassic
    

Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/map-components-solution.

Método de asignación

SPA AEM El concepto básico es asignar un componente de a un componente de. AEM Los componentes de, que ejecutan del lado del servidor, exportan contenido como parte de la API del modelo JSON. SPA El contenido JSON lo consume el usuario, que se ejecuta en el lado del cliente en el explorador. SPA AEM Se crea una asignación 1:1 entre los componentes de la y un componente de la.

AEM Información general de alto nivel sobre la asignación de un componente de a un componente de Angular

AEM Información general de alto nivel sobre la asignación de un componente de a un componente de Angular

Inspect el componente Texto

AEM AEM El Arquetipo de proyecto de proporciona un componente Text que está asignado al componente de texto .AEM Este es un ejemplo de un componente content, en el sentido de que procesa content de la.

Veamos cómo funciona el componente.

Inspect el modelo JSON

  1. SPA AEM Antes de saltar al código de la, es importante comprender el modelo JSON que proporciona el usuario de la interfaz de usuario de JSON de la que se proporciona la aplicación. Vaya a la Biblioteca de componentes principales y vea la página del componente Texto. AEM La biblioteca de componentes principales proporciona ejemplos de todos los componentes principales de la.

  2. Seleccione la ficha JSON para uno de los ejemplos:

    Modelo JSON de texto

    Debería ver tres propiedades: text, richText y :type.

    AEM :type es una propiedad reservada que enumera sling:resourceType (o ruta de acceso) del componente de la. AEM SPA El valor de :type es lo que se usa para asignar el componente de la al componente de la.

    SPA text y richText son propiedades adicionales que se exponen al componente de la.

Inspect el componente Texto

  1. Abra un nuevo terminal y vaya a la carpeta ui.frontend dentro del proyecto. Ejecute npm install y luego npm start para iniciar el servidor de desarrollo de Webpack:

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

    El módulo ui.frontend está configurado actualmente para usar el modelo JSON ficticio.

  2. Debería ver una nueva ventana del explorador abierta a http://localhost:4200/content/wknd-spa-angular/us/en/home.html

    Servidor de desarrollo de Webpack con contenido ficticio

  3. AEM SPA En el IDE de su elección, abra el Proyecto de para el WKND. Expanda el módulo ui.frontend y abra el archivo text.component.ts en ui.frontend/src/app/components/text/text.component.ts:

    Código Source del componente de Angular Text.js

  4. El primer área a inspeccionar es el class TextComponent en ~line 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) {}
    }
    

    El decorador @Input() se usa para declarar campos cuyos valores se establecen a través del objeto JSON asignado, revisado anteriormente.

    @HostBinding('innerHtml') get content() es un método que expone el contenido de texto creado del valor de this.text. En caso de que el contenido sea texto enriquecido (determinado por el indicador this.richText), se omite la seguridad integrada del Angular. El DomSanitizer de Angular se usa para "eliminar" el HTML sin procesar y evitar vulnerabilidades de ejecución de scripts en sitios múltiples. El método está enlazado a la propiedad innerHtml mediante el decorador @HostBinding.

  5. A continuación, inspeccione TextEditConfig en ~line 24:

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

    AEM El código anterior es responsable de determinar cuándo procesar el marcador de posición en el entorno de autor de la. Si el método isEmpty devuelve true, se procesará el marcador de posición.

  6. Finalmente, eche un vistazo a la llamada de MapTo en la línea 53:

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

    AEM SPA MapTo lo proporciona el SDK de JS del Editor de la aplicación de código de tiempo de ejecución de la aplicación de la aplicación de código abierto de la aplicación de (@adobe/cq-angular-editable-components). AEM La ruta de acceso wknd-spa-angular/components/text representa el sling:resourceType del componente de la. Esta ruta de acceso coincide con el :type expuesto por el modelo JSON observado anteriormente. SPA MapTo analiza la respuesta del modelo JSON y pasa los valores correctos a las variables @Input() del componente de.

    AEM Puede encontrar la definición del componente Text de la en ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/text.

  7. Experimente modificando el archivo en.model.json en ui.frontend/src/mocks/json/en.model.json.

    En la línea 62, actualice el primer valor Text para que utilice las etiquetas H1 y u:

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

    Vuelva al explorador para ver los efectos que produce el servidor de desarrollo de Webpack:

    Modelo de texto actualizado

    Intente alternar la propiedad richText entre true / false para ver la lógica de procesamiento en acción.

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

    Este archivo está vacío porque la propiedad innerHTML establece todo el contenido del componente.

  9. Inspect app.module.ts en 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 {}
    

    AEM SPA TextComponent no se incluye explícitamente, sino de forma dinámica a través de AEMResponsiveGridComponent proporcionado por el SDK de JS de Editor de de trabajo de la aplicación. Por lo tanto, debe aparecer en la matriz app.module.ts' entryComponents.

Creación del componente de imagen

A continuación, cree un componente de Angular AEM Image que esté asignado al componente de imagen Image de la. El componente Image es otro ejemplo de un componente content.

Inspect el JSON

SPA AEM Antes de saltar al código de la, revise el modelo JSON proporcionado por el administrador de códigos de.

  1. Vaya a los ejemplos de imagen de la biblioteca de componentes principales.

    Componente principal de imagen JSON

    SPA Las propiedades de src, alt y title se usan para rellenar el componente de Image de la.

    note note
    NOTE
    Hay otras propiedades de imagen expuestas (lazyEnabled, widths) que permiten a un desarrollador crear un componente de carga diferida y adaptable. El componente integrado en este tutorial es sencillo y no utiliza estas propiedades avanzadas.
  2. Vuelva a su IDE y abra en.model.json a las ui.frontend/src/mocks/json/en.model.json. Dado que este es un nuevo componente para nuestro proyecto, necesitamos "burlarnos" del JSON de imagen.

    En la línea ~line 70 agregue una entrada JSON para el modelo image (no se olvide de la coma final , después del segundo text_386303036) y actualice la matriz :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"
            ],
    

    El proyecto incluye una imagen de muestra en /mock-content/adobestock-140634652.jpeg que se usa con el servidor de desarrollo de Webpack.

    Puedes ver en.model.json aquí.

  3. Añada una foto estándar para que la muestre el componente.

    Cree una nueva carpeta llamada images debajo de ui.frontend/src/mocks. Descargue adobestock-140634652.jpeg y colóquelo en la carpeta imágenes recién creada. Siéntase libre de usar su propia imagen, si lo desea.

Implementación del componente de imagen

  1. Detenga el servidor de desarrollo de Webpack si se ha iniciado.

  2. Cree un nuevo componente de imagen ejecutando el comando ng generate component de CLI de Angular desde la carpeta ui.frontend:

    code language-shell
    $ ng generate component components/image
    
  3. En el IDE, abra image.component.ts en ui.frontend/src/app/components/image/image.component.ts y actualícelo de la siguiente manera:

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

    AEM ImageEditConfig es la configuración para determinar si se debe procesar el marcador de posición de autor en, en función de si se ha rellenado la propiedad src.

    @Input() de src, alt y title son las propiedades asignadas desde la API JSON.

    hasImage() es un método que determinará si se debe procesar la imagen.

    SPA AEM MapTo asigna el componente de la al componente de la ubicado en ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/image.

  4. Abra image.component.html y actualícelo de la siguiente manera:

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

    Esto procesará el elemento <img> si hasImage devuelve true.

  5. Abra image.component.scss y actualícelo de la siguiente manera:

    code language-scss
    :host-context {
        display: block;
    }
    
    .image {
        margin: 1rem 0;
        width: 100%;
        border: 0;
    }
    
    note note
    NOTE
    AEM SPA La regla :host-context es crítica para que el marcador de posición del editor de funcione correctamente. SPA AEM Todos los componentes de la que se vayan a crear en el editor de páginas de la página necesitarán esta regla como mínimo.
  6. Abra app.module.ts y agregue ImageComponent a la matriz entryComponents:

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

    Al igual que TextComponent, ImageComponent se carga dinámicamente y debe incluirse en la matriz entryComponents.

  7. Inicie webpack dev server para ver el procesamiento de ImageComponent.

    code language-shell
    $ npm run start:mock
    

    Imagen agregada al simulacro

    SPA Imagen agregada a la página de inicio de sesión

    note note
    NOTE
    Desafío adicional: Implemente un nuevo método para mostrar el valor de title como pie de ilustración debajo de la imagen.

AEM Actualizar directivas en el

El componente ImageComponent solo está visible en el servidor de desarrollo de Webpack. SPA AEM A continuación, implemente la plantilla actualizada para implementar y actualizar las directivas de la plantilla.

  1. AEM Detenga el servidor de desarrollo de Webpack y, desde la raíz del proyecto, implemente los cambios para usar sus habilidades con Maven:

    code language-shell
    $ cd aem-guides-wknd-spa
    $ mvn clean install -PautoInstallSinglePackage
    
  2. AEM SPA Desde la pantalla Inicio de la, vaya a Herramientas > Plantillas > Angular de trabajo de WKND.

    SPA Seleccione y edite la Página de la:

    SPA Editar plantilla de página de la página

  3. Seleccione el contenedor de diseño y haga clic en su icono directiva para editar la directiva:

    Política del contenedor de diseño

  4. SPA En Componentes permitidos > Angular de trabajo de WKND - Contenido > compruebe el componente Imagen:

    Componente de imagen seleccionado

    SPA En Componentes predeterminados > Agregar asignación y elija el componente Imagen - Angular de trabajo de WKND - Contenido:

    Establecer componentes predeterminados

    Escriba un tipo mime de image/*.

    Haga clic en Listo para guardar las actualizaciones de la directiva.

  5. En el contenedor de diseño, haga clic en el icono directiva para el componente Texto:

    Icono de directiva de componente de texto

    SPA Cree una nueva directiva con el nombre WKND Texto de la. En Complementos > Formato > marque todas las casillas para habilitar opciones de formato adicionales:

    Habilitar formato RTE

    En Complementos > Estilos de párrafo > marque la casilla para habilitar estilos de párrafo:

    Activar estilos de párrafo

    Haga clic en Listo para guardar la actualización de la directiva.

  6. Vaya a Página principal http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html.

    También debería poder editar el componente Text y agregar estilos de párrafo adicionales en el modo pantalla completa.

    Edición de texto enriquecido en pantalla completa

  7. También debería poder arrastrar y soltar una imagen desde Buscador de recursos:

    Arrastrar y soltar imagen

  8. Agregue sus propias imágenes a través de AEM Assets o instale la base de código final para el sitio de referencia WKND estándar. SPA El sitio de referencia WKND incluye muchas imágenes que se pueden reutilizar en el sitio de referencia de WKND. AEM El paquete se puede instalar usando el Administrador de paquetes de.

    Administrador de paquetes instala wknd.all

Inspect el contenedor de diseño

AEM SPA El SDK del editor de diseños proporciona automáticamente compatibilidad con el contenedor de diseños. El contenedor de diseño, tal como indica el nombre, es un componente contenedor. Los componentes de contenedor son componentes que aceptan estructuras JSON que representan otros componentes y las instancian dinámicamente.

Vamos a inspeccionar más el contenedor de diseño.

  1. En el IDE, abra responsive-grid.component.ts a las 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);
    

    AEM SPA AEMResponsiveGridComponent se implementó como parte del SDK del Editor de código de tiempo de la y se incluyó en el proyecto a través de import-components.

  2. En un explorador, vaya a http://localhost:4502/content/wknd-spa-angular/us/en.model.json

    API de modelo JSON: cuadrícula interactiva

    SPA El componente Contenedor de diseño tiene un sling:resourceType de wcm/foundation/components/responsivegrid y el Editor de recursos lo reconoce usando la propiedad :type, al igual que los componentes Text y Image.

    SPA Las mismas capacidades para cambiar el tamaño de un componente mediante Modo de diseño están disponibles con el Editor de elementos de diseño de la página de la página de la página de la página de la página de la página de la página de la página de inicio de la página de.

  3. Volver a http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html. Agregue componentes adicionales de Image e intente cambiar su tamaño con la opción Diseño:

    Cambiar el tamaño de la imagen mediante el modo Diseño

  4. Vuelva a abrir el modelo JSON http://localhost:4502/content/wknd-spa-angular/us/en.model.json y observe columnClassNames como parte del JSON:

    Nombres de clase de columna

    El nombre de clase aem-GridColumn--default--4 indica que el componente debe tener 4 columnas de ancho basado en una cuadrícula de 12 columnas. Encontrará más detalles sobre la cuadrícula adaptable aquí.

  5. Vuelva al IDE y en el módulo ui.apps hay una biblioteca del lado del cliente definida en ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/clientlibs/clientlib-grid. Abra el archivo less/grid.less.

    Este archivo determina los puntos de interrupción (default, tablet y phone) utilizados por el contenedor de diseño. El propósito de este archivo es personalizarlo según las especificaciones del proyecto. Actualmente los puntos de interrupción están establecidos en 1200px y 650px.

  6. Debe poder utilizar las capacidades adaptables y las directivas de texto enriquecido actualizadas del componente Text para crear una vista como la siguiente:

    Creación final de ejemplo de capítulo

Enhorabuena. congratulations

SPA AEM Felicidades, ha aprendido a asignar componentes de la a componentes de la y ha implementado un nuevo componente Image. También tiene la oportunidad de explorar las capacidades adaptables de Contenedor de diseño.

Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/map-components-solution.

Siguientes pasos next-steps

SPA AEM SPA Navegación y enrutamiento: descubra cómo se pueden admitir varias vistas en la asignando a páginas de la lista de distribución con el SDK del Editor de la página de la lista de distribución (SDK) del editor de la lista de distribución. La navegación dinámica se implementa mediante Angular Router y se añade a un componente de encabezado existente.

Bonificación: mantener configuraciones para el control de código fuente bonus

AEM En muchos casos, especialmente al principio de un proyecto de, es importante mantener las configuraciones, como las plantillas y las directivas de contenido relacionadas, para el control de código fuente. Esto garantiza que todos los desarrolladores trabajen con el mismo conjunto de contenido y configuraciones y puede garantizar una coherencia adicional entre entornos. Una vez que un proyecto alcanza un cierto nivel de madurez, la práctica de administrar plantillas se puede transferir a un grupo especial de usuarios avanzados.

AEM AEM Los siguientes pasos se llevarán a cabo con el IDE de código de Visual Studio y la sincronización de código de VSC VSCode, pero podrían realizarse con cualquier herramienta y cualquier IDE que haya configurado para extraer o importar contenido de una instancia local de.

  1. AEM En el IDE de código de Visual Studio, asegúrese de que tiene VSCode Sync instalado mediante la extensión Marketplace:

    AEM VSCodeSincronización de

  2. Expanda el módulo ui.content en el explorador del proyecto y vaya a /conf/wknd-spa-angular/settings/wcm/templates.

  3. AEM Haga clic con el botón derecho en la carpeta templates y seleccione Importar desde el servidor:

    Plantilla de importación de VSCode

  4. Repita los pasos para importar contenido, pero seleccione la carpeta policies ubicada en /conf/wknd-spa-angular/settings/wcm/policies.

  5. Inspect agregó el archivo filter.xml ubicado en 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-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>
    

    El archivo filter.xml es responsable de identificar las rutas de acceso de los nodos instalados con el paquete. Observe el mode="merge" en cada uno de los filtros que indica que el contenido existente no se modificará, solo se agregará contenido nuevo. Dado que los autores de contenido pueden estar actualizando estas rutas, es importante que una implementación de código sobrescriba el contenido no. Consulte la documentación de FileVault para obtener más información sobre cómo trabajar con elementos de filtro.

    Compare ui.content/src/main/content/META-INF/vault/filter.xml y ui.apps/src/main/content/META-INF/vault/filter.xml para comprender los diferentes nodos administrados por cada módulo.

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