När du bestämmer vilken nivå av integration du vill ha mellan dina externa SPA och AEM behöver du ofta kunna redigera och visa SPA inom AEM.
I det här dokumentet beskrivs de rekommenderade stegen för att överföra en fristående SPA till en AEM, lägga till redigerbara innehållsavsnitt och aktivera redigering.
Förutsättningarna är enkla.
Först måste du överföra den externa SPA till ditt AEM.
src
i /ui.frontend
projektmapp med React-programmets src
mapp.package.json
i /ui.frontend/package.json
-fil.
/public
mapp./public/index.html
-fil.Nu när den externa SPA är en del av ditt AEM projekt måste den konfigureras inom AEM.
För att dra nytta av AEM SPA funktioner finns det beroenden av följande tre paket.
@adobe/aem-react-editable-components
@adobe/aem-spa-component-mapping
@adobe/aem-spa-page-model-manager
@adobe/aem-spa-page-model-manager
innehåller API:t för att initiera en modellhanterare och hämta modellen från AEM. Den här modellen kan sedan användas för att återge AEM komponenter med API:er från @adobe/aem-react-editable-components
och @adobe/aem-spa-component-mapping
.
Kör följande npm-kommando för att installera de nödvändiga paketen.
npm install --save @adobe/aem-spa-component-mapping @adobe/aem-spa-page-model-manager @adobe/aem-react-editable-components
Innan appen återges visas ModelManager
måste initieras för att hantera skapandet av AEM ModelStore
.
Detta måste göras inom src/index.js
-fil i programmet eller var programmets rot återges.
För detta kan vi använda initializationAsync
API från ModelManager
.
Följande skärmbild visar hur du aktiverar initiering av ModelManager
i ett enkelt React-program. Den enda begränsningen är att initializationAsync
måste anropas innan ReactDOM.render()
.
I det här exemplet ModelManager
har initierats och är tom ModelStore
skapas.
initializationAsync
kan acceptera options
objekt som parameter:
path
- Vid initiering hämtas modellen vid den definierade sökvägen och lagras i ModelStore
. Detta kan användas för att hämta rootModel
vid initiering om det behövs.modelClient
- Tillåter att du anger en anpassad klient som ansvarar för att hämta modellen.model
- A model
objekt som skickas som en parameter som vanligtvis fylls i när med SSR.Skapa/identifiera en AEM som en redigerbar React-komponent ska skapas för. I det här exemplet använder vi WKND-projektets textkomponent.
Skapa en enkel React-textkomponent i SPA. I det här exemplet finns en ny fil Text.js
har skapats med följande innehåll.
Skapa ett konfigurationsobjekt för att ange de attribut som krävs för att aktivera AEM redigering.
resourceType
är obligatoriskt för att mappa React-komponenten till AEM och aktivera redigering när den öppnas i AEM.Använda funktionen wrapper withMappable
.
Den här wrapper-funktionen mappar React-komponenten till AEM resourceType
anges i konfigurationen och aktiverar redigeringsfunktioner när de öppnas i AEM. För fristående komponenter hämtas även modellinnehållet för den specifika noden.
I det här exemplet finns det separata versioner av komponenten: AEM inkapslade och oförpackade React-komponenter. Den omslutna versionen måste användas när komponenten används explicit. När komponenten är en del av en sida kan du fortsätta använda standardkomponenten på samma sätt som i SPA.
Återge innehåll i komponenten.
JCR-egenskaperna för textkomponenten visas på följande sätt i AEM.
Dessa värden skickas som egenskaper till de nyskapade AEMText
Reaktionskomponent och kan användas för att återge innehållet.
import React from 'react';
import { withMappable } from '@adobe/aem-react-editable-components';
export const TextEditConfig = {
// Empty component placeholder label
emptyLabel:'Text',
isEmpty:function(props) {
return !props || !props.text || props.text.trim().length < 1;
},
// resourcetype of the AEM counterpart component
resourceType:'wknd-spa-react/components/text'
};
const Text = ({ text }) => (<div>{text}</div>);
export default Text;
export const AEMText = withMappable(Text, TextEditConfig);
Så här visas komponenten när AEM har konfigurerats.
const Text = ({ cqPath, richText, text }) => {
const richTextContent = () => (
<div className="aem_text" id={cqPath.substr(cqPath.lastIndexOf('/') + 1)} data-rte-editelement dangerouslySetInnerHTML={{__html: text}}/>
);
return richText ? richTextContent() : (<div className="aem_text">{text}</div>);
};
I det här exemplet har vi gjort ytterligare anpassningar av den återgivna komponenten för att matcha den befintliga textkomponenten. Detta har dock inget med AEM att göra.
När de redigerbara React-komponenterna har skapats kan vi använda dem i hela programmet.
Låt oss ta en exempelsida där vi behöver lägga till en text från WKND-SPA. I det här exemplet vill vi visa texten"Hello World!" på /content/wknd-spa-react/us/en/home.html
.
Ange sökvägen till noden som ska visas.
pagePath
: Sidan som innehåller noden, i vårt exempel /content/wknd-spa-react/us/en/home
itemPath
: Sökväg till noden på sidan, i vårt exempel root/responsivegrid/text
Lägg till en komponent på önskad plats på sidan.
The AEMText
-komponenten kan läggas till vid den önskade positionen på sidan med pagePath
och itemPath
värden anges som egenskaper. pagePath
är en obligatorisk egenskap.
Vi kan nu testa komponenten på vår AEM som körs.
aem-guides-wknd-spa
katalog för att skapa och distribuera projektet till AEM.mvn clean install -PautoInstallSinglePackage
http://<host>:<port>/editor.html/content/wknd-spa-react/us/en/home.html
.The AEMText
-komponenten är nu AEM.
Identifiera en sida som ska läggas till för redigering i SPA. Det här exemplet använder /content/wknd-spa-react/us/en/home.html
.
Skapa en ny fil (t.ex. Page.js
) för den redigerbara sidkomponenten. Här kan vi återanvända sidkomponenten som anges i @adobe/cq-react-editable-components
.
Upprepa steg fyra i avsnittet AEM skrivbara komponenter. Använda funktionen wrapper withMappable
på komponenten.
Använd MapTo
till AEM för alla underordnade komponenter på sidan.
import { Page, MapTo, withMappable } from '@adobe/aem-react-editable-components';
import Text, { TextEditConfig } from './Text';
export default withMappable(Page);
MapTo('wknd-spa-react/components/text')(Text, TextEditConfig);
I det här exemplet använder vi den obrutna React-textkomponenten i stället för den omslutna AEMText
tidigare. Detta beror på att när komponenten är en del av en sida/behållare och inte fristående, kommer behållaren att hantera rekursiv mappning av komponenten och aktivera redigeringsfunktioner och den extra adaptern behövs inte för varje underordnad.
Om du vill lägga till en skrivbar sida i SPA följer du samma steg i avsnittet Lägg till redigerbara komponenter på sidan. Här kan vi hoppa över itemPath
-egenskapen.
Följ samma steg i avsnittet för att kontrollera att sidan kan redigeras Verifiera redigering av textinnehåll på AEM.
Sidan kan nu redigeras på AEM med en layoutbehållare och en underordnad textkomponent.
I de föregående exemplen lade vi till komponenter i SPA med befintligt AEM. Det finns emellertid fall där innehåll ännu inte har skapats i AEM, men måste läggas till senare av innehållsförfattaren. För att tillgodose detta kan frontendutvecklaren lägga till komponenter på lämpliga platser i SPA. Komponenterna visar platshållare när de öppnas i redigeraren i AEM. När innehållet har lagts till i platshållarna av innehållsförfattaren skapas noderna i JCR-strukturen och innehållet bevaras. Komponenten som skapas tillåter samma uppsättning åtgärder som de fristående bladkomponenterna.
I det här exemplet återanvänder vi AEMText
som har skapats tidigare. Vi vill att ny text ska läggas till under den befintliga textkomponenten på WKND-startsidan. Tillägget av komponenter är detsamma som för normala bladkomponenter. Men itemPath
kan uppdateras till den bana där den nya komponenten måste läggas till.
Eftersom den nya komponenten måste läggas till under den befintliga texten på root/responsivegrid/text
blir den nya banan root/responsivegrid/{itemName}
.
<AEMText
pagePath='/content/wknd-spa-react/us/en/home'
itemPath='root/responsivegrid/text_20' />
The TestPage
-komponenten ser ut så här när den virtuella komponenten har lagts till.
Se till att AEMText
komponenten har resourceType
anges i konfigurationen för att aktivera den här funktionen.
Du kan nu distribuera ändringarna till AEM genom att följa stegen i avsnittet Verifiera redigering av textinnehåll på AEM. En platshållare visas för de som inte finns text_20
nod.
När innehållsförfattaren uppdaterar den här komponenten visas en ny text_20
noden skapas på root/responsivegrid/text_20
in /content/wknd-spa-react/us/en/home
.
Det finns ett antal krav på att lägga till virtuella bladkomponenter och vissa begränsningar.
pagePath
-egenskapen är obligatorisk för att skapa en virtuell komponent.pagePath
måste finnas i det AEM projektet.itemPath
.itemPath='text_20'
i föregående exempel skapas den nya noden direkt under sidan, dvs. /content/wknd-spa-react/us/en/home/jcr:content/text_20
itemPath
.
root/responsivegrid
måste finnas så att den nya noden text_20
kan skapas där.Möjligheten att lägga till behållare stöds, även om motsvarande behållare ännu inte har skapats i AEM. Konceptet och tillvägagångssättet liknar virtuella lövkomponenter.
Utvecklaren kan lägga till behållarkomponenterna på lämpliga platser i SPA och dessa komponenter visar platshållare när de öppnas i redigeraren i AEM. Författaren kan sedan lägga till komponenter och deras innehåll i behållaren, vilket skapar de nödvändiga noderna i JCR-strukturen.
Om en behållare redan finns på /root/responsivegrid
och utvecklaren vill lägga till en ny underordnad behållare:
newContainer
finns ännu inte i AEM.
När du redigerar sidan som innehåller den här komponenten i AEM visas en tom platshållare för en behållare där författaren kan lägga till innehåll.
När författaren lägger till en underordnad komponent i behållaren skapas den nya behållarnoden med motsvarande namn i JCR-strukturen.
Fler komponenter och innehåll kan läggas till i behållaren nu när författaren kräver det och ändringarna bevaras.
Det finns ett antal krav på att lägga till virtuella behållare samt vissa begränsningar.
root/responsivegrid
finns redan i AEM, kan en ny behållare skapas genom att sökvägen anges root/responsivegrid/newContainer
.root/responsivegrid/newContainer/secondNewContainer
är inte möjligt.Om du följde de föregående exemplen går det nu att redigera den externa SPA i AEM. Det finns dock andra aspekter av ditt externa SPA som du kan anpassa ytterligare.
Som standard antar vi att React-programmet återges i en div
för element-ID spa-root
. Om det behövs kan det anpassas.
Anta till exempel att vi har en SPA där programmet återges inuti en div
för element-ID root
. Detta måste återspeglas i tre filer.
I index.js
av React-ansökan (eller var ReactDOM.render()
anropas)
I index.html
av React-programmet
I AEM sidkomponentbrödtext:
body.html
för sidkomponenten.body.html
-fil.Om det finns flera sidor i det externa SPA React-programmet kan använda routning för att bestämma vilken sida/komponent som ska återges. Det grundläggande användningsexemplet är att matcha den aktiva URL:en mot sökvägen som anges för ett flöde. Om du vill aktivera redigering för sådana routningsaktiverade program måste sökvägen som ska matchas mot omformas för att rymma AEM information.
I följande exempel har vi ett enkelt React-program med två sidor. Den sida som ska återges bestäms genom att matcha sökvägen som har angetts till routern mot den aktiva URL:en. Om vi till exempel är på mydomain.com/test
, TestPage
återges.
Följande steg krävs för att aktivera redigering i AEM för det här SPA.
Identifiera nivån som skulle fungera som AEM.
wknd-spa-react/us/en
som SPA. Det innebär att allt som är före den banan AEM bara sidor/innehåll.Skapa en ny sida på önskad nivå.
mydomain.com/test
. test
finns i programmets rotsökväg. Detta måste också bevaras när du skapar sidan i AEM. Därför kan vi skapa en ny sida på den rotnivå som definierades i föregående steg.mydomain.com/test
måste den nya sidan skapas /path/to/aem/root/test
.Lägg till hjälpredor i SPA.
/test
Den AEM aktiva banan är /wknd-spa-react/us/en/test
. För att få plats med den AEM delen av URL:en måste vi lägga till några hjälpredor på SPA.toAEMPath
hjälpen från @adobe/cq-spa-page-model-manager
kan användas för detta. Den omformar sökvägen för routning så att den innehåller AEM delar när programmet är öppet i en AEM. Den godkänner tre parametrar:
Verifiera redigering av sidan i AEM.
test
sida. Sidinnehållet återges nu och AEM kan redigeras.RemotePage-komponenten förväntar sig att implementeringen tillhandahåller ett tillgångsmanifest som den hittades här. RemotePage-komponenten har bara testats för att fungera med React Framework (och Next.js via komponenten remote-page-next) och stöder därför inte fjärrinläsning av program från andra ramverk, till exempel Angular.
Följande referensmaterial kan vara användbart för att förstå SPA i samband med AEM.