Widgets toevoegen aan Rich Text Editor (RTE)

Leer hoe u widgets kunt toevoegen aan de Rich Text Editor (RTE) in de AEM Content Fragment Editor.

Om de dynamische inhoud in de Rijke Redacteur van de Tekst (RTE) toe te voegen, kan de widgets functionaliteit worden gebruikt. De widgets helpen om eenvoudige of complexe UI in RTE te integreren en UI kan worden gecreeerd gebruikend het kader JS van uw keus. Ze kunnen worden beschouwd als dialoogvensters die worden geopend door op de speciale toets { in de RTE te drukken.

De widgets worden doorgaans gebruikt om de dynamische inhoud in te voegen die afhankelijk is van een extern systeem of die kan veranderen op basis van de huidige context.

widgets worden toegevoegd aan RTE in de Redacteur van het Fragment van de Inhoud gebruikend het rte uitbreidingspunt. Met de methode getWidgets() van het rte extensiepunt worden een of meer widgets toegevoegd. Ze worden geactiveerd door op de speciale toets { te drukken om de contextmenuoptie te openen en vervolgens de gewenste widget te selecteren om de aangepaste dialoogvenster-UI te laden.

Dit voorbeeld toont hoe te om een widget toe te voegen genoemd Lijst van de Code van de Korting om, de adventure-specifieke de disconteringscode van WKND binnen een inhoud te vinden te selecteren en toe te voegen RTE. Deze kortingscodes kunnen worden beheerd in een extern systeem, zoals Order Management System (OMS), Product Information Management (PIM), een toepassing die op het thuisniveau wordt ontwikkeld of een Adobe AppBuilder-actie.

Om dingen eenvoudig te houden, gebruikt dit voorbeeld het 🔗 kader van het Spectrum van het Reageren van de Adobe om widget of dialoog UI en hard-gecodeerde WKND adventure naam, de gegevens van de kortingscode te ontwikkelen.

Extensiepunt

Dit voorbeeld breidt zich tot uitbreidingspunt rte uit om een widget aan RTE in de Redacteur van het Fragment van de Inhoud toe te voegen.

Voorbeeldextensie

Het volgende voorbeeld leidt tot de Lijst van de Code van de a Korting widget. Door op de { speciale sleutel binnen RTE te duwen, wordt het contextmenu geopend, dan door de optie van de Lijst van de Code van de Korting van het contextmenu te selecteren wordt de dialoog UI geopend.

De auteurs van de inhoud WKND kunnen, huidige Adventure-specifieke kortingscode vinden selecteren en toevoegen, als beschikbaar.

Registratie van extensies

ExtensionRegistration.js , toegewezen aan de route index.html, is het ingangspunt voor de AEM uitbreiding en bepaalt:

  • De widgetdefinitie in getWidgets() functie met id, label and url attributen.
  • De waarde van het kenmerk url , een relatief URL-pad ( /index.html#/discountCodes ) om de interface van het dialoogvenster te laden.

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;

discountCodes route toevoegen in App.js

Voeg in de hoofdcomponent React App.js de discountCodes -route toe om de gebruikersinterface voor het bovenstaande relatieve URL-pad te renderen.

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>
...

Component DiscountCodes React maken create-widget-react-component

De widget of de dialoog UI wordt gecreeerd gebruikend het React Spectrum van de Adobekader. De componentcode DiscountCodes ziet er als volgt uit:

  • UI wordt teruggegeven gebruikend React de componenten van het Spectrum, als ComboBox, ButtonGroup, Knoop
  • De array adventureDiscountCodes heeft een hardcoded mapping van adventure-naam en kortingscode. In echt scenario, kunnen deze gegevens van de actie van Adobe AppBuilder of externe systemen zoals PIM, OMS of huisgeteelde of op wolkenleverancier-gebaseerde API gateway worden teruggewonnen.
  • guestConnection wordt geïnitialiseerd gebruikend useEffect Reageer haaken geleid als componentenstaat. Het wordt gebruikt om met de AEM gastheer te communiceren.
  • De functie handleDiscountCodeChange krijgt de kortingscode voor de geselecteerde avontuurnaam en werkt de staatsvariabele bij.
  • De functie addDiscountCode die guestConnection gebruikt, biedt RTE-instructie die moet worden uitgevoerd. In dit geval moeten insertContent instructiecode en HTML codefragment van de werkelijke disconteringscode worden ingevoegd in de 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;
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69