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.

Interfaccia utente AEM estesa
Punti dell’estensione
Editor frammento di contenuto
Badge editor Rich Text e Widget editor Rich Text

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 configurazione id, prefix, suffix, backgroundColor e textColor.
  • 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 attributi id, label e url.
  • 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'hook useEffect 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'oggetto guestConnection 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 variabile phoneNumber, 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;
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69