Fenêtre d’extension

Fenêtre modale de l’extension de fragment de contenu AEM

AEM modal d’extension Fragment de contenu permet d’associer une interface utilisateur personnalisée aux extensions AEM Fragment de contenu, qu’il s’agisse de l’option Barre d’actions ou Menu d’en-tête des boutons.

Les modèles sont des applications React, basées sur React Spectrum, et peuvent créer toute interface utilisateur personnalisée requise par l’extension, y compris, mais sans s’y limiter :

Itinéraires modaux

L’expérience modale est définie par l’extension Application React du générateur d’applications définie sous la variable web-src dossier. Comme pour toute application React, l’expérience complète est orchestrée à l’aide de Itinéraires React rendu Composants React.

Au moins un itinéraire est nécessaire pour générer la vue modale initiale. Cet itinéraire initial est appelé dans enregistrement d’extension's onClick(..) , comme illustré ci-dessous.

  • ./src/aem-cf-console-admin-1/web-src/src/components/App.js
import MyModal from './MyModal';
import MyModalResults from './MyModalResults';
...
function App(props) {
  return (
    <Router>
      <ErrorBoundary onError={onError} FallbackComponent={fallbackComponent}>
        <Routes>
          ...
          {/*
            Define the entry route to the modal.

            For modals opened from Action Bar extensions, typically a :selection parameter is used to pass in the list of selected Content Fragments.
            Header Menu extensions do not use a selection parameter.
           */}
          <Route
            exact path="content-fragment/:selection/my-modal"
            element={<MyModal />}
          />

          {/* Define any other routes the modal may need */}
          <Route
            exact path="content-fragment/my-modal"
            element={<MyOtherModalView />}
          />

        </Routes>
      </ErrorBoundary>
    </Router>
  )
  ...
}

Enregistrement d’une extension

Pour ouvrir un modal, un appel à guestConnection.host.modal.showUrl(..) est créé à partir du onClick(..) fonction . showUrl(..) transmet un objet JavaScript avec la clé/les valeurs :

  • title fournit le nom du titre du modal affiché pour l’utilisateur.
  • url est l’URL qui appelle la variable Route React responsable de la vue initiale du modal.

Il est impératif que la url transmis à guestConnection.host.modal.showUrl(..) résout l’itinéraire dans l’extension, sinon rien ne s’affiche dans le modal.

Consultez la section menu d’en-tête et barre d’actions documentation sur la création d’URL modales.

  • ./src/aem-cf-console-admin-1/web-src/src/components/ExtensionRegistration.js
function ExtensionRegistration() {
  ...
  onClick() {
    // Create a URL that maps to the React route to be rendered in the modal
    const modalURL = "/index.html#/content-fragment/my-modal";

    // Open the modal and display the React route created above
    guestConnection.host.modal.showUrl({
      title: "My modal title",
      url: modalURL
    })
  }
  ...
}...

Composant modal

Chaque route de l'extension, ce n'est pas le index route, correspond à un composant React qui peut effectuer le rendu dans le modal de l’extension.

Un modal peut être constitué de n’importe quel nombre d’itinéraires React, d’un modal simple à un modal complexe à plusieurs itinéraires.

Le scénario suivant illustre un modal à un seul itinéraire, mais cette vue modale peut contenir des liens React qui invoquent d’autres itinéraires ou comportements.

  • ./src/aem-cf-console-admin-1/web-src/src/components/MyModal.js
import React, { useState, useEffect } from 'react'
import { attach } from "@adobe/uix-guest"
import {
  Flex,
  Provider,
  Content,
  defaultTheme,
  Text,
  ButtonGroup,
  Button
} from '@adobe/react-spectrum'
import Spinner from "./Spinner"
import { useParams } from "react-router-dom"
import { extensionId } from "./Constants"

export default function MyModal() {
  // Initial modal views for Action Bar extensions typically pass in the list of selected Content Fragment Paths from ExtensionRegistration.js
  // Get the paths from useParams() and split on delimiter used
  let { selection } = useParams();
  let contentFragmentPaths = selection?.split('|') || [];

  // Asynchronously attach the extension to AEM.
  // Wait or the guestConnection to be set before doing anything in the modal.
  const [guestConnection, setGuestConnection] = useState()

  useEffect(() => {
    (async () => {
      const guestConnection = await attach({ id: extensionId })
      setGuestConnection(guestConnection);
    })()
  }, [])

  if (!guestConnection) {
    // If the guestConnection is not initialized, display a loading spinner
    return <Spinner />
  } else {
    // Else the modal is ready to render!
    return (
        <Provider theme={defaultTheme} colorScheme='light'>
        {/*
            Use the React Spectrum components to render the modal UI.
            Using React Spectrum ensures a consistent, accessible, future-proof look-and-feel and speeds up development.
        */}
            <Content width="100%">
                <Flex width="100%">
                    <Text>
                        This is the contents in the modal!
                        Anything can be created in this return statement!

                        The selected Content Fragments are: { contentFragmentPaths.join(', ') }
                    </Text>
                    {/*
                        Modals must provide their own Close button, by calling: guestConnection.host.modal.close()
                    */}
                    <ButtonGroup align="end">
                        <Button variant="primary" onPress={() => guestConnection.host.modal.close()}>Close</Button>
                    </ButtonGroup>
                </Flex>
            </Content>
        </Provider>
    )
  }
}

Fermer le modal

Bouton de fermeture modale de l’extension de fragment de contenu AEM

Les modèles doivent fournir leur propre contrôle serré. Pour ce faire, appelez guestConnection.host.modal.close().

<ButtonGroup align="end">
    <Button variant="primary" onPress={() => guestConnection.host.modal.close()}>Close</Button>
</ButtonGroup>

Sur cette page