Redigera en extern SPA i Adobe Experience Manager editing-external-spa-within-aem
När du bestämmer vilken nivå av integration du vill ha mellan din externa SPA och Adobe Experience Manager (AEM) behöver du ofta kunna redigera och visa SPA i AEM.
Ökning overview
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ättningar prerequisites
Förutsättningarna är enkla.
-
Kontrollera att en instans av AEM körs lokalt.
-
Skapa ett AEM SPA med den AEM projektarkitekturen.
- Detta utgör grunden för det AEM projektet som kommer att uppdateras för att inkludera det externa SPA.
- Exemplen i det här dokumentet använder startpunkten för WKND-SPA.
-
Ha den fungerande, externa SPA som ni vill integrera till hands.
Överför SPA till AEM upload-spa-to-aem-project
Först måste du överföra den externa SPA till ditt AEM.
- Ersätt
src
i projektmappen/ui.frontend
medsrc
-mappen för ditt React-program. - Inkludera eventuella ytterligare beroenden i appens
package.json
i filen/ui.frontend/package.json
.- Kontrollera att SPA SDK-beroenden är av rekommenderade versioner.
- Inkludera eventuella anpassningar i mappen
/public
. - Inkludera eventuella infogade skript eller format som lagts till i filen
/public/index.html
.
Konfigurera SPA configure-remote-spa
Nu när den externa SPA är en del av ditt AEM projekt måste den konfigureras inom AEM.
Inkludera Adobe SPA SDK-paket include-spa-sdk-packages
För att dra nytta av AEM SPA funktioner finns det beroenden av följande tre paket.
@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
.
Installation installation
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
ModelManager-initiering model-manager-initialization
Innan appen återges måste ModelManager
initieras för att hantera skapandet av AEM ModelStore
.
Detta måste göras i filen src/index.js
i programmet eller där programmets rot återges.
Använd därför initializationAsync
-API:t 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 före ReactDOM.render()
.
I det här exemplet initieras ModelManager
och en tom ModelStore
skapas.
initializationAsync
kan acceptera ett options
-objekt som en parameter:
path
- Vid initiering hämtas modellen vid den definierade sökvägen och lagras iModelStore
. Detta kan användas för att hämtarootModel
vid initiering om det behövs.modelClient
- Tillåter att du anger en anpassad klient som ansvarar för att hämta modellen.model
- Ettmodel
-objekt skickas som en parameter som vanligtvis fylls i när SSR används.
AEM Authorable Components authorable-leaf-components
-
Skapa/identifiera en AEM som en redigerbar React-komponent ska skapas för. I det här exemplet använder WKND-projektet textkomponenten.
-
Skapa en enkel React-textkomponent i SPA. I det här exemplet har en ny fil,
Text.js
, skapats med följande innehåll. -
Skapa ett konfigurationsobjekt för att ange de attribut som krävs för att aktivera AEM.
resourceType
är obligatoriskt för att mappa React-komponenten till AEM och aktivera redigering när den öppnas i AEM Editor.
-
Använd wrapper-funktionen
withMappable
.Den här wrapper-funktionen mappar React-komponenten till AEM
resourceType
som anges i konfigurationen och aktiverar redigeringsfunktioner när den öppnas i AEM Editor. För fristående komponenter hämtas även modellinnehållet för den specifika noden.note note NOTE I det här exemplet finns det separata versioner av komponenten: AEM inkapslade och oomslutna 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 den nyligen skapade
AEMText
-reaktionskomponenten och kan användas för att återge innehållet.code language-javascript 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.
code language-javascript 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>); };
note note NOTE I det här exemplet har ytterligare anpassningar gjorts för den återgivna komponenten för att matcha den befintliga textkomponenten. Detta har dock inget med AEM att göra.
Lägg till redigerbara komponenter på sidan add-authorable-component-to-page
När de redigerbara React-komponenterna har skapats kan de användas i hela programmet.
Låt oss ta en exempelsida där text från WKND-SPA måste läggas till. I det här exemplet vill du visa texten"Hello World!" på /content/wknd-spa-react/us/en/home.html
.
-
Ange sökvägen till noden som ska visas.
pagePath
: Den sida som innehåller noden, i exemplet/content/wknd-spa-react/us/en/home
itemPath
: Sökväg till noden på sidan, i exempletroot/responsivegrid/text
- Detta består av namnen på de objekt som finns på sidan.
-
Lägg till en komponent på önskad plats på sidan.
Komponenten
AEMText
kan läggas till på den önskade positionen på sidan medpagePath
- ochitemPath
-värden angivna som egenskaper.pagePath
är en obligatorisk egenskap.
Verifiera redigering av textinnehåll på AEM verify-text-edit
Testa nu komponenten på den AEM som körs.
- Kör följande Maven-kommando från katalogen
aem-guides-wknd-spa
för att skapa och distribuera projektet till AEM.
mvn clean install -PautoInstallSinglePackage
- Navigera till
http://<host>:<port>/editor.html/content/wknd-spa-react/us/en/home.html
på din AEM.
Komponenten AEMText
är nu AEM.
AEM sidor aem-authorable-pages
-
Identifiera en sida som ska läggas till för redigering i SPA. I det här exemplet används
/content/wknd-spa-react/us/en/home.html
. -
Skapa en fil (till exempel
Page.js
) för den redigerbara sidkomponenten. Här kan sidkomponenten återanvändas som anges i@adobe/cq-react-editable-components
. -
Upprepa steg fyra i avsnittet AEM skrivbara bladkomponenter. Använd adapterfunktionen
withMappable
för komponenten. -
Använd
MapTo
på AEM resurstyper för alla underordnade komponenter på sidan, som tidigare har gjorts.code language-javascript 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);
note note NOTE I det här exemplet används den oomslutna React-textkomponenten i stället för den omslutna AEMText
som skapades 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 redigerbar sida i SPA följer du samma steg i avsnittet Lägg till redigerbara komponenter på sidan. Här kan vi emellertid hoppa över egenskapen
itemPath
.
Verifiera sidinnehåll på AEM verify-page-content
Verifiera att sidan kan redigeras genom att följa samma steg i avsnittet Verifiera redigering av textinnehåll på AEM.
Sidan kan nu redigeras på AEM med en layoutbehållare och en underordnad textkomponent.
Virtuella lövkomponenter virtual-leaf-components
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. Den skapade komponenten tillåter samma uppsättning åtgärder som de fristående bladkomponenterna.
I det här exemplet återanvänder vi komponenten AEMText
som skapades 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. itemPath
kan dock uppdateras till den sökväg 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 sökvägen root/responsivegrid/{itemName}
.
<AEMText
pagePath='/content/wknd-spa-react/us/en/home'
itemPath='root/responsivegrid/text_20' />
Komponenten TestPage
ser ut så här när den virtuella komponenten har lagts till.
resourceType
har angetts för komponenten AEMText
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 den text_20
-nod som för närvarande inte finns.
När innehållsförfattaren uppdaterar den här komponenten skapas en ny text_20
-nod root/responsivegrid/text_20
i /content/wknd-spa-react/us/en/home
.
Krav och begränsningar limitations
Det finns flera krav för att lägga till virtuella bladkomponenter och vissa begränsningar.
- Egenskapen
pagePath
är obligatorisk för att skapa en virtuell komponent. - Sidnoden som anges i sökvägen i
pagePath
måste finnas i AEM. - Namnet på noden som ska skapas måste anges i
itemPath
. - Komponenten kan skapas på alla nivåer.
- Om vi anger en
itemPath='text_20'
i det föregående exemplet skapas den nya noden direkt under sidan som är/content/wknd-spa-react/us/en/home/jcr:content/text_20
- Om vi anger en
- Sökvägen till noden där en ny nod skapas måste vara giltig när den anges via
itemPath
.- I det här exemplet måste
root/responsivegrid
finnas så att den nya nodentext_20
kan skapas där.
- I det här exemplet måste
- Det går bara att skapa lövkomponenter. Virtuell behållare och sida stöds i framtida versioner.
Virtuella behållare virtual-containers
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ätt 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 det till exempel redan finns en behållare på /root/responsivegrid
och utvecklaren vill lägga till en ny underordnad behållare:
newContainer
finns inte i AEM ännu.
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.
Krav och begränsningar container-limitations
Det finns flera krav för att lägga till virtuella behållare och vissa begränsningar.
-
Principen för att bestämma vilka komponenter som kan läggas till ärvs från den överordnade behållaren.
-
Den omedelbara överordnade behållaren för den behållare som ska skapas måste redan finnas i AEM.
- Om behållaren
root/responsivegrid
redan finns i AEM kan en ny behållare skapas genom att sökvägenroot/responsivegrid/newContainer
anges. root/responsivegrid/newContainer/secondNewContainer
är dock inte möjligt.
- Om behållaren
-
Det går endast att skapa en ny komponentnivå åt gången.
Ytterligare anpassningar additional-customizations
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.
Rotnods-ID root-node-id
Som standard antar vi att React-programmet återges i en div
av element-ID:t spa-root
. Om det behövs kan det anpassas.
Anta till exempel att vi har en SPA där programmet återges inuti div
för element-ID root
. Detta måste återspeglas i tre filer.
-
I
index.js
av React-programmet (eller därReactDOM.render()
anropas) -
I
index.html
av React-programmet -
I AEM sidkomponentbrödtext:
- Skapa en
body.html
för sidkomponenten.
- Lägg till det nya rotelementet i den nya
body.html
-filen.
- Skapa en
Redigera en SPA med routning editing-react-spa-with-routing
Om det externa SPA har flera sidor kan det använda routning för att avgöra 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
återges TestPage
.
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.
- För vårt exempel ser vi
wknd-spa-react/us/en
som SPA. Det innebär att allt som är före den banan AEM bara sidor/innehåll.
- För vårt exempel ser vi
-
Skapa en sida på önskad nivå.
- I det här exemplet är sidan som ska redigeras
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 du skapa en sida på den rotnivå som definierades i föregående steg. - Den nya sidan måste ha samma namn som sidan som ska redigeras. I det här exemplet för
mydomain.com/test
måste den nya sidan som skapas vara/path/to/aem/root/test
.
- I det här exemplet är sidan som ska redigeras
-
Lägg till hjälpredor i SPA.
- Den nyskapade sidan återger inte det förväntade innehållet i AEM ännu. Detta beror på att routern förväntar sig sökvägen
/test
medan den AEM aktiva sökvägen ä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 som tillhandahålls av@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:- Sökvägen som krävs för routning
- Den ursprungliga URL:en för den AEM instansen där SPA redigeras
- Projektroten på AEM enligt det första steget
-
Dessa värden kan anges som miljövariabler för större flexibilitet.
- Den nyskapade sidan återger inte det förväntade innehållet i AEM ännu. Detta beror på att routern förväntar sig sökvägen
-
Verifiera redigering av sidan i AEM.
- Distribuera projektet till AEM och navigera till den nyligen skapade
test
-sidan. Sidinnehållet återges nu och AEM kan redigeras.
- Distribuera projektet till AEM och navigera till den nyligen skapade
Rambegränsningar framework-limitations
RemotePage-komponenten förväntar sig att implementeringen tillhandahåller ett tillgångsmanifest som webpack-manifest-plugin i GitHub. 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.
Ytterligare resurser additional-resources
Följande referensmaterial kan vara användbart för att förstå SPA i samband med AEM.