为自适应Forms创建自定义提交操作

自适应表单提供了多个现成提交操作(OOTB)。 “提交操作”指定要对通过自适应表单收集的数据执行的操作的详细信息。 例如,通过电子邮件发送数据。

您可以创建一个自定义提交操作,以添加现成提交操作中未包含或不支持通过单个OOTB提交操作的功能。 例如,将数据提交到工作流、将数据保存到数据存储中、向提交表单的人发送电子邮件通知,以及通过单个提交操作向负责处理已提交表单以供审批和拒绝的人员发送电子邮件。

XML数据格式

使用​jcr:data​请求参数将XML数据发送到Servlet。 提交操作可以访问参数以处理数据。 以下代码描述XML数据的格式。 绑定到表单模型的字段显示在​afBoundData​部分中。 未绑定字段显示在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>

操作字段

提交操作可以将隐藏的输入字段(使用HTML input标记)添加到呈现的表单HTML中。 这些隐藏字段可以包含处理表单提交时需要的值。 提交表单时,这些字段值将作为请求参数发回,提交操作可在提交处理过程中使用这些参数。 输入字段称为操作字段。

例如,如果“提交操作”也捕获填写表单所花费的时间,则可以添加隐藏的输入字段startTimeendTime

当表单呈现时和表单提交前,脚本可以分别提供startTimeendTime字段的值。 然后,提交操作脚本post.jsp可以使用请求参数访问这些字段,并计算填写表单所需的总时间。

文件附件

提交操作还可以使用您使用文件附件组件上传的文件附件。 提交操作脚本可以使用sling RequestParameter API访问这些文件。 API的isFormField方法可帮助识别请求参数是文件还是表单字段。 您可以在提交操作中迭代请求参数,以标识文件附件参数。

以下示例代码标识请求中的文件附件。 接下来,它使用Get API将数据读入文件。 最后,它使用数据创建一个Document对象并将其附加到列表。

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

在将文件附加到自适应表单后,服务器会在提交自适应表单后验证文件附件,并在以下情况下返回错误消息:

  • 文件附件包含以(.)开头的文件名 字符,包含\ / :* ? " < > | ;% $字符,或包含为Windows操作系统保留的特殊文件名,如nulprnconlptcom

  • 文件附件的大小为0字节。

  • 在自适应表单中配置文件附件组件时,在支持的文件类型部分中未定义文件附件的格式。

转发路径和重定向URL

执行所需操作后,Submit servlet会将请求转发到转发路径。 操作使用setForwardPath API在指南提交Servlet中设置前进路径。

如果操作未提供转发路径,则提交Servlet会使用重定向URL重定向浏览器。 作者使用自适应表单编辑对话框中的感谢页面配置来配置重定向URL。 您还可以通过提交操作或指南提交servlet中的setRedirectUrl API来配置重定向URL。 您还可以使用指南提交servlet中的setRedirectParameters API配置发送到重定向URL的请求参数。

注意

作者提供了重定向URL(使用感谢页面配置)。 OOTB提交 操作使用重定向URL从转发路径引用的资源中重定向浏览器。

您可以编写一个自定义提交操作,将请求转发到资源或Servlet。 Adobe建议负责对前向路径执行资源处理的脚本在处理完成时将请求重定向到重定向URL。

提交操作

提交操作是sling:Folder,其中包含以下内容:

  • addfields.jsp:此脚本提供在呈现期间添加到HTML文件的操作字段。使用此脚本在post.POST.jsp脚本中添加提交期间所需的隐藏输入参数。

  • dialog.xml:此脚本类似于CQ组件对话框。它提供作者自定义的配置信息。 当您选择提交操作时,这些字段会显示在自适应表单编辑对话框的提交操作选项卡中。

  • post.POST.jsp:提交Servlet会使用您提交的数据以及前几节中的附加数据调用此脚本。在此页中提及运行操作意味着运行post.POST.jsp脚本。 要在自适应Forms中注册“提交操作”以在自适应表单编辑对话框中显示,请将这些属性添加到sling:Folder:

    • ​guideComponentTypeof类型字符串和值fd/af/ components/guidesubmittype

    • ​guideDataModelof类型为字符串,用于指定适用提交操作的自适应表单的类型。基于XSD的自适应Forms支持 xsd。 不使用XDP或XSD的自适应Forms支持的基础。要对多种类型的自适应Forms显示操作,请添加相应的字符串。 用逗号分隔每个字符串。 例如,要使操作在基于XSD的自适应Forms上可见,请将值指定为 xsd

    • jcr: 字符串类型的描述。此属性的值显示在“自适应表单编辑”对话框的“提交操作”选项卡的“提交操作”列表中。 OOTB操作位于CRX存储库中​/libs/fd/af/components/guidesubmittype​的位置。

    • ​submitService类型为字符串。有关更多信息,请参阅为自定义操作计划自适应表单提交

创建自定义提交操作

执行以下步骤以创建一个自定义提交操作,该操作将数据保存在CRX存储库中,然后向您发送电子邮件。 自适应表单包含将数据保存到CRX存储库的OOTB提交操作存储内容(已弃用)。 此外, AEM还提供了一个Mail API,用于发送电子邮件。 在使用Mail API之前, 通过系统控制台配置 Day CQ Mail服务。 您可以重复使用“存储内容(已弃用)”操作将数据存储在存储库中。 “存储内容(已弃用)”操作可在CRX存储库的/libs/fd/af/components/guidesubmittype/store位置执行。

  1. 登录到URL https://<server>:<port>/crx/de/index.jspCRXDE Lite。 在/apps/custom_submit_action文件夹中创建一个具有属性sling:Folder和名称store_and_mail的节点。 创建custom_submit_action文件夹(如果文件夹不存在)。

    描述使用属性sling:Folder创建节点的屏幕截图

  2. 提供必填配置字段。

    添加Store操作所需的配置。 将“存储”操作的​cq:dialog​节点从/libs/fd/af/components/guidesubmittype/store复制到位于/apps/custom_submit_action/store_and_email的操作文件夹中。

    屏幕截图显示将对话框节点复制到操作文件夹

  3. 提供配置字段以提示作者进行电子邮件配置。

    自适应表单还提供了电子邮件操作,用于向用户发送电子邮件。 根据您的要求自定义此操作。 导航至/libs/fd/af/components/guidesubmittype/email/dialog。 将cq:dialog节点中的节点复制到“提交操作”的cq:dialog节点(/apps/custom_submit_action/store_and_email/dialog?lang=zh-Hans)。

    自定义电子邮件操作

  4. 使该操作在自适应表单编辑对话框中可用。

    在store_and_email节点中添加以下属性:

    • ​guideComponentTypeof类 ​型字符串 和值fd/af/components/guidesubmittype

    • ​字符串类型 ​的guideDataModel xsd,基本

    • jcr:字符串 类型的描 ​述、值存 储和电子邮件操作

    • ​submitService类型为字符串 ​,值 存储和电子邮件。有关更多信息,请参阅为自定义操作计划自适应表单提交

  5. 打开任何自适应表单。 单击​开始​旁边的​编辑​按钮以打开自适应表单容器的​编辑​对话框。 新操作显示在​Submit Actions​选项卡中。 选择​存储和电子邮件操作​将显示在对话框节点中添加的配置。

    提交操作配置对话框

  6. 使用操作完成任务。

    将post.POST.jsp脚本添加到您的操作。 (/apps/custom_submit_action/store_and_mail/?lang=zh-Hans)。

    运行OOTB存储操作(post.POST.jsp脚本)。 使用CQ在您的代码中提供的FormsHelper.runAction(java.lang.String, java.lang.String, org.apache.sling.api.resource.Resource, org.apache.sling.api.SlingHttpServletRequest, org.apache.sling.api.SlingHttpServletResponse)API来运行“存储”操作。 在JSP文件中添加以下代码:

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

    要发送电子邮件,此代码会从配置中读取收件人的电子邮件地址。 要在操作的脚本中获取配置值,请使用以下代码读取当前资源的属性。 同样,您也可以读取其他配置文件。

    ValueMap properties = ResourceUtil.getValueMap(resource);

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

    最后,使用CQ Mail API发送电子邮件。 使用SimpleEmail类创建Email对象,如下所示:

    注意

    确保JSP文件的名称为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);
    %>
    

    在自适应表单中选择操作。 操作会发送电子邮件并存储数据。

对自定义提交操作使用submitService属性

设置包含submitService属性的自定义提交操作后,表单会在提交时触发FormSubmitActionServiceFormSubmitActionService使用getServiceName方法检索submitService属性的值。 根据submitService属性的值,服务会调用相应的提交方法。 将FormSubmitActionService包含到您上传到AEM Forms服务器的自定义包中。

将类型字符串的submitService属性添加到自定义提交操作的sling:Folder中,以启用自适应表单的Adobe Sign。 只有在为自定义提交操作的submitService属性设置值后,才能在自适应表单容器属性的​Electronic Signature​部分中选择​Enable Adobe Sign​选项。

提交服务属性

在此页面上