為自適應Forms建立自定義提交操作

自適應表單提供多個現成提交操作(OOTB)。 「提交操作」指定要對通過自適應表單收集的資料執行的操作的詳細資訊。 例如,在電子郵件中發送資料。

您可以建立自定義提交操作以添加未包含在 預置提交操作 或不支援通過單個OOTB提交操作。 例如,將資料提交到工作流,將資料保存在資料儲存上,向提交表單的人員發送電子郵件通知,並通過單個「提交操作」向負責處理提交表單以供審批和拒絕的人員發送電子郵件。

XML資料格式

XML資料使用 jcr:data 請求參數。 「提交操作」可以訪問參數以處理資料。 以下代碼描述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 輸入 標籤)到呈現的窗體HTML。 這些隱藏欄位可以包含處理表單提交時需要的值。 在提交表單時,這些欄位值會作為請求參數被傳回,提交操作可以在提交處理過程中使用這些參數。 輸入欄位稱為操作欄位。

例如,還捕獲填寫表單所花時間的提交操作可以添加隱藏的輸入欄位 startTimeendTime

指令碼可以提供 startTimeendTime 欄位。 提交操作指令碼 post.jsp 然後,可以使用請求參數訪問這些欄位並計算填寫表單所需的總時間。

檔案附件

「提交操作」還可以使用「檔案附件」元件上載的檔案附件。 提交操作指令碼可以使用sling訪問這些檔案 RequestParameter API。 的 是窗體欄位 API的方法有助於確定請求參數是檔案還是表單域。 您可以在「提交操作」中迭代「請求」參數,以標識「檔案附件」參數。

以下示例代碼標識請求中的檔案附件。 接下來,它使用 獲取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()));
    }
}

將檔案附加到Adaptive Form時,伺服器在提交Adaptive Form後驗證檔案附件,並在以下情況下返回錯誤消息:

  • 檔案附件包含以(.)開頭的檔案名 字元,包含\ /*? " < > |;% $字元或包含為Windows作業系統保留的特殊檔案名,如 nulprnconlptcom

  • 檔案附件的大小為0位元組。

  • 檔案附件的格式未在 支援的檔案類型 在自適應窗體中配置檔案附件元件時。

轉發路徑和重定向URL

執行所需操作後,提交servlet將請求轉發到轉發路徑。 操作使用setForwardPath API在指南提交servlet中設定前向路徑。

如果操作未提供轉發路徑,則提交servlet使用重定向URL重定向瀏覽器。 作者使用「自適應表單編輯」對話框中的「感謝」頁配置配置重定向URL。 您還可以通過「提交操作」或「指南提交servlet」中的setRedirectUrl API配置重定向URL。 您還可以使用指南提交servlet中的setRedirectParameters API配置發送到重定向URL的請求參數。

注意

作者提供重定向URL(使用「感謝」頁面配置)。 OOTB提交操作 使用重定向URL將瀏覽器從轉發路徑引用的資源中重定向。

您可以編寫一個自定義提交操作,將請求轉發到資源或servlet。 Adobe建議執行正向路徑資源處理的指令碼在處理完成後將請求重定向到重定向URL。

提交動作

「提交操作」(Submit Action)是sling:Folder,它包括以下內容:

  • addfields.jsp:此指令碼提供在格式副本期間添加到HTML檔案的操作欄位。 使用此指令碼可在post.POST.jsp指令碼中添加提交期間所需的隱藏輸入參數。

  • 對話框.xml:此指令碼與「CQ元件」對話框類似。 它提供了作者自定義的配置資訊。 選擇「提交操作」後,這些欄位將顯示在「自適應表單編輯」對話框的「提交操作」頁籤中。

  • post.POST.jsp:Submit Servlet使用您提交的資料和前面各節中的附加資料調用此指令碼。 在此頁中任何提到運行操作都意味著運行post.POST.jsp指令碼。 要將「提交操作」註冊到「自適應Forms」以在「自適應表單編輯」對話框中顯示,請將這些屬性添加到sling:Folder:

    • guideComponentType 字串和值類型 fd/af/元件/指導提交類型

    • guideDataModel 類型字串,指定適用提交操作的自適應表單的類型。 xx 支援基於XSD的自適應Forms。 基本 不使用XDP或XSD的Adaptive Forms支援。 要在多種類型的自適應Forms上顯示操作,請添加相應的字串。 用逗號分隔每個字串。 例如,要使操作在上可見 基於XSD的自適應Forms,將值指定為 xx

    • jcr:說明 類型。 此屬性的值顯示在「自適應表單編輯」對話框的「提交操作」頁籤的「提交操作」清單中。 OOTB操作存在於位置的CRX儲存庫中 /libs/fd/af/components/guidesubmittype

    • 提交服務 類型。 有關詳細資訊,請參見 為自定義操作安排自適應表單提交

建立自定義提交操作

執行以下步驟建立自定義提交操作,該操作將資料保存在CRX儲存庫中,然後向您發送電子郵件。 自適應表單包含OOTB提交操作儲存內容(已棄用),該內容將資料保存在CRX儲存庫中。 此外,還AEM提供 郵件 可用於發送電子郵件的API。 使用Mail API之前,請通過系統控制台配置Day CQ Mail服務。 您可以重用「儲存內容」(已棄用)操作將資料儲存在儲存庫中。 「儲存內容(已棄用)」操作可在CRX儲存庫中的/libs/fd/af/components/guidesubmittype/store位置使用。

  1. 登錄到CRXDE Lite,網址為https://<server>:<port>/crx/de/index.jsp。 在/apps/custom_submit_action資料夾中,使用sling:Folder和name store_and_mail屬性建立節點。 如果custom_submit_action資料夾不存在,請建立它。

    描述使用屬性sling:Folder建立節點的螢幕快照

  2. 提供必需的配置欄位。

    添加儲存操作所需的配置。 複製 cq:對話框 「儲存」操作的節點(從/libs/fd/af/components/guidesubmittype/store到/apps/custom_submit_action/store_and_email上的操作資料夾)。

    螢幕快照顯示對話框節點複製到操作資料夾

  3. 提供配置欄位以提示作者進行電子郵件配置。

    Adaptive Form還提供了向用戶發送電子郵件的Email操作。 根據您的要求自定義此操作。 導航至/libs/fd/af/components/guidesubmittype/email/dialog。 將cq:dialog節點中的節點複製到「提交操作」(/apps/custom_submit_action/store_and_email/dialog?lang=zh-Hant)的cq:dialog節點。

    自定義電子郵件操作

  4. 使操作在「自適應表單編輯」對話框中可用。

    在store_and_email節點中添加以下屬性:

    • guideComponentType 類型 字串 價值 fd/af/元件/指導提交類型

    • guideDataModel 類型 字串 價值 xsd,基本

    • jcr:說明 類型 字串 價值 儲存和電子郵件操作

    • 提交服務 類型 字串 價值 儲存和電子郵件。 有關詳細資訊,請參見 為自定義操作安排自適應表單提交

  5. 開啟任何自適應窗體。 按一下 編輯 按鈕 開始 開啟 編輯 對話框。 新操作將顯示在 提交操作 頁籤。 選擇 儲存和電子郵件操作 顯示在對話框節點中添加的配置。

    「提交操作配置」對話框

  6. 使用操作完成任務。

    將post.POST.jsp指令碼添加到操作。 (/apps/custom_submit_action/store_and_mail/?lang=zh-Hant)。

    運行OOTB儲存操作(post.POST.jsp指令碼)。 使用 FormsHelper.runAction(java.lang.string、java.lang.String、org.apache.sling.api.resource.、org.apache.sling.api.SlingHttpServletRequest、org.apache.sling.api.SlingHttpServletResponse)API,CQ在代碼中提供以運行Store操作。 在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發送電子郵件。 使用 簡單電子郵件 類以建立電子郵件對象,如下所示:

    注意

    確保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 屬性,窗體觸發 表單提交操作服務 提交。 的 FormSubmitActionService 使用 getServiceName 用於檢索 submitService 屬性。 基於 submitService 屬性,服務調用相應的提交方法。 包括 FormSubmitActionService 上載到 AEM Forms 伺服器。

添加 submitService 字串類型的屬性 sling:Folder 的自定義提交操作 Adobe Sign 的子菜單。 可以選擇 啟用Adobe Sign 的上界 電子簽名 在為 submitService 自定義提交操作的屬性。

提交服務屬性

本頁內容