Crear una acción de envío personalizada para un formulario adaptable

Un formulario adaptable ofrece varias acciones de envío de forma predeterminada (OOTB). Una acción de envío especifica los detalles de las acciones que se realizarán en los datos recopilados mediante el formulario adaptable. Por ejemplo, el envío de datos en un correo electrónico.

Puede crear una acción de envío personalizada para agregar una funcionalidad que no esté incluida en las acciones de envío de forma predeterminada o no que no son compatibles con una única acción de envío OOTB. Por ejemplo, enviar datos a un flujo de trabajo, guardar los datos en un almacén de datos, enviar una notificación por correo electrónico a la persona que envía el formulario y enviar un correo electrónico a la persona responsable de procesar el formulario enviado para aprobarlo o rechazarlo mediante una única acción de envío.

Formato de datos XML

Los datos XML se envían al servlet utilizando el parámetro de solicitud jcr:data. Las acciones de envío puede acceder al parámetro para procesar los datos. El siguiente código describe el formato de los datos XML. Los campos vinculados al modelo de formulario aparecen en la sección afBoundData. Los campos no vinculados aparecen en la sección afUnoundData.

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

Campos de acción

Una acción de envío puede agregar campos de entrada ocultos (mediante la etiqueta de entrada HTML ) al HTML de formulario procesado. Estos campos ocultos pueden contener los valores que necesita al procesar el envío del formulario. Al enviar el formulario, estos valores de campo se vuelven a registrar como parámetros de solicitud que la acción de envío puede utilizar durante el envío. Los campos de entrada se denominan campos de acción.

Por ejemplo, una acción de envío que también capture el tiempo necesario para rellenar un formulario, puede agregar los campos de entrada ocultos startTime y endTime.

Un script puede aportar los valores de los campos startTime y endTime cuando el formulario se procesa y antes de enviarlo, respectivamente. El script de acción de envío post.jsp puede acceder a estos campos mediante parámetros de solicitud y calcular el tiempo total necesario para rellenar el formulario.

Archivos adjuntos

Las acciones de envío también pueden utilizar los archivos adjuntos que se cargan mediante el componente Archivo adjunto. Los scripts de acción de envío pueden acceder a estos archivos utilizando el API RequestParameter de Sling. El método isFormField del API ayuda a identificar si el parámetro de solicitud es un archivo o un campo de formulario. Puede iterar los parámetros de solicitud en una acción de envío para identificar los parámetros del archivo adjunto.

El siguiente código de ejemplo identifica los archivos adjuntos en la solicitud. A continuación, lee los datos en el archivo utilizando Obtener API. Finalmente, crea un objeto Documento utilizando los datos y lo anexa a una lista.

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()));
    }
}

Cuando adjunta archivos al formulario adaptable, el servidor valida los archivos adjuntos después del envío del formulario adaptable y muestra un mensaje de error si ocurre lo siguiente:

  • Los archivos adjuntos incluyen un nombre de archivo que empieza por un carácter (.) contiene los caracteres \ / : * ? " < > | ; % $, o contiene nombres de archivo especiales reservados para el sistema operativo Windows, como nul, prn, con, lpt o com.

  • El tamaño del archivo adjunto es de 0 bytes.

  • El formato del archivo adjunto no está definido en la sección Tipos de archivo compatibles al configurar el componente Archivo adjunto en un formulario adaptable.

Ruta de reenvío y URL de redireccionamiento

Después de realizar la acción necesaria, el servlet de envío reenvía la solicitud a la ruta de reenvío. Una acción utiliza el API setForwardPath para establecer la ruta de reenvío en el servlet de envío de la guía.

Si la acción no ofrece una ruta de reenvío, el servlet de envío redirecciona el explorador mediante la URL de redireccionamiento. El autor configura la URL de redireccionamiento utilizando la configuración de la página de agradecimiento del cuadro de diálogo Editar formulario adaptable. También puede configurar la URL de redireccionamiento mediante la acción de envío o el API setRedirectUrl en el servlet de envío de la guía. También puede configurar los parámetros de solicitud enviados a la URL de redireccionamiento utilizando el API setRedirectParameters en el servlet de envío de la guía.

NOTA

Un autor aporta la URL de redireccionamiento (mediante la configuración de la página de agradecimiento). Las acciones de envío OOTB utilizan la URL de redireccionamiento para redirigir el explorador desde el recurso al que hace referencia la ruta de reenvío.

Puede escribir una acción de envío personalizada que reenvíe una solicitud a un recurso o servlet. Adobe recomienda que el script que administra los recursos de la ruta de reenvío redirija la solicitud a la URL de redireccionamiento cuando termine el procesamiento.

Acción de envío

Una acción de envío es sling:Folder, que incluye lo siguiente:

  • addfields.jsp: Este script aporta los campos de acción que se añaden al archivo HTML durante la representación. Utilice este script para agregar los parámetros de entrada ocultos necesarios durante el envío en el script post.POST.jsp.

  • dialog.xml: Este script es similar al cuadro de diálogo Componente CQ. Aporta información de configuración que el autor personaliza. Los campos se muestran en la pestaña Acciones de envío, del cuadro de diálogo Editar formulario adaptable, al seleccionar la acción de envío.

  • post.POST.jsp: El servlet de envío utiliza este script con los datos que envía y los datos adicionales de las secciones anteriores. Cualquier mención de la ejecución de una acción en esta página implica la ejecución del script post.POST.jsp. Para registrar la acción de envío con los formularios adaptables para que se muestre en el cuadro de diálogo Editar formulario adaptable, añada estas propiedades a sling:Folder:

    • guideComponentType de tipo cadena y valor fd/af/components/guidesubmittype

    • guideDataModel de tipo cadena que especifica el tipo de formulario adaptable para el que se aplica la acción de envío. xsd es compatible con formularios adaptables basados en XSD. basic es compatible con formularios adaptables que no utilizan XDP o XSD. Para mostrar la acción en varios tipos de formularios adaptables, añada las cadenas correspondientes. Separe cada cadena con una coma. Por ejemplo, para que una acción esté visible en formularios adaptables basados en XSD, especifique el valor como xsd.

    • jcr:description de tipo cadena. El valor de esta propiedad se muestra en la lista Enviar acción de la pestaña Acciones de envío del cuadro de diálogo Editar formulario adaptable. Las acciones OOTB están presentes en el repositorio CRX en la ubicación /libs/fd/af/components/guidesubmittype.

    • submitService de tipo cadena. Para obtener más información, consulte Programar el envío del formulario adaptable para acciones personalizadas.

Crear una acción de envío personalizada

Realice los siguientes pasos para crear una acción de envío personalizada que guarde los datos en el repositorio CRX y luego le envíe un correo electrónico. El formulario adaptable contiene el contenido del almacén de acciones de envío OOTB (obsoleto) que guarda los datos en el repositorio CRX. Además, AEM facilitará un API de Correo electrónico que se puede utilizar para enviar correos electrónicos. Antes de usar el API de correo electrónico, configure el servicio Day CQ Mail mediante la consola del sistema. Puede reutilizar la acción Almacenar contenido (obsoleta) para almacenar los datos en el repositorio. La acción Almacenar contenido (obsoleta) está disponible en la ubicación /libs/fd/af/components/guidesubmittype/store en el repositorio CRX.

  1. Inicie sesión en CRXDE Lite en la URL https://<server>:<port>/crx/de/index.jsp. Cree un nodo con la propiedad sling:Folder y el nombre store_and_mail en la carpeta /apps/custom_submit_action. Cree la carpeta custom_submit_action si todavía no existe.

    Captura de pantalla que representa la creación de un nodo con la propiedad sling:Folder

  2. Facilite los campos de configuración obligatorios.

    Añada la configuración que requiere la acción Almacenar. Copie el nodo cq:dialog de la acción Almacenar de /libs/fd/af/components/guidesubmittype/store a la carpeta de acciones en /apps/custom_submit_action/store_and_email.

    Captura de pantalla que muestra la copia del nodo de diálogo a la carpeta de acciones

  3. Falicite campos de configuración para solicitar al autor que configure el correo electrónico.

    El formulario adaptable también ofrece una acción de correo electrónico que envía correos electrónicos a los usuarios. Personalice esta acción según sus necesidades. Vaya a /libs/fd/af/components/guidesubmittype/email/dialog. Copie los nodos dentro del nodo cq:dialog al nodo cq:dialog de su acción de envío (/apps/custom_submit_action/store_and_email/dialog?lang=es).

    Personalizar la acción de correo electrónico

  4. Haga que la acción esté disponible en el cuadro de diálogo Editar el formulario adaptable.

    Añada las siguientes propiedades en el nodo store_and_email:

    • guideComponentType de tipo Cadena y valor fd/af/components/guidesubmittype

    • guideDataModel de tipo Cadena y valor xsd, básico

    • jcr:description de tipo Cadena y valor Acción de almacenamiento y correo electrónico

    • submitService de tipo Cadena y valor Almacenamiento y correo electrónico. Para obtener más información, consulte Programar el envío del formulario adaptable para acciones personalizadas.

  5. Abra cualquier formulario adaptable. Haga clic en el botón Editar junto a Inicio para abrir el cuadro de diálogo Editar del contenedor del formulario adaptable. La nueva acción se muestra en la pestaña Acciones de envío. Al seleccionar Acción de almacenamiento y correo electrónico, muestra la configuración añadida en el nodo de diálogo.

    Cuadro de diálogo Configuración de la acción de envío

  6. Utilice la acción para completar una tarea.

    Añada el script post.POST.jsp a su acción. (/apps/custom_submit_action/store_and_mail/?lang=es).

    Ejecute la acción Almacenamiento OOTB (script post.POST.jsp). Utilice el API FormsHelper.runAction(java.lang.String, java.lang.String, org.apache.sling.api.resource.Resource, org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.SlingHttpServletResponse)) que CQ ofrece en su código para ejecutar la acción de almacenamiento. Añada el siguiente código en su archivo JSP:

    FormsHelper.runAction("/libs/fd/af/components/guidesubmittype/store", "post", resource, slingRequest, slingResponse);

    Para enviar el correo electrónico, el código lee la dirección de correo electrónico del destinatario de la configuración. Para recuperar el valor de configuración en el script de la acción, lea las propiedades del recurso actual utilizando el siguiente código. Del mismo modo, puede leer los demás archivos de configuración.

    ValueMap properties = ResourceUtil.getValueMap(resource);

    String mailTo = properties.get("mailTo");

    Finalmente, utilice el API CQ Mail para enviar el correo electrónico. Utilice la clase SimpleEmail para crear el objeto de correo electrónico como se muestra a continuación:

    NOTA

    Asegúrese de que el archivo JSP tiene el nombre 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);
    %>
    

    Seleccione la acción en el formulario adaptable. La acción envía un correo electrónico y almacena los datos.

Utilizar la propiedad submitService para las acciones de envío personalizadas

Al establecer la acción de envío personalizada, que incluye la propiedad submitService, el formulario activa FormSubmitActionService en el momento del envío. FormSubmitActionService utiliza el método getServiceName para recuperar el valor de la propiedad submitService. En función del valor de la propiedad submitService, el servicio invoca el método de envío adecuado. Incluya FormSubmitActionService al paquete personalizado que carga en el servidor de AEM Forms.

Añada la propiedad submitService de tipo cadena a sling:Folder de su acción de envío personalizada para habilitar Adobe Sign para el formulario adaptable. Puede seleccionar la opción Habilitar Adobe Sign en la sección Firma electrónica de las propiedades del contenedor del formulario adaptable solo después de establecer el valor de la propiedad submitService de su acción de envío personalizada.

Enviar propiedad de servicio

En esta página