Aggiungere badge all’editor Rich Text
Scopri come aggiungere badge all’Editor Rich Text (RTE) nell’Editor frammenti di contenuto AEM.
Il badge Editor Rich Text è un'estensione che rende il testo nell'Editor Rich Text non modificabile. Ciò significa che un badge dichiarato come tale può essere rimosso solo completamente e non può essere modificato parzialmente. Questi badge supportano anche colorazioni speciali all’interno dell’editor Rich Text, indicando chiaramente agli autori di contenuto che il testo è un badge e quindi non modificabile. Inoltre, forniscono indicazioni visive sul significato del testo del badge.
Il caso d'uso più comune per i badge Editor Rich Text consiste nell'utilizzarli insieme a widget Editor Rich Text. In questo modo il contenuto inserito nell’editor Rich Text dal widget dell’editor Rich Text non è modificabile.
In genere, i badge in associazione ai widget vengono utilizzati per aggiungere il contenuto dinamico con una dipendenza di sistema esterna, ma gli autori di contenuto non possono modificare il contenuto dinamico inserito per mantenerne l'integrità. Possono essere rimossi solo come un intero elemento.
I badge vengono aggiunti all'editor RTE nell'editor frammenti di contenuto utilizzando il punto di estensione rte
. Utilizzando il metodo getBadges()
del punto di estensione rte
, vengono aggiunti uno o più badge.
In questo esempio viene illustrato come aggiungere un widget denominato Servizio clienti per prenotazioni di gruppi di grandi dimensioni per trovare, selezionare e aggiungere i dettagli del servizio clienti specifici dell'avventura WKND, ad esempio Nome rappresentante e Numero di telefono all'interno di un contenuto dell'editor Rich Text. Utilizzando la funzionalità dei badge, Il numero di telefono è reso non modificabile, ma gli autori di contenuto WKND possono modificare il nome del rappresentante.
Inoltre, il numero di telefono ha uno stile diverso (blu), il che rappresenta un caso d'uso aggiuntivo della funzionalità dei badge.
Per semplificare, in questo esempio viene utilizzato il framework Adobe React Spectrum per sviluppare l'interfaccia utente del widget o della finestra di dialogo e i numeri di telefono del Servizio clienti WKND hardcoded. Per controllare la non modifica e il diverso aspetto di stile del contenuto, viene utilizzato il carattere #
nell'attributo prefix
e suffix
della definizione dei badge.
Punti dell’estensione
Questo esempio si estende fino al punto di estensione rte
per aggiungere un badge all’editor Rich Text nell’Editor frammenti di contenuto.
Estensione di esempio
Nell'esempio seguente viene creato un widget del servizio clienti Large Group Booking. Premendo il tasto {
nell'editor Rich Text, viene aperto il menu di scelta rapida dei widget Rich Text. Selezionando l'opzione Large Group Bookings Customer Service dal menu di scelta rapida, viene aperta la finestra modale personalizzata.
Una volta aggiunto il numero del servizio clienti desiderato dal modale, i badge rendono il numero di telefono non modificabile e gli assegnano uno stile di colore blu.
Registrazione dell’estensione
ExtensionRegistration.js
, mappato alla route index.html
, è il punto di ingresso per l'estensione AEM e definisce:
- La definizione del badge è definita in
getBadges()
utilizzando gli attributi di configurazioneid
,prefix
,suffix
,backgroundColor
etextColor
. - In questo esempio, il carattere
#
viene utilizzato per definire i limiti di questo badge, il che significa che qualsiasi stringa nell'editor Rich Text circondata da#
viene considerata un'istanza di questo badge.
Vedi anche i dettagli chiave del widget dell’editor Rich Text:
- Definizione del widget nella funzione
getWidgets()
con attributiid
,label
eurl
. - Il valore dell'attributo
url
, un percorso URL relativo (/index.html#/largeBookingsCustomerService
) per caricare il modale.
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 Badges
getBadges: () => [
{
id: "phoneNumber",
prefix: "#",
suffix: "#",
backgroundColor: "",
textColor: "#071DF8",
},
],
// RTE Widgets
getWidgets: () => [
{
id: "largegroup-contact-list-widget",
label: "Large Group Bookings Customer Service",
url: "/index.html#/largeBookingsCustomerService",
},
],
},
},
});
};
init().catch(console.error);
return <Text>IFrame for integration with Host (AEM)...</Text>;
}
export default ExtensionRegistration;
Aggiungi route largeBookingsCustomerService
in App.js
Nel componente React principale App.js
, aggiungi la route largeBookingsCustomerService
per eseguire il rendering dell'interfaccia utente per il percorso URL relativo sopra indicato.
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="/largeBookingsCustomerService" element={<LargeBookingsCustomerService />} />
</Routes>
...
Crea componente React LargeBookingsCustomerService
L'interfaccia utente del widget o della finestra di dialogo viene creata utilizzando il framework Adobe React Spectrum.
Il codice del componente React quando si aggiungono i dettagli del servizio clienti, racchiude la variabile del numero di telefono con il carattere dei badge registrati #
per convertirla in badge, come #${phoneNumber}#
, rendendola quindi non modificabile.
Di seguito sono riportati gli elementi di rilievo del codice LargeBookingsCustomerService
:
- Il rendering dell'interfaccia utente viene eseguito utilizzando i componenti Spectrum di React, ad esempio ComboBox, ButtonGroup, Button
- L'array
largeGroupCustomerServiceList
ha una mappatura hardcoded del nome e del numero di telefono del rappresentante. In uno scenario reale, questi dati possono essere recuperati da un’azione Adobe AppBuilder o da sistemi esterni o da un gateway API basato su provider cloud o sviluppato in casa. guestConnection
è inizializzato con l'hookuseEffect
React ed è gestito come stato del componente. Viene utilizzato per comunicare con l’ospite dell’AEM.- La funzione
handleCustomerServiceChange
ottiene il nome e il numero di telefono del rappresentante e aggiorna le variabili dello stato del componente. - La funzione
addCustomerServiceDetails
che utilizza l'oggettoguestConnection
fornisce istruzioni RTE da eseguire. In questo caso,insertContent
istruzione e snippet di codice HTML. - Per rendere non modificabile il numero di telefono utilizzando i badge, viene aggiunto il carattere speciale
#
prima e dopo la variabilephoneNumber
, ad esempio...<div><p>Phone Number: #${phoneNumber}#</strong></p></div>
.
src/aem-cf-editor-1/web-src/src/components/LargeBookingsCustomerService.js
import {
Button,
ButtonGroup,
Text,
Divider,
ComboBox,
Content, Flex, Form,
Item,
Provider, defaultTheme
} from '@adobe/react-spectrum';
import { attach } from '@adobe/uix-guest';
import React, { useEffect, useState } from 'react';
import { extensionId } from './Constants';
const LargeBookingsCustomerService = () => {
// The Large Group Bookings Customer Service
// 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 largeGroupCustomerServiceList = [
{ id: 1, repName: 'Max', phoneNumber: '1-800-235-1000' },
{ id: 2, repName: 'John', phoneNumber: '1-700-235-2000' },
{ id: 3, repName: 'Leah', phoneNumber: '1-600-235-3000' },
{ id: 4, repName: 'Leno', phoneNumber: '1-500-235-4000' }
];
// Set up state used by the React component
const [guestConnection, setGuestConnection] = useState();
// State hooks to manage the component state
const [repName, setRepName] = useState(null);
const [phoneNumber, setPhoneNumber] = 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 `customerService` Dropdown change
const handleCustomerServiceChange = (id) => {
if (id) {
//Get Customer Service RepName and Phone Number values using selected id
const rep = largeGroupCustomerServiceList.filter((r) => r.id === id)[0];
//update the `repName` state
setRepName(rep?.repName);
//update the `phoneNumber` state
setPhoneNumber(rep?.phoneNumber);
}
};
// Add the selected Customer Service details into the RTE
const addCustomerServiceDetails = () => {
if (repName && phoneNumber) {
// 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: `<div><p>Representative Name: <strong>${repName}</strong></p></div><div><p>Phone Number: #${phoneNumber}#</strong></p></div>` }]);
}
};
// Adobe React Spectrum (HTML code) that renders the Customer Service 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>Representative Name: <strong>{repName}</strong></Text>
<Text>Phone Number: <strong>{phoneNumber}</strong></Text>
<p />
<Divider size="M" />
<ComboBox
name="customerService"
label="Type or Select Phone Number"
defaultItems={largeGroupCustomerServiceList}
onSelectionChange={handleCustomerServiceChange}>
{item => <Item>{item.phoneNumber}</Item>}
</ComboBox>
<p />
<ButtonGroup align="right">
<Button variant="accent" onPress={addCustomerServiceDetails}>Add</Button>
<Button variant="secondary" onPress={() => {setPhoneNumber(null); setRepName(null);}}>Clear</Button>
</ButtonGroup>
</Form>
</Flex>
</Content>
</Provider>
);
};
export default LargeBookingsCustomerService;