Feste Komponenten bieten eine gewisse Flexibilität beim Erstellen von SPA-Inhalten. Dieser Ansatz ist jedoch starr und erfordert, dass Entwicklerinnen und Entwickler die genaue Komposition des bearbeitbaren Inhalts definieren. Um die Erstellung außergewöhnlicher Erlebnisse durch Autorinnen und Autoren zu unterstützen, unterstützt der SPA-Editor die Verwendung von Container-Komponenten in der SPA. Container-Komponenten ermöglichen es Autorinnen und Autoren, zulässige Komponenten per Drag-and-Drop in den Container zu ziehen und sie wie beim herkömmlichen Verfassen in AEM Sites zu erstellen.
In diesem Kapitel fügen wir der Startansicht einen bearbeitbaren Container hinzu, der es Autorinnen und Autoren ermöglicht, Rich-Content-Erlebnisse mit bearbeitbaren React-Komponenten direkt in der SPA zu erstellen und anzuordnen.
So fügen Sie eine Container-Komponente zur Startansicht hinzu:
ResponsiveGrid
-Komponente der AEM React Editable-KomponenteSo fügen Sie einen bearbeitbaren Bereich zur Startansicht hinzu:
Öffnen und bearbeiten Sie react-app/src/components/Home.js
Importieren Sie die ResponsiveGrid
-Komponente aus @adobe/aem-react-editable-components
und fügen Sie sie zur Home
-Komponente hinzu.
Legen Sie die folgenden Attribute für die <ResponsiveGrid...>
-Komponente fest.
pagePath = '/content/wknd-app/us/en/home'
itemPath = 'root/responsivegrid'
Hierdurch wird die ResponsiveGrid
-Komponente angewiesen, ihren Inhalt aus der AEM-Ressource abzurufen:
/content/wknd-app/us/en/home/jcr:content/root/responsivegrid
itemPath
ist dem Knoten responsivegrid
zugeordnet, der in der AEM-Vorlage Remote SPA Page
definiert ist, und wird automatisch auf neuen, auf Grundlage der AEM-Vorlage Remote SPA Page
generierten AEM-Seiten erstellt.
Aktualisieren Sie Home.js
, um die <ResponsiveGrid...>
-Komponente hinzuzufügen.
...
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>
);
}
Die Datei Home.js
sollte wie folgt aussehen:
Um die volle Wirkung des flexiblen Authoring-Erlebnisses zu erzielen, das Container im SPA -Editor bieten, haben wir bereits eine bearbeitbare Titelkomponente erstellt. Erstellen wir nun aber noch ein paar weitere Komponenten, die es Autorinnen und Autoren ermöglichen, bearbeitbare Text- und Bildkomponenten in der neu hinzugefügten ResponsiveGrid-Komponente zu verwenden.
Die neuen bearbeitbaren React-Komponenten für Text und Bild werden mit dem in bearbeitbaren festen Komponenten bereitgestellten Definitionsmuster der bearbeitbaren Komponente erstellt.
Öffnen Sie das SPA-Projekt in Ihrer IDE.
Erstellen Sie eine React-Komponente unter src/components/editable/core/Text.js
.
Fügen Sie den folgenden Code zu Text.js
hinzu.
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;
}
Erstellen Sie eine bearbeitbare React-Komponente unter src/components/editable/EditableText.js
.
Fügen Sie den folgenden Code zu EditableText.js
hinzu.
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;
Die Implementierung der bearbeitbaren Textkomponente sollte wie folgt aussehen:
Öffnen Sie das SPA-Projekt in Ihrer IDE.
Erstellen Sie eine React-Komponente unter src/components/editable/core/Image.js
.
Fügen Sie den folgenden Code zu Image.js
hinzu.
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>
)
};
Erstellen Sie eine bearbeitbare React-Komponente unter src/components/editable/EditableImage.js
.
Fügen Sie den folgenden Code zu EditableImage.js
hinzu.
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;
Erstellen Sie eine SCSS-Datei src/components/editable/EditableImage.scss
, die benutzerdefinierte Stile für EditableImage.scss
bereitstellt. Diese Stile zielen auf die CSS-Klassen der bearbeitbaren React-Komponente ab.
Fügen Sie das folgende SCSS zu EditableImage.scss
hinzu.
.cmp-image__image {
margin: 1rem 0;
width: 100%;
border: 0;
}
Importieren Sie EditableImage.scss
in EditableImage.js
.
...
import './EditableImage.scss';
...
Die Implementierung der bearbeitbaren Bildkomponente sollte wie folgt aussehen:
Auf die neu erstellten React-Komponenten EditableText
und EditableImage
wird in der SPA verwiesen. Sie werden basierend auf der AEM-JSON-Rückgabe dynamisch instanziiert. Um sicherzustellen, dass diese Komponenten für die SPA verfügbar sind, erstellen Sie Importanweisungen für sie in Home.js
.
Öffnen Sie das SPA-Projekt in Ihrer IDE.
Öffnen Sie die Datei src/Home.js
Fügen Sie Importanweisungen für AEMText
und AEMImage
hinzu.
...
// The following need to be imported, so that MapTo is run for the components
import EditableText from './editable/EditableText';
import EditableImage from './editable/EditableImage';
...
Das Ergebnis sollte dann wie folgt aussehen:
Wenn diese Importe nicht hinzugefügt werden, wird der EditableText
- und EditableImage
-Code nicht von SPA aufgerufen, und somit werden die Komponenten nicht auf die bereitgestellten Ressourcentypen abgebildet.
AEM Container-Komponenten verwenden Richtlinien, um ihre zulässigen Komponenten anzugeben. Dies ist eine kritische Konfiguration bei der Verwendung des SPA-Editors, da nur AEM-Komponenten, die einem entsprechenden SPA-Komponentenmapping zugeordnet sind, vom SPA gerendert werden können. Stellen Sie sicher, dass nur die Komponenten zulässig sind, für die wir SPA-Implementierungen bereitgestellt haben:
EditableTitle
zugeordnet zu wknd-app/components/title
EditableText
zugeordnet zu wknd-app/components/text
EditableImage
zugeordnet zu wknd-app/components/image
So konfigurieren Sie den responsiven Raster-Container der Remote-SPA-Seitenvorlage:
Melden Sie sich bei AEM Author an
Navigieren Sie zu Tools > Allgemein > Vorlagen > WKND-App
Bearbeiten des SPA-Seitenberichts
Wählen Sie Struktur im Modusschalter oben rechts
Tippen Sie, um den Layout-Container auszuwählen.
Tippen Sie auf das Symbol Richtlinie in der Popup-Leiste
Erweitern Sie auf der rechten Seite unter der Registerkarte Erlaubte Komponenten die Option WKND APP – CONTENT.
Stellen Sie sicher, dass nur Folgendes ausgewählt ist:
Tippen Sie auf Fertig
Nach der Aktualisierung der SPA zum Einbetten von <ResponsiveGrid...>
, Wrappers für drei bearbeitbare React-Komponenten (EditableTitle
, EditableText
und EditableImage
) sowie nach der Aktualisierung von AEM mit einer übereinstimmenden Vorlagenrichtlinie, können wir damit beginnen, Inhalte in der Container-Komponente zu erstellen.
Melden Sie sich bei AEM Author an
Navigieren Sie zu Sites > WKND App
Tippen Sie auf Startseite und wählen Sie Bearbeiten in der oberen Aktionsleiste.
Wählen Sie Bearbeiten aus der Modusauswahl oben rechts im Seiteneditor.
Suchen Sie den bearbeitbaren Bereich Layout-Container unter dem Titel.
Öffnen Sie die Seitenleiste des Seiteneditors und wählen Sie die Komponentenansicht
Ziehen Sie die folgenden Komponenten in den Layout-Container
Ziehen Sie die Komponenten in die folgende Reihenfolge, um sie neu anzuordnen:
Erstellen Sie die Titelkomponente
Erstellen Sie die Bildkomponente
Erstellen Sie die Textkomponente
Ihre Komponenten werden jetzt erstellt, sind aber vertikal gestapelt.
Verwenden Sie den AEM-Layout-Modus, um die Größe und das Layout der Komponenten anzupassen.
Wechseln Sie über die Modusauswahl oben rechts in den Layout-Modus.
Ändern Sie die Größe der Bild- und Textkomponenten so, dass sie nebeneinander angeordnet sind.
Zeigen Sie Ihre Änderungen im AEM-Seiten-Editor in einer Vorschau an.
Aktualisieren Sie die WKND-App, die lokal auf http://localhost:3000 ausgeführt wird, um die erstellten Änderungen zu sehen.
Sie haben eine Container-Komponente hinzugefügt, mit der Autorinnen und Autoren bearbeitbare Komponenten zur WKND-App hinzufügen können. Sie wissen jetzt, wie man Folgendes tut:
ResponsiveGrid
in der SPA.Im nächsten Schritt wird dieselbe Technik zum Hinzufügen einer bearbeitbaren Komponente zu einer Adventure-Details-Route in der SPA verwendet.