Añadir widgets al editor de texto enriquecido (RTE)
AEM Aprenda a añadir widgets al editor de texto enriquecido (RTE) en el editor de fragmentos de contenido de la aplicación de la aplicación de contenido de la.
Para agregar contenido dinámico en el Editor de texto enriquecido (RTE), se puede usar la funcionalidad widgets. Los widgets ayudan a integrar la IU simple o compleja en RTE y la IU se puede crear utilizando el marco de trabajo JS de su elección. Se pueden considerar como cuadros de diálogo que se abren pulsando la tecla especial {
en RTE.
Normalmente, los widgets se utilizan para insertar el contenido dinámico que tiene una dependencia externa del sistema o que podría cambiar según el contexto actual.
Los widgets se han agregado a RTE en el editor de fragmentos de contenido usando el punto de extensión rte
. Con el método getWidgets()
del punto de extensión rte
se agregan uno o varios widgets. Se activan pulsando la tecla especial {
para abrir la opción del menú contextual y, a continuación, seleccione el widget deseado para cargar la interfaz de usuario del cuadro de diálogo personalizado.
Este ejemplo muestra cómo agregar un widget llamado Lista de códigos de descuento para buscar, seleccionar y agregar el código de descuento específico de la aventura WKND dentro de un contenido RTE. Estos códigos de descuento se pueden administrar en sistemas externos como Order Management System (OMS), Product Information Management (PIM), una aplicación propia o una acción de AppBuilder de Adobe.
Para simplificar las cosas, este ejemplo usa el módulo Adobe React Spectrum para desarrollar la interfaz de usuario del widget o cuadro de diálogo, el nombre de la aventura WKND predefinido y los datos del código de descuento.
Punto de extensión
Este ejemplo se extiende al punto de extensión rte
para agregar un widget al RTE en el Editor de fragmentos de contenido.
Extensión de ejemplo
En el siguiente ejemplo se crea un widget de Lista de códigos de descuento. Al presionar la tecla especial {
dentro de RTE, se abre el menú contextual y, a continuación, al seleccionar la opción Lista de códigos de descuento en el menú contextual, se abre la interfaz de usuario del cuadro de diálogo.
Los autores de contenido de WKND pueden buscar, seleccionar y agregar el código de descuento actual específico de Adventure, si está disponible.
Registro de extensiones
AEM ExtensionRegistration.js
, asignado a la ruta index.html, es el punto de entrada para la extensión de la y define:
- La definición del widget en la función
getWidgets()
con atributosid, label and url
. - Valor de atributo
url
, una ruta de acceso URL relativa (/index.html#/discountCodes
) para cargar la interfaz de usuario del cuadro de diálogo.
src/aem-cf-editor-1/web-src/src/components/ExtensionRegistration.js
import React from "react";
import { Text } from "@adobe/react-spectrum";
import { register } from "@adobe/uix-guest";
import { extensionId } from "./Constants";
// This function is called when the extension is registered with the host and runs in an iframe in the Content Fragment Editor browser window.
function ExtensionRegistration() {
const init = async () => {
const guestConnection = await register({
id: extensionId,
methods: {
rte: {
// RTE Widgets
getWidgets: () => [
{
id: "discountcode-list-widget", // Provide a unique ID for the widget
label: "Discount Code List", // Provide a label for the widget
url: "/index.html#/discountCodes", // Provide the "relative" URL to the widget content. It will be resolved as `/index.html#/discountCodes`
},
],
}, // Add a comma here
},
});
};
init().catch(console.error);
return <Text>IFrame for integration with Host (AEM)...</Text>;
}
export default ExtensionRegistration;
Agregar ruta discountCodes
en App.js
En el componente React principal App.js
, agregue la ruta discountCodes
para procesar la interfaz de usuario para la ruta de URL relativa anterior.
src/aem-cf-editor-1/web-src/src/components/App.js
...
<Routes>
<Route index element={<ExtensionRegistration />} />
<Route
exact path="index.html"
element={<ExtensionRegistration />}
/>
{/* Content Fragment RTE routes that support the Discount Codes Widget functionality*/}
<Route path="/discountCodes" element={<DiscountCodes />} />
</Routes>
...
Crear componente de React DiscountCodes
La interfaz de usuario del widget o cuadro de diálogo se crea con el módulo Espectro de reacción de Adobe. El código del componente DiscountCodes
es el siguiente, así que le presentamos algunos aspectos destacados:
- La interfaz de usuario se representa mediante componentes del espectro de React, como ComboBox, ButtonGroup, Button
- La matriz
adventureDiscountCodes
tiene una asignación codificada del nombre de la aventura y el código de descuento. En situaciones reales, estos datos se pueden recuperar de la acción del AppBuilder de Adobe o de sistemas externos como PIM, OMS o la puerta de enlace de API casera o basada en el proveedor de la nube. - El
guestConnection
se inicializó usando eluseEffect
vínculo de React y se administró como estado de componente. AEM Se utiliza para comunicarse con el host de la. - La función
handleDiscountCodeChange
obtiene el código de descuento del nombre de aventura seleccionado y actualiza la variable de estado. - La función
addDiscountCode
que utiliza el objetoguestConnection
proporciona una instrucción RTE para ejecutar. En este caso,insertContent
instrucción y fragmento de código de HTML del código de descuento real que se insertará en RTE.
src/aem-cf-editor-1/web-src/src/components/DiscountCodes.js
import {
Button,
ButtonGroup,
ComboBox,
Content,
Divider,
Flex, Form,
Item,
Provider,
Text,
defaultTheme
} from '@adobe/react-spectrum';
import { attach } from '@adobe/uix-guest';
import React, { useEffect, useState } from 'react';
import { extensionId } from './Constants';
const DiscountCodes = () => {
// The Adventure Discount Code list
// In this example its hard coded, however you can call an Adobe AppBuilder Action or even make an AJAX call to load it from 3rd party system
const adventureDiscountCodes = [
{ id: 1, adventureName: 'BALI SURF CAMP', discountCode: 'BALI2023' },
{ id: 2, adventureName: 'BEERVANA IN PORTLAND', discountCode: 'PORTFEST' },
{ id: 3, adventureName: 'NAPA WINE TASTING', discountCode: 'WINEINSPRING' },
{ id: 4, adventureName: 'RIVERSIDE CAMPING', discountCode: 'SUMMERSCAPE' },
{ id: 5, adventureName: 'TAHOE SKIING', discountCode: 'EPICPASS' },
];
// Set up state used by the React component
const [guestConnection, setGuestConnection] = useState();
// State hooks to manage the component state
const [discountCode, setDiscountCode] = useState(null);
// Asynchronously attach the extension to AEM, we must wait or the guestConnection to be set before doing anything in the modal
useEffect(() => {
(async () => {
const myGuestConnection = await attach({ id: extensionId });
setGuestConnection(myGuestConnection);
})();
}, []);
// Handle the `discountCodeList` Dropdown change
const handleDiscountCodeChange = (key) => {
if (key) {
//console.log(`DiscountCode Key: ${key}`);
//console.log(`DiscountCode Value: ${adventureDiscountCodes[key-1].discountCode}`);
//Get discount code value using selected key/index
let discountCodeValue = adventureDiscountCodes[key - 1].discountCode;
//update the `discountCode` state
setDiscountCode(discountCodeValue);
}
};
// Add the selected Adventure's Discount Code into the RTE
const addDiscountCode = () => {
if (discountCode) {
// Use `guestConnection.host.rte.applyInstructions` method and provide RTE instruction to execute.
// The instructions are passed as an array of object, that has `type` and `value` keys
guestConnection.host.rte.applyInstructions([{ type: "insertContent", value: `<strong>Discount Code: ${discountCode}</strong>` }]);
}
};
// Adobe React Spectrum (HTML code) that renders the Discount Code dropdown list, see https://react-spectrum.adobe.com/react-spectrum/index.html
return (
<Provider theme={defaultTheme}>
<Content width="100%">
<Flex width="100%">
<Form width="50%">
<Text>Selected Discount Code: <strong>{discountCode}</strong></Text>
<p />
<Divider size="M" />
<ComboBox
name="discountCodeList"
label="Type or Select an Adventure name"
defaultItems={adventureDiscountCodes}
onSelectionChange={handleDiscountCodeChange}>
{item => <Item>{item.adventureName}</Item>}
</ComboBox>
<p />
<ButtonGroup align="right">
<Button variant="accent" onPress={addDiscountCode} autoFocus>Add</Button>
<Button variant="secondary" onPress={() => setDiscountCode(null)}>Clear</Button>
</ButtonGroup>
</Form>
</Flex>
</Content>
</Provider>
);
}
export default DiscountCodes;