アダプティブフォーム用のカスタム送信アクションを作成 writing-custom-submit-action-for-adaptive-forms

バージョン
記事リンク
AEM 6.5
ここをクリックしてください
AEM as a Cloud Service
この記事

アダプティブフォームでは、あらかじめ用意された複数の送信アクション(OOTB)を使用できます。送信アクションは、アダプティブフォームで収集されたデータに対して実行されるアクションの詳細を指定します。例えば、メールでのデータの送信などです。

カスタム送信アクションを作成して、すぐに使える送信アクションに含まれない機能や、単一の OOTB 送信アクションを介してサポートされない機能を追加できます。例えば、データをワークフローに送信し、そのデータをデータストアに保存し、フォームを送信した人にメール通知を送信し、送信したフォームを承認および却下するプロセスを担当する人にメールを送信するというアクションを、1 つの送信アクションで処理するとします。

XML データ形式 xml-data-format

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>

アクションフィールド action-fields

送信アクションは、HTML の input タグを使って、レンダリングされたフォームの HTML に非表示の入力フィールドを追加することができます。これらの非表示のフィールドには、フォーム送信の処理中に必要な値を含めることができます。フォーム送信時に、これらのフィールド値は、送信アクションが送信処理中に使用することのできるリクエストパラメーターとしてポストバックされます。この入力フィールドは、アクションフィールドと呼ばれます。

例えば、フォームの記入にかかった時間も取得する送信アクションであれば、startTime および endTime のフィールドを非表示で追加することができます。

スクリプトを使って、フォームがレンダリングされた時間ならびにフォーム送信前の時間を、それぞれ startTime および endTime フィールドの値として指定することができます。その後、送信アクションのスクリプト post.jsp が、リクエストパラメーターを使ってこれらのフィールドにアクセスし、フォームの記入にかかった合計時間を計算することができます。

添付ファイル file-attachments

送信アクションは、ファイル添付コンポーネントを使ってアップロードされた添付ファイルを使用することもできます。送信アクションスクリプトは、Sling RequestParameter API を使ってこれらのファイルにアクセスすることができます。API の isFormField メソッドは、リクエストパラメーターがファイルであるかフォームフィールドであるかを特定するのに役立ちます。送信アクション内のリクエストパラメーターを反復することで、ファイル添付パラメーターを特定することができます。

次のサンプルコードは、まず、リクエスト内の添付ファイルを特定します。続いて、このコードは、Get API を使ってファイルにデータを読み込みます。最後に、データを使用してドキュメントオブジェクトを作成し、それをリストに追加します。

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

アダプティブフォームにファイルを添付する場合、サーバーはアダプティブフォームの送信後に添付ファイルを検証し、次の場合にエラーメッセージを返します。

  • ファイル名が(.)文字で開始するもの、\ / : * ? " < > | ; % $ 文字を含むもの、または nulprnconlptcom など、Windows オペレーティングシステム用に予約された特殊なファイル名を含む添付ファイル。

  • 添付ファイルのサイズが 0 バイト。

  • アダプティブフォームで添付ファイルコンポーネントを設定する際に、サポートされているファイル形式セクションで定義されていない添付ファイル形式。

転送パスおよびリダイレクト URL forward-path-and-redirect-url

要求されたアクションを実行した後、送信サーブレットは、リクエストを転送パスに転送します。アクションが、setForwardPath API を使って Guide Submit サーブレットに転送パスを作成します。

アクションによって転送パスが指定されない場合、送信サーブレットは、リダイレクト URL を使ってブラウザーをリダイレクトします。作成者は、アダプティブフォーム編集ダイアログの「ありがとうございます」ページ設定を使って、リダイレクト URL を設定します。リダイレクト URL は、送信アクションまたは Guide Submit 内の setRedirectUrl API を通して設定することもできます。また、Guide Submit サーブレット内の setRedirectParameters API を使って、リダイレクト URL に送られるリクエストパラメーターを設定することもできます。

NOTE
リダイレクト URL は、「ありがとうございます」ページ設定を使って作成者が指定します。OOTB 送信アクションは、リダイレクト URL を使って、転送パスによって参照されるリソースからブラウザーをリダイレクトします。
リクエストをリソースまたはサーブレットに転送するカスタム送信アクションを作成することができます。転送パスのリソース処理を実行するスクリプトによるリダイレクト URL へのリクエストのリダイレクトは、処理が完了したときに実行するように設定することをお勧めします。

送信アクション submit-action

送信アクションは、次のファイルを含む sling:Folder です。

  • addfields.jsp:このスクリプトは、レンディション中に HTML ファイルに追加されるアクションフィールドを指定します。post.POST.jsp スクリプトでの送信中に必要な非表示の入力パラメーターの追加には、このスクリプトを使用します。

  • dialog.xml:このスクリプトは、CQ コンポーネントダイアログに似ています。作成者がカスタマイズする設定情報を提供します。フィールドは、送信アクションを選択するときに、アダプティブフォーム編集ダイアログの送信アクションタブに表示されます。

  • post.POST.jsp:送信サーブレットは、送信されたデータおよび前のセクションからの追加データで、このスクリプトを呼び出します。このページで言及されるアクションの実行は、post.POST.jsp スクリプトの実行を意味します。送信アクションをアダプティブFormsに登録してアダプティブフォーム編集ダイアログに表示するには、以下のプロパティを sling:Folder:

    • 文字列型の guideComponentType および値 fd/af/components/guidesubmittype

    • 送信アクションが適用されるアダプティブフォームのタイプを指定する文字列型の guideDataModelxsdi は、XSD ベースのアダプティブフォームでサポートされています。basic は、XDP または XSD を使用しないアダプティブフォームでサポートされています。複数のタイプのアダプティブフォームでのアクションを表示するには、対応する文字列を追加します。各文字列はカンマで区切ります。例えば、XSD ベースのアダプティブフォームでアクションを表示するには、値を xsd に指定します。

    • 文字列型の jcr:description。このプロパティの値は、アダプティブフォーム編集ダイアログの「送信アクション」タブにある送信アクションリストに表示されます。OOTB アクションは、/libs/fd/af/components/guidesubmittype の場所にある CRX リポジトリーに存在します。

    • 文字列 ​型の submitService。詳しくは、「カスタムアクション用にアダプティブフォームの送信をスケジュール」を参照してください。

カスタム送信アクションの作成 creating-a-custom-submit-action

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.jspから、CRXDE Lite にログインします。/apps/custom_submit_action フォルダー内に sling:Folder プロパティを持つノードを作成し、名前を store_and_mail に設定します。custom_submit_action フォルダーが存在しない場合は作成します。

    sling:Folder プロパティを持つノードの作成を示したスクリーンショット

  2. 必須の設定フィールドを指定します。

    格納アクションに必要な設定を追加します。/libs/fd/af/components/guidesubmittype/store から、格納アクションの cq:dialog ノードを、/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)にコピーします。

    メール送信アクションのカスタマイズ

  4. アクションをアダプティブフォーム編集ダイアログで使用できるようにします。

    次のプロパティを store_and_email ノードに追加します。

  5. 任意のアダプティブフォームを開きます。「開始」の隣にある「編集」ボタンをクリックし、アダプティブフォームコンテナの 編集 ダイアログを開きます。新しいアクションが、「送信アクション」タブに表示されます。格納およびメール送信アクション ​を選択すると、ダイアログノードに追加された設定が表示されます。

    送信アクション設定ダイアログ

  6. アクションを使用してタスクを完了します。

    post.POST.jsp スクリプトをアクションに追加します(/apps/custom_submit_action/store_and_mail/)。

    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 Object を作成します。

    note note
    NOTE
    JSP ファイルの名前が post.POST.jsp になっていることを確認してください。
    code language-java
    <%@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-property

submitService プロパティを含むカスタム送信アクションを設定すると、フォームトリガーは送信時に FormSubmitActionService を送信します。FormSubmitActionService は、getServiceName メソッドを使用して submitService プロパティの値を取得します。submitService プロパティの値に基づいて、サービスは適切な送信メソッドを呼び出します。FormSubmitActionService サーバーにアップロードするカスタムバンドルに AEM Forms を含めます。

アダプティブフォームの Adobe Sign を有効にするには、カスタム送信アクションの sling:Folder に対するタイプ文字列の submitService プロパティを追加します。アダプティブフォームコンテナプロパティの​ 電子サイン ​セクションで、カスタムの送信アクションの submitService プロパティの値を設定した後にのみ、「Adobe Sign を有効にする」オプションを選択できます。

送信サービスのプロパティ

recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab