Show Menu
ARGOMENTI×

Scrittura di un'azione di invio personalizzata per i moduli adattivi

I moduli adattivi richiedono azioni di invio per elaborare i dati specificati dall'utente. Un'azione Invia determina l'attività eseguita sui dati inviati utilizzando un modulo adattivo. Adobe Experience Manager (AEM) include azioni di invio OOTB che dimostrano le attività personalizzate che è possibile eseguire utilizzando i dati inviati dall'utente. Ad esempio, è possibile eseguire attività quali inviare e-mail o memorizzare i dati.

Flusso di lavoro per un’azione di invio

Il diagramma di flusso rappresenta il flusso di lavoro per un'azione di invio attivata quando si fa clic sul pulsante Invia in un modulo adattivo. I file nel componente File allegato vengono caricati sul server e i dati del modulo vengono aggiornati con gli URL dei file caricati. All'interno del client, i dati vengono memorizzati nel formato JSON. Il client invia una richiesta Ajax a un servlet interno che massaggia i dati specificati e li restituisce in formato XML. Il client raccoglie questi dati con i campi delle azioni. Invia i dati al servlet finale (servlet di invio guida) tramite un'azione di invio del modulo. Quindi, il servlet inoltra il controllo all'azione Invia. L’azione Invia può inoltrare la richiesta a un’altra risorsa sling oppure reindirizzare il browser a un altro URL.

Formato dati XML

I dati XML vengono inviati al servlet utilizzando il parametro jcr:data request. Le azioni di invio possono accedere al parametro per elaborare i dati. Il codice seguente descrive il formato dei dati XML. I campi associati al modello Modulo sono visualizzati nella afBoundData sezione . I campi non associati vengono visualizzati nella afUnoundData sezione . Per ulteriori informazioni sul formato del data.xml file, vedere Introduzione alla precompilazione dei campi modulo adattivo.
<?xml ?>
<afData>
<afUnboundData>
<data>
<field1>value</field2>
<repeatablePanel>
    <field2>value</field2>
</repeatablePanel>
<repeatablePanel>
    <field2>value</field2>
</repeatablePanel>
</data>
</afUnboundData>
<afBoundData>
<!-- xml corresponding to the Form Model /XML Schema -->
</afBoundData>
</afData>

Campi azione

Un'azione di invio può aggiungere campi di input nascosti (utilizzando il tag di input HTML) al modulo HTML di cui è stato effettuato il rendering. Questi campi nascosti possono contenere valori necessari durante l'elaborazione dell'invio del modulo. Quando si invia il modulo, questi valori dei campi vengono riportati come parametri di richiesta che l'azione Invia può utilizzare durante la gestione dell'invio. I campi di input sono denominati campi azione.
Ad esempio, un'azione Invia che acquisisce anche il tempo necessario per compilare un modulo può aggiungere i campi startTime e endTime le informazioni di input nascosti.
Uno script può fornire i valori dei campi startTime e endTime dei campi rispettivamente prima del rendering del modulo e prima dell'invio. Lo script di azione Invia post.jsp può quindi accedere a questi campi utilizzando i parametri della richiesta e calcolare il tempo totale necessario per compilare il modulo.

Allegati file

Le azioni di invio possono inoltre utilizzare gli allegati caricati mediante il componente File allegato. Gli script di azione Invia possono accedere a questi file utilizzando l'API sling RequestParameter. Il metodo isFormField dell'API aiuta a identificare se il parametro della richiesta è un file o un campo modulo. È possibile iterare i parametri Request in un'azione Submit per identificare i parametri File Attachment.
Il seguente codice di esempio identifica gli allegati nella richiesta. Quindi legge i dati nel file utilizzando l'API RequestParameter.html#get()Get. Infine, crea un oggetto Document utilizzando i dati e lo aggiunge a un elenco.
RequestParameterMap requestParameterMap = slingRequest.getRequestParameterMap();
for (Map.Entry<String, RequestParameter[]> param : requestParameterMap.entrySet()) {
    RequestParameter rpm = param.getValue()[0];
    if(!rpm.isFormField()) {
        fileAttachments.add(new Document(rpm.get()));
    }
}

Percorso avanti e URL di reindirizzamento

Dopo aver eseguito l’azione richiesta, il servlet Invia inoltra la richiesta al percorso successivo. Un'azione utilizza l'API setForwardPath per impostare il percorso in avanti nel servlet di invio della guida.
Se l’azione non fornisce un percorso in avanti, il servlet Invia reindirizzerà il browser utilizzando l’URL di reindirizzamento. L’autore configura l’URL di reindirizzamento utilizzando la configurazione Pagina di ringraziamento nella finestra di dialogo Modifica modulo adattivo. Potete inoltre configurare l’URL di reindirizzamento mediante l’azione Invia o l’API setRedirectUrl nel servlet di invio della guida. Potete inoltre configurare i parametri Request inviati all’URL Redirect utilizzando l’API setRedirectParameters nel servlet Guide Submit.
Un autore fornisce l’URL di reindirizzamento (utilizzando la configurazione della pagina di ringraziamento). Le azioni di invio OOTB utilizzano l'URL di reindirizzamento per reindirizzare il browser dalla risorsa a cui fa riferimento il percorso successivo.
È possibile scrivere un'azione di invio personalizzata per inoltrare una richiesta a una risorsa o a un servlet. Adobe consiglia di reindirizzare la richiesta all'URL di reindirizzamento quando l'elaborazione viene completata con lo script che esegue la gestione delle risorse per il percorso successivo.

Submit action

Un’azione Invia è una sling:Folder che include quanto segue:
  • addfields.jsp : Questo script fornisce i campi di azione che vengono aggiunti al file HTML durante la rappresentazione. Utilizzare questo script per aggiungere i parametri di input nascosti richiesti durante l'invio nello script post.POST.jsp.
  • dialog.xml : Questo script è simile alla finestra di dialogo del componente CQ. Fornisce informazioni di configurazione personalizzate dall’autore. I campi vengono visualizzati nella scheda Azioni invio della finestra di dialogo Modifica modulo adattivo quando si seleziona l'azione Invia.
  • post.POST.jsp : Il servlet di invio richiama questo script con i dati inviati e i dati aggiuntivi nelle sezioni precedenti. Qualsiasi riferimento all'esecuzione di un'azione in questa pagina implica l'esecuzione dello script post.POST.jsp. Per registrare l’azione Invia con i moduli adattivi da visualizzare nella finestra di dialogo Modifica modulo adattivo, aggiungere le seguenti proprietà a sling:Folder:
    • guideComponentType di tipo String e value fd/af/components/guidesubmittype
    • guideDataModel di tipo String che specifica il tipo di modulo adattivo per il quale è applicabile l'azione Invia. xfa è supportato per i moduli adattivi basati su XFA mentre xsd è supportato per i moduli adattivi basati su XSD. basic è supportata per i moduli adattivi che non utilizzano XDP o XSD. Per visualizzare l'azione su più tipi di moduli adattivi, aggiungere le stringhe corrispondenti. Separate ogni stringa con una virgola. Ad esempio, per rendere visibile un'azione nei moduli adattivi basati su XFA e XSD, specificare rispettivamente i valori xfa e xsd .
    • jcr:description di tipo String. Il valore di questa proprietà viene visualizzato nell'elenco delle azioni di invio nella scheda Azioni di invio della finestra di dialogo Modifica modulo adattivo. Le azioni OOTB sono presenti nell’archivio CRX, nel percorso /libs/fd/af/components/guidesubmittype .

Creazione di un'azione di invio personalizzata

Effettuare le seguenti operazioni per creare un'azione Invia personalizzata che salva i dati nell'archivio CRX e quindi invia un'e-mail. Il modulo adattivo contiene il contenuto OOTB Submit action Store (obsoleto) che salva i dati nell'archivio CRX. CQ fornisce inoltre un'API Mail che può essere utilizzata per inviare e-mail. Prima di utilizzare l'API Mail, #(https://docs.adobe.com/docs/en/cq/current/administering/notification.html?#Configuring the Mail Service) il servizio Day CQ Mail tramite la console di sistema. È possibile riutilizzare l'azione Archivia contenuto (obsoleto) per memorizzare i dati nella directory archivio. L’azione Contenuto store (obsoleto) è disponibile nel percorso /libs/fd/af/components/guidesubmittype/store dell’archivio CRX.
  1. Accedete a CRXDE Lite all'URL https://<server>:<porta>/crx/de/index.jsp. Create un nodo con la proprietà sling:Folder e name store_and_mail nella cartella /apps/custom_submit_action. Create la cartella custom_submit_action se non esiste già.
  2. Immettete i campi di configurazione obbligatori.
    Aggiungete la configurazione necessaria per l'azione Store. Copiate il nodo cq:dialog dell'azione Store da /libs/fd/af/components/guidesubmittype/store nella cartella dell'azione in /apps/custom_submit_action/store_and_email.
  3. Immettete i campi di configurazione per richiedere all’autore la configurazione dell’e-mail.
    Il modulo adattivo fornisce inoltre un'azione E-mail che invia e-mail agli utenti. Personalizza questa azione in base alle tue esigenze. Andate a /libs/fd/af/components/guidesubmittype/email/dialog. Copiare i nodi all'interno del nodo cq:dialog nel nodo cq:dialog dell'azione di invio (/apps/custom_submit_action/store_and_email/dialog).
  4. Rendete disponibile l’azione nella finestra di dialogo Modifica modulo adattivo.
    Aggiungi le seguenti proprietà nel nodo store_and_email:
    • guideComponentType di tipo String e valore fd/af/components/guidesubmittype
    • guideDataModel di tipo String e valore xfa, xsd, basic
    • jcr:descrizione di tipo String e valore Store e Azione e-mail
  5. Aprire qualsiasi modulo adattivo. Fate clic sul pulsante Modifica accanto a Avvia per aprire la finestra di dialogo Modifica del contenitore di moduli adattivi. La nuova azione viene visualizzata nella scheda Invia azioni . Selezionando Store e Email Action viene visualizzata la configurazione aggiunta nel nodo della finestra di dialogo.
  6. Utilizzare l'azione per completare un'attività.
    Aggiungere lo script post.POST.jsp all'azione. (/apps/custom_submit_action/store_and_mail/).
    Eseguire l'azione OOOTB Store (script post.POST.jsp). Utilizzate l'API #(https://docs.adobe.com/docs/en/cq/current/javadoc/com/day/cq/wcm/foundation/forms/FormsHelper.html#runAction(java.lang.String, java.lang.String, org.apache.sling.api.resource.Resource, org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.SlingHttpServletResponse) fornita nel codice per eseguire l'azione Store. Aggiungi il seguente codice nel file JSP:
    FormsHelper.runAction("/libs/fd/af/components/guidesubmittype/store", "post", resource, slingRequest, slingResponse);
    Per inviare l'e-mail, il codice legge l'indirizzo e-mail del destinatario dalla configurazione. Per recuperare il valore di configurazione nello script dell'azione, leggere le proprietà della risorsa corrente utilizzando il codice seguente. Allo stesso modo potete leggere gli altri file di configurazione.
    ValueMap properties = ResourceUtil.getValueMap(resource);
    String mailTo = properties.get("mailTo");
    Infine, utilizzate l'API CQ Mail per inviare l'e-mail. Utilizzate la classe SimpleEmail per creare l'oggetto Email come illustrato di seguito:
    Assicurarsi che il file JSP abbia il nome post.POST.jsp.
    <%@include file="/libs/fd/af/components/guidesglobal.jsp" %>
    <%@page import="com.day.cq.wcm.foundation.forms.FormsHelper,
           org.apache.sling.api.resource.ResourceUtil,
           org.apache.sling.api.resource.ValueMap,
                    com.day.cq.mailer.MessageGatewayService,
      com.day.cq.mailer.MessageGateway,
      org.apache.commons.mail.Email,
                    org.apache.commons.mail.SimpleEmail" %>
    <%@taglib prefix="sling" 
                    uri="https://sling.apache.org/taglibs/sling/1.0" %>
    <%@taglib prefix="cq" 
                    uri="https://www.day.com/taglibs/cq/1.0" 
    %>
    <cq:defineObjects/>
    <sling:defineObjects/>
    <%
            String storeContent = 
                        "/libs/fd/af/components/guidesubmittype/store";
            FormsHelper.runAction(storeContent, "post", resource, 
                                    slingRequest, slingResponse);
     ValueMap props = ResourceUtil.getValueMap(resource);
     Email email = new SimpleEmail();
     String[] mailTo = props.get("mailto", new String[0]);
     email.setFrom((String)props.get("from"));
            for (String toAddr : mailTo) {
                email.addTo(toAddr);
       }
     email.setMsg((String)props.get("template"));
     email.setSubject((String)props.get("subject"));
     MessageGatewayService messageGatewayService = 
                        sling.getService(MessageGatewayService.class);
     MessageGateway messageGateway = 
                    messageGatewayService.getGateway(SimpleEmail.class);
     messageGateway.send(email);
    %>
    
    
    Selezionate l’azione nel modulo adattivo. L’azione invia un messaggio e-mail e memorizza i dati.