Redigerbara behållarkomponenter
Fasta komponenter ger viss flexibilitet vid redigering SPA innehåll, men det här tillvägagångssättet är stelt och kräver att utvecklare definierar den exakta kompositionen för det redigerbara innehållet. SPA Editor stöder användningen av behållarkomponenter i SPA för att skapa exceptionella upplevelser för författare. Med behållarkomponenter kan författare dra och släppa tillåtna komponenter i behållaren och redigera dem, precis som i traditionell AEM Sites-redigering!
I det här kapitlet lägger vi till en redigerbar behållare i hemvyn som gör att författare kan skapa och layouta avancerat innehåll med hjälp av redigerbara React-komponenter direkt i SPA.
Uppdatera WKND-appen
Så här lägger du till en behållarkomponent i hemvyn:
- Importera AEM React Editable Components
ResponsiveGrid
-komponent - Importera och registrera anpassade redigerbara React-komponenter (text och bild) för användning i ResponsiveGrid-komponenten
Använda komponenten ResponsiveGrid
Så här lägger du till ett redigerbart område i hemvyn:
-
Öppna och redigera
react-app/src/components/Home.js
-
Importera komponenten
ResponsiveGrid
från@adobe/aem-react-editable-components
och lägg till den i komponentenHome
. -
Ange följande attribut för komponenten
<ResponsiveGrid...>
pagePath = '/content/wknd-app/us/en/home'
itemPath = 'root/responsivegrid'
Detta instruerar komponenten
ResponsiveGrid
att hämta sitt innehåll från den AEM resursen:/content/wknd-app/us/en/home/jcr:content/root/responsivegrid
itemPath
mappar till nodenresponsivegrid
som definieras i AEMRemote SPA Page
och skapas automatiskt på nya AEM sidor som skapas från AEMRemote SPA Page
.Uppdatera
Home.js
om du vill lägga till komponenten<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> ); }
Filen Home.js
ska se ut så här:
Skapa redigerbara komponenter
För att få full effekt av de flexibla redigeringsfunktionerna i SPA. Vi har redan skapat en redigerbar Title-komponent, men vi ska göra några till så att författarna kan använda redigerbar text och bilder i den nyligen tillagda ResponsiveGrid-komponenten.
De nya redigerbara komponenterna Text och Bildredigering skapas med hjälp av det redigerbara komponentdefinitionsmönstret som exporteras i redigerbara fasta komponenter.
Redigerbar textkomponent
-
Öppna SPA i din utvecklingsmiljö
-
Skapa en React-komponent på
src/components/editable/core/Text.js
-
Lägg till följande kod i
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; }
-
Skapa en redigerbar React-komponent på
src/components/editable/EditableText.js
-
Lägg till följande kod i
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;
Implementeringen av den redigerbara textkomponenten ska se ut så här:
Bildkomponent
-
Öppna SPA i din utvecklingsmiljö
-
Skapa en React-komponent på
src/components/editable/core/Image.js
-
Lägg till följande kod i
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> ) };
-
Skapa en redigerbar React-komponent på
src/components/editable/EditableImage.js
-
Lägg till följande kod i
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;
-
Skapa en SCSS-fil
src/components/editable/EditableImage.scss
som innehåller anpassade format förEditableImage.scss
. Dessa format har CSS-klasserna för den redigerbara React-komponenten som mål. -
Lägg till följande SCSS i
EditableImage.scss
code language-css .cmp-image__image { margin: 1rem 0; width: 100%; border: 0; }
-
Importera
EditableImage.scss
iEditableImage.js
code language-javascript ... import './EditableImage.scss'; ...
Implementeringen av den redigerbara bildkomponenten ska se ut så här:
Importera redigerbara komponenter
De nyskapade komponenterna EditableText
och EditableImage
React refereras i SPA och instansieras dynamiskt baserat på den JSON som returneras av AEM. Om du vill vara säker på att de här komponenterna är tillgängliga för SPA skapar du importprogramsatser för dem i Home.js
-
Öppna SPA i din utvecklingsmiljö
-
Öppna filen
src/Home.js
-
Lägg till importprogramsatser för
AEMText
ochAEMImage
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'; ...
Resultatet ska se ut så här:
Om dessa importer inte läggs till anropas inte EditableText
- och EditableImage
-koden av SPA, och komponenterna mappas därför inte till de angivna resurstyperna.
Konfigurera behållaren i AEM
AEM behållarkomponenter använder profiler för att styra deras tillåtna komponenter. Detta är en viktig konfiguration när du använder SPA Editor, eftersom endast AEM komponenter som har mappade SPA komponentmotsvarigheter kan återges av SPA. Se till att endast de komponenter som vi har SPA implementeringar för tillåts:
EditableTitle
har mappats tillwknd-app/components/title
EditableText
har mappats tillwknd-app/components/text
EditableImage
har mappats tillwknd-app/components/image
Så här konfigurerar du SPA på fjärrsidmallens reponsivegrid-behållare:
-
Logga in på AEM författare
-
Navigera till Verktyg > Allmänt > Mallar > WKND-app
-
Redigera SPA
-
Välj Struktur i lägesväljaren i det övre högra hörnet
-
Tryck för att välja layoutbehållaren
-
Tryck på ikonen Policy i popup-fältet
-
Till höger, under fliken Tillåtna komponenter, expanderar du WKND APP - CONTENT
-
Se till att endast följande är markerade:
- Bild
- Text
- Titel
-
Tryck på Klar
Redigerar behållaren i AEM
När SPA har uppdaterats för att bädda in <ResponsiveGrid...>
, omslutningar för tre redigerbara React-komponenter (EditableTitle
, EditableText
och EditableImage
) och AEM har uppdaterats med en matchande Template-princip, kan vi börja skapa innehåll i behållarkomponenten.
-
Logga in på AEM författare
-
Navigera till Webbplatser > WKND-app
-
Tryck på Hem och välj Redigera i det övre åtgärdsfältet
- En"Hello World"-textkomponent visas, eftersom den lades till automatiskt när projektet genererades från den AEM projekttypen
-
Välj Redigera i lägesväljaren längst upp till höger i sidredigeraren
-
Leta reda på det redigerbara området Layoutbehållare under rubriken
-
Öppna sidredigerarens sidfält och välj vyn Komponenter
-
Dra följande komponenter till layoutbehållaren
- Bild
- Titel
-
Dra komponenterna för att ordna om dem till följande ordning:
- Titel
- Bild
- Text
-
Författare komponenten Title
-
Tryck på komponenten Title (Rubrik) och tryck på ikonen wrench för att redigera komponenten Title (Rubrik)
-
Lägg till följande text:
- Titel: Sommaren kommer, vi får ut det mesta av den!
- Typ: H1
-
Tryck på Klar
-
-
Författare komponenten Bild
- Dra en bild i från sidfältet (efter att du växlat till Assets-vyn) på bildkomponenten
- Tryck på bildkomponenten och tryck på ikonen skiftnyckel för att redigera
- Markera kryssrutan Bilden är dekorativ
- Tryck på Klar
-
Författare komponenten Text
- Redigera textkomponenten genom att trycka på textkomponenten och trycka på ikonen skiftnyckel
- Lägg till följande text:
- Just nu kan du få 15 % på alla veckolånga äventyr och 20 % rabatt på alla äventyr som är två veckor eller längre! Lägg till kampanjkoden SUMMERISCOMING för att få dina rabatter i kassan!
- Tryck på Klar
-
Dina komponenter är nu redigerade, men staplas lodrätt.
Använd AEM layoutläge för att justera komponenternas storlek och layout.
-
Växla till layoutläge med lägesväljaren i det övre högra hörnet
-
Ändra storlek på bild- och textkomponenterna så att de visas sida vid sida
- Bild-komponenten ska vara 8 kolumner bred
- Komponenten Text ska vara 3 kolumner bred
-
Förhandsgranska dina ändringar i AEM Page Editor
-
Uppdatera WKND-appen som körs lokalt på http://localhost:3000 om du vill se de ändringar som har skapats.
Grattis!
Du har lagt till en behållarkomponent som gör att redigerbara komponenter kan läggas till av författare i WKND-appen! Nu kan du:
- Använd AEM React Editable Components
ResponsiveGrid
i SPA - Skapa och registrera redigerbara React-komponenter (text och bild) för användning i SPA via behållarkomponenten
- Konfigurera SPA för att tillåta de SPA komponenterna
- Lägga till redigerbara komponenter i behållarkomponenten
- Författar och layoutkomponenter i SPA Editor
Nästa steg
I nästa steg används samma teknik för att lägga till en redigerbar komponent i en Adventure Details-väg i SPA.