現在表示中:

Adaptive forms では、ユーザー指定のデータを処理するために、送信アクションが必要となります。送信アクションとは、アダプティブフォームを使って送信されるデータに対して実行されるタスクを決定するものです。Adobe Experience Manager (AEM) には、ユーザーによって送信されたデータを使って実行できるカスタムタスクを示す OOTB 送信アクションが含まれています。例えば、メール送信やデータの保存などのタスクを実行することができます。

送信アクションのワークフロー

このフローチャートは、アダプティブフォームで「送信」ボタンをクリックしたときにトリガーされる送信アクションのワークフローを表しています。File Attachment コンポーネントのファイルはサーバーにアップロードされ、フォームデータはアップロードされたファイルの URL で更新されます。クライアント内で、データは JSON 形式で格納されます。クライアントは、指定したデータをメッセージして XML 形式で返信する内部サーブレットに Ajax リクエストを送信します。クライアントは、このデータをアクションフィールドと照合します。そして、Form Submit アクションを通して、データを最終サーブレット(Guide Submit サーブレット)に送信します。次に、サーブレットが送信アクションにコントロールを転送します。送信アクションは、異なるスリングリソースにリクエストを転送するか、またはブラウザを別の URL にリダイレクトさせることができます。

送信アクションのワークフローを示したフローチャート

XML データ形式

XML データは、jcr:data リクエストパラメーターを使ってサーブレットへと送信されます。送信アクションは、データを処理するためにパラメーターにアクセスすることができます。次のコードは、XML データの形式を説明しています。フォームモデルにバインドされているフィールドは、afBoundData セクションに表示されます。バインドされていないフィールドは、 afUnoundData セクションに表示されます。data.xml ファイルの形式について詳しくは、「アダプティブフォームフィールドの自動埋め込みの概要」を参照してください。

<?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 に非表示の入力フィールドを追加することができます。これらの非表示のフィールドには、フォーム送信の処理中に必要な値を含ませることができます。フォーム送信時に、これらのフィールド値は、送信アクションが送信処理中に使用することのできるリクエストパラメーターとしてポストバックされます。この入力フィールドは、アクションフィールドと呼ばれます。

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

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

添付ファイル

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

次のサンプルコードは、まず、リクエスト内の添付ファイルを特定します。続いて、このコードは、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()));
    }
}

転送パスおよびリダイレクト URL

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

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

注意:

リダイレクト URL は、ありがとうございますページ設定を使って作成者が指定しますOOTB 送信アクションは、リダイレクト URL を使って、転送パスによって参照されるリソースからブラウザをリダイレクトします。

リクエストをリソースまたはサーバーレットに転送するカスタム送信アクションを作成することができます。転送パスのリソース処理を実行するスクリプトによって行われるリダイレクト URL へのリクエストのリダイレクトは、処理が完了したときに行われるように設定することをお勧めします。

送信アクション

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

  • addfields.jsp:このスクリプトは、レンダリング中に HTML ファイルに追加されるアクションフィールドを指定します。post.POST.jsp スクリプトでの送信中に必要な非表示の入力パラメーターの追加には、このスクリプトを使用します。
  • dialog.xml:このスクリプトは、CQ Component ダイアログに似ています。作成者がカスタマイズする設定情報を提供します。フィールドは、送信アクションを選択するときに、アダプティブフォーム編集ダイアログの送信アクションタブに表示されます。
  • post.POST.jsp:送信サーブレットは、送信されたデータおよび前のセクションからの追加データで、このスクリプトを呼び出します。このページで言及されるアクションの実行は、post.POST.jsp スクリプトの実行を意味します。送信アクションをアダプティブフォームに登録し、アダプティブフォーム編集ダイアログに表示するには、次のプロパティをスリングフォルダーに追加します。
    • ストリング型の guideComponentType および値 fd/af/components/guidesubmittype
    • 送信アクションが適用されるアダプティブフォームのタイプを指定するストリング型の guideComponentTypexfa は、XFA ベースのアダプティブフォームでサポートされており、またxsd は、XSD ベースのアダプティブフォームでサポートされています。basic は、XDP または XSD を使用しないアダプティブフォームでサポートされています。複数のタイプのアダプティブフォームでのアクションを表示するには、対応する文字列を追加します。各文字列はカンマで区切ります。例えば、XFA および XSD ベースのアダプティブフォームでアクションを表示したい場合、xfa および xsd を値にそれぞれ指定します。
    • ストリング型の jcr:description 。このプロパティの値は、アダプティブフォーム編集ダイアログの送信アクションタブにある送信アクションリストに表示されます。OOTB アクションは、/libs/fd/af/components/guidesubmittype のロケーションにある CRX リポジトリに存在します。

カスタム送信アクションの作成

次の手順を実行し、CRX リポジトリにデータを保存した後、メール送信を行うカスタム送信アクションを作成します。アダプティブフォームには、CRX リポジトリにデータを保存する OOTB の送信アクション Store Content(廃止)が含まれています。さらに、CQ には、メール送信に使用される Mail API が含まれています。Mail API を使用する前に、システムコンソールを通して Day CQ Mail サービスを設定します。リポジトリにデータを保存するには、Store Content(廃止)アクションを再利用することができます。Store Content(廃止)アクションは、CRX リポジトリの /libs/fd/af/components/guidesubmittype/store にあります。

  1. URL http://<server>:<port>/crx/de/index.jsp から、CRXDE Lite にログインします。/apps/custom_submit_action フォルダー内に sling:Folder プロを持つノードを作成し、名前を store_and_mail に設定します。custom_submit_action フォルダーがすでに存在しない場合は作成します。

    sling:Folder をプロパティとするノードの作成を示したスクリーンショット
  2. 必須の設定フィールドを指定します。

    Store アクションに必要な設定を追加します。/libs/fd/af/components/guidesubmittype/store から、Store アクションの cq:dialog ノードを、/apps/custom_submit_action/store_and_email のアクションフォルダーにコピーします。

    アクションフォルダーへのダイアログノードのコピーを示したスクリーンショット
  3. 作成者に電子メール設定を促す設定フィールドを指定します。

    アダプティブフォームには、ユーザーに電子メールを送信する Email アクションもあります。要件に応じて、このアクションをカスタマイズします。/libs/fd/af/components/guidesubmittype/email/dialog に移動します。cq:dialog ノード内のノードを、Submit アクションの cq:dialog ノード(/apps/custom_submit_action/store_and_email/dialog)にコピーします。

    メール送信アクションのカスタマイズ
  4. アクションを Adaptive Form Edit ダイアログで使用できるようにします。

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

    • ストリング型の guideComponentType および値 fd/af/components/guidesubmittype
    • ストリング型の guideDataModel および値 xfa、xsd、basic
    • ストリング型のjcr:description および値 Store and Email Action
  5. 任意のアダプティブフォームを開きますStart の隣にある「Edit」ボタンをクリックし、アダプティブフォームコンテナの Edit ダイアログを開きます。新しいアクションが、Submit Actions タブに表示されます。Store and Email Action を選択すると、ダイアログノードに追加された設定が表示されます。

    送信アクション設定ダイアログ
  6. アクションを使用してタスクを完了します。

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

    OOTB の Store アクション(post.POST.jsp スクリプト)を実行します。CQ がコードに提供する FormsHelper.runAction API を、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 を使用してメールを送信します。SimpleEmail クラスを使って、次に示すとおりに Email Object を作成します。

    注意:

    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="http://sling.apache.org/taglibs/sling/1.0" %>
    <%@taglib prefix="cq" 
                    uri="http://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);
    %>

    アダプティブフォームでアクションを選択します。アクションがメールを送信し、データを保存します。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー