アダプティブフォームのフィールドの事前入力

既存データを使用して、アダプティブフォームのフィールドを事前入力します。

概要

既存データを使用して、アダプティブフォームのフィールドを事前入力することができます。ユーザーがフォームを開くと、これらのフィールドの値は事前入力されています。アダプティブフォームにデータを事前入力するには、アダプティブフォームの事前入力データ構造に合った形式を使用して、事前入力 XML または JSON としてユーザーデータを作成します。

事前入力データの構造

アダプティブフォームには、連結されたフィールドと連結されていないフィールドが混在している場合があります。連結されたフィールドは、コンテンツファインダータブからドラッグされ、フィールド編集ダイアログに空でないbindRefプロパティ値が含まれるフィールドです。 連結されていないフィールドは、サイドキックのコンポーネントブラウザーから直接ドラッグされ、空のbindRef値を持ちます。

アダプティブフォームの連結されたフィールドと連結されていないフィールドの両方を事前入力できます。事前入力データには afBoundData セクションと afUnBoundData セクションが含まれており、アダプティブフォームの連結されたフィールドと連結されていないフィールドの両方を事前入力できます。afBoundData セクションには連結されたフィールドとパネルの事前入力データが含まれています。このデータは関連するフォームモデルスキーマに準拠している必要があります。

  • XFA フォームテンプレートを使用しているアダプティブフォームの場合は、XFA テンプレートのデータスキーマに準拠している事前入力 XML を使用します。
  • XML スキーマを使用しているアダプティブフォームの場合は、XML スキーマ構造に準拠している事前入力 XML を使用します。
  • JSON スキーマを使用しているアダプティブフォームの場合は、JSON スキーマに準拠している事前入力 JSON を使用します。
  • FDM スキーマを使用しているアダプティブフォームの場合は、FDM スキーマに準拠している事前入力 JSON を使用します。
  • フォームモデルのないアダプティブフォームの場合、連結されたデータはありません。すべてのフィールドは、連結されていないフィールドであり、連結されていないXMLを使用して事前入力されています。

事前入力 XML 構造のサンプル

<?xml version="1.0" encoding="UTF-8"?>
<afData>
  <afBoundData>
     <employeeData>
        .
     </employeeData>
  </afBoundData>

  <afUnboundData>
    <data>
      <textbox>Hello World</textbox>
         .
         .
      <numericbox>12</numericbox>
         . 
         .              
    </data>
  </afUnboundData>
</afData>

事前入力 JSON 構造のサンプル

{
   "afBoundData": {
      "employeeData": { }
   },
   "afUnboundData": {
      "data": {
         "textbox": "Hello World",
         "numericbox": "12"
      }
   }
}

同じ bindref を持つ連結されているフィールド、または同じ名前を持つ連結されていないフィールドの場合、XML タグまたは JSON オブジェクトで指定したデータがすべてのフィールドに入力されます。例えば、フォーム内の2つのフィールドは、事前入力データのtextboxという名前にマップされます。 ランタイム時、最初のテキストボックスに「A」が含まれる場合、この「A」が 2 番目のテキストボックスに自動的に挿入されます。このリンクは、アダプティブフォームフィールドのライブリンクと呼ばれます。

XFAフォームテンプレートを使用したアダプティブフォーム

XFAベースのアダプティブフォームにおける事前入力XMLと送信済みXMLの構造は、次のとおりです。

  • 事前入力 XML 構造:XFA ベースのアダプティブフォームのための事前入力 XML は、XFA フォームテンプレートのデータスキーマに準拠していなければなりません。連結されていないフィールドを事前入力するには、事前入力XML構造を/afData/afBoundDataタグに含めます。

  • 送信済み XML 構造:事前入力 XML が使用されていない場合、送信済み XML の afData wrapper タグには、連結されたフィールドと連結されていないフィールドの両方のデータが含まれます。事前入力 XML が使用された場合、送信済み XML は、事前入力 XML と同じ構造をしています。事前入力 XML が afData のルートタグで開始する場合、出力 XML もまた同じフォーマットとなります。事前入力 XML に afData/afBoundData のラッパーが無く、直接 employeeData のようなスキーマルートタグから開始する場合は、送信済み XML もまた employeeData タグから開始します。

Prefill-Submit-Data-ContentPackage.zip

事前入力データと送信データを含む
FileSampleの取得

XMLスキーマベースのアダプティブフォーム

XML スキーマをベースとするアダプティブフォームの事前入力 XML と送信済み XML の構造は次のとおりです。

  • 事前入力 XML 構造:事前入力 XML は、関連する XML スキーマに準拠していなければなりません。連結されていないフィールドを事前入力するには、事前入力 XML 構造を /afData/afBoundData タグにラップします。
  • 送信済みXML構造:事前入力XMLが使用されない場合、送信されたXMLには、 afData wrapperタグ内の連結されたフィールドと連結されていないフィールドの両方に対するデータが含まれます。事前入力 XML が使用された場合、送信済み XML は、事前入力 XML と同じ構造をしています。事前入力 XML が afData のルートタグで開始する場合、出力 XML もまた同じフォーマットとなります。事前入力 XML に afData/afBoundData のラッパーが無く、直接 employeeData のようなスキーマルートタグから開始する場合は、送信済み XML もまた employeeData タグから開始します。
<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema targetNamespace="https://adobe.com/sample.xsd"
            xmlns="https://adobe.com/sample.xsd"
            xmlns:xs="https://www.w3.org/2001/XMLSchema">
 
    <xs:element name="sample" type="SampleType"/>
         
    <xs:complexType name="SampleType">
        <xs:sequence>
            <xs:element name="noOfProjectsAssigned" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

XML スキーマをモデルとするフィールドの場合、以下の XML のサンプルに示すように、afBoundData タグのデータは事前入力されます。これは、1 つ以上の連結されていないテキストフィールドでアダプティブフォームを事前入力する場合に使用できます。

<?xml version="1.0" encoding="UTF-8"?><afData>
  <afUnboundData>
    <data>
      <textbox>Ignorance is bliss :) </textbox>
    </data>
  </afUnboundData>
  <afBoundData>
    <data>
      <noOfProjectsAssigned>twelve</noOfProjectsAssigned>
    </data>
  </afBoundData>
</afData>
メモ

連結されているパネル(サイドキックまたは「データソース」タブからコンポーネントをドラッグして作成された、空ではない bindRef が含まれているパネル)では、連結されていないフィールドを使用しないことをお勧めします。これらの連結していないフィールドのデーターの損失を招くことがあります。また、フィールド名は、特に連結していないフィールドについては、フォーム間で一意のフィールド名を設定することをお勧めします。

afData および afBoundData ラッパーがない場合の例

<?xml version="1.0" encoding="UTF-8"?><config>
 <assignmentDetails descriptionOfAssignment="Some Science Project" durationOfAssignment="34" financeRelatedProject="1" name="Lisa" numberOfMentees="1"/>
 <assignmentDetails descriptionOfAssignment="Kidding, right?" durationOfAssignment="4" financeRelatedProject="1" name="House" numberOfMentees="3"/>
</config>

JSON スキーマベースのアダプティブフォーム

JSON スキーマをベースとするアダプティブフォームの場合、事前入力 JSON と送信済み JSON の構造は次のようになります。詳しくは、「JSON スキーマを使ったアダプティブフォームの作成」を参照してください。

  • 事前入力 JSON スキーマ:事前入力 JSON は、関連する JSON スキーマに準拠していなければなりません。また、連結されていないフィールドを事前入力する場合は、オプションで、/afData/afBoundDataオブジェクトにまとめることができます。
  • 送信されたJSON構造:事前入力JSONが使用されない場合、送信されたJSONには、afDataのwrapperタグ内の連結されたフィールドと連結されていないフィールドの両方のデータが含まれます。事前入力JSONを使用する場合、送信されたJSONは事前入力JSONと同じ構造を持ちます。 afDataルートオブジェクトを使用して事前入力JSON開始を設定した場合、出力JSONも同じ形式になります。 事前入力JSONにafData/afBoundDataのラッパーがなく、代わりにuserなどのスキーマルートオブジェクトから直接開始が含まれていない場合、送信されたJSONもユーザーオブジェクトと開始します。
{
    "id": "https://some.site.somewhere/entry-schema#",
    "$schema": "https://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "address": {
            "type": "object",
            "properties": { 
    "name": {
     "type": "string"
    },
    "age": {
     "type": "integer"
}}}}}

JSON スキーマモデルを使用するフィールドの場合、以下の JSON のサンプルに示すように、afBoundedData オブジェクトのデータは事前入力されます。これは、1 つ以上の連結されていないテキストフィールドでアダプティブフォームを事前入力する場合に使用できます。afData/afBoundDataラッパーを持つデータの例を以下に示します。

{
  "afData": {
    "afUnboundData": {
      "data": { "textbox": "Ignorance is bliss :) " }
    },
    "afBoundData": {
      "data": { {
   "user": {
    "address": {
     "city": "Noida",
     "country": "India"
}}}}}}}

以下はafData/afBoundDataラッパのない例です。

{
 "user": {
  "address": {
   "city": "Noida",
   "country": "India"
}}}
メモ

連結されているパネル(サイドキックまたは「データソース」タブからコンポーネントをドラッグして作成された、空ではない bindRef が含まれているパネル)では、連結されていないフィールドを使用することは​お勧めしません。連結されていないフィールドで、データ損失が発生する可能性があるためです。特に連結していないフィールドについては、フォーム間で一意のフィールド名を設定することをお勧めします。

フォームモデルのないアダプティブフォーム

フォームモデルのないアダプティブフォームの場合、すべてのフィールドのデータは<afUnboundData> tag<data>タグの下にあります。

また、次のことを控えておいてください:

各種フィールドに送信されたユーザーデータのためのXMLタグは、フィールド名を使用して生成されます。したがって、一意のフィールド名を設定する必要があります。

<?xml version="1.0" encoding="UTF-8"?><afData>
  <afUnboundData>
    <data>
      <radiobutton>2</radiobutton>
      <repeatable_panel_no_form_model>
        <numericbox>12</numericbox>
      </repeatable_panel_no_form_model>
      <repeatable_panel_no_form_model>
        <numericbox>21</numericbox>
      </repeatable_panel_no_form_model>
      <checkbox>2</checkbox>
      <textbox>Nopes</textbox>
    </data>
  </afUnboundData>
  <afBoundData/>
</afData>

Configuration Manager を使用した事前入力サービスの設定

事前入力サービスを有効にするには、AEM Webコンソールの設定で「デフォルトの事前入力サービスの設定」を指定します。 次の手順を使用して、事前入力サービスを設定します。

メモ

事前サービスの設定は、アダプティブフォーム、HTML5 フォーム、HTML5 フォームセットに適用することができます。

  1. URLを使用して​Adobe Experience ManagerWebコンソール設定​を開きます。
    https://<サーバー>:<ポート>/system/console/configMgr

  2. デフォルトの事前入力サービス設定​を検索して開きます。

    prefill_config

  3. データの場所または正規表現を「Data files locations」に入力します。有効なデータファイルの場所の例は次のとおりです。

    • file:///C:/Users/public/Document/Prefill/&ast;
    • http://localhost:8000/somesamplexmlfile.xml
    メモ

    デフォルトでは、すべてのタイプのアダプティブForms(XSD、XDP、JSON、FDM、フォームモデルベースではない)のcrxファイルを介して事前入力が許可されます。 事前入力は JSON ファイルおよび XML ファイルでのみ許可されます。

  4. 事前入力サービスがフォームに対して設定されました。

    メモ

    crx プロトコルは、事前入力済みデータのセキュリティを管理するので、デフォルトで許可されています。汎用的な正規表現を使用して他のプロトコル経由で事前入力すると、脆弱性が発生する可能性があります。データを保護するため、設定では安全性の高い URL を指定してください。

繰り返し可能なパネルの例外的なケース

連結された(フォームスキーマ)フィールドや連結されていないフィールドは通常、同じアダプティブフォームに作成されます。ただし、連結が繰り返し可能な場合は、次のような例外があります。

  • XFA フォームテンプレート、または XSD、JSON、FDM の各スキーマを使用したアダプティブフォームでは、連結されていない繰り返し可能なパネルはサポートされません。
  • 連結された繰り返し可能なパネル内で、連結されていないフィールドを使用しないでください。
メモ

連結されていないフィールドにエンドユーザーが入力したデータ上で、連結されているフィールドと連結されていないフィールドが重複する場合は、これらのフィールドを混在させないようにします。可能な場合は、スキーマまたは XFA フォームテンプレートを変更し、連結されていないフィールドのエントリを追加します。これにより、フィールドが連結されて、そのデータを送信済みデータの他のフィールドのデータと同様に使用できます。

ユーザーデータの事前入力でサポートされるプロトコル

以下のプロトコルを使用し、有効な正規表現で設定した場合、事前入力データフォーマットのユーザーデータをアダプティブフォームに事前入力できます。

crx:// プロトコル

http://localhost:4502/content/forms/af/xml.html?wcmmode=disabled&dataRef=crx:///tmp/fd/af/myassets/sample.xml

特定のノードには、jcr:data と呼ばれるプロパティがあり、データを保持していなければなりません。

The file:// protocol 

http://localhost:4502/content/forms/af/someAF.html?wcmmode=disabled&dataRef=file:///C:/Users/form-user/Downloads/somesamplexml.xml

参照元ファイルは、同じサーバー上になければなりません。

https://プロトコル

http://localhost:4502/content/forms/af/xml.html?wcmmode=disabled&dataRef=http://localhost:8000/somesamplexmlfile.xml

service:// プロトコル

http://localhost:4502/content/forms/af/abc.html?wcmmode=disabled&dataRef=service://[SERVICE_NAME]/[IDENTIFIER]
  • SERVICE_NAME は OSGI 事前入力サービスの名前を参照します。「事前入力サービスの作成と実行」を参照してください。
  • IDENTIFIER は、事前入力データを取得するために OSGI 事前入力サービスが必要とするメタデータを参照します。ログイン済みユーザーの識別子は、使用できるメタデータの一例です。
メモ

認証パラメータの引き渡しはサポートされていません。

slingRequestでのデータ属性の設定

data属性をslingRequestに設定することもできます。data属性は、次のサンプルコードに示すように、XMLまたはJSONを含む文字列です(XMLの場合)。

<%
           String dataXML="<afData>" +
                            "<afUnboundData>" +
                                "<data>" +
                                    "<first_name>"+ "Tyler" + "</first_name>" +
                                    "<last_name>"+ "Durden " + "</last_name>" +
                                    "<gender>"+ "Male" + "</gender>" +
                                    "<location>"+ "Texas" + "</location>" +
                                    "</data>" +
                            "</afUnboundData>" +
                        "</afData>";
        slingRequest.setAttribute("data", dataXML);
%>

すべてのデータが含まれている単純な XML または JSON 文字列を記述して、slingRequest に設定できます。これは、slingRequest data属性を設定するページに含むすべてのコンポーネントのレンダラ― JSP で、簡単にできます。

例えば、特定のタイプのヘッダーを使用して、特定のデザインのページを作成するとします。これを実現するには、独自のheader.jspを書き込み、それをページコンポーネントに含めてdata属性を設定します。

例えば、Facebook、Twitter、LinkedIn などのソーシャルアカウントを使用して、ログイン時にデータを事前入力するとします。この場合、header.jspユーザーアカウントからデータを取得し、データパラメーターを設定するに単純なJSPを含めることができます。

prefill-page component.zip

ページコンポ
ーネントでのFileSample prefill.jspの取得

AEM Forms カスタム事前入力サービス

事前定義されたソースからデータを頻繁に読み取る必要がある場合は、カスタム事前入力サービスを使用できます。事前入力サービスでは、定義済みデータソースからデータを読み取り、事前入力データファイルの内容を、アダプティブフォームのフィールドに事前入力します。事前入力データをアダプティブフォームと永続的に関連付ける場合にも役立ちます。

事前入力サービスの作成と実行

事前入力サービスは OSGi サービスで、OSGi バンドルを使用してパッケージ化します。OSGi バンドルを作成し、アップロードし、AEM Forms バンドルにインストールします。バンドルの作成を開始する前に、以下を行います。

事前入力サービスの作成

ボイラープレートパッケージ(サンプルの事前入力サービスパッケージ)には、AEM Forms 事前入力サービスのサンプル実装が含まれています。ボイラープレートパッケージをコードエディターで開きます。例えば、ボイラープレートプロジェクトを Eclipse で開いて編集します。ボイラープレートパッケージをコードエディターで開いたら、以下の手順でサービスを作成します。

  1. src\main\java\com\adobe\test\Prefill.java ファイルを開いて編集します。

  2. コードで、以下の値を設定します。

    • nodePath: crx-repositoryの場所を指すnode path変数には、データ(事前入力)ファイルのパスが含まれます。例:/content/prefilldata.xml
    • label: labelパラメーターはサービスの表示名を指定します。例:Default Prefill Service
  3. Prefill.javaファイルを保存して閉じます。

  4. ボイラープレートプロジェクト追加のビルドパスへのAEM Forms Client SDKパッケージです。

  5. プロジェクトをコンパイルし、バンドルの .jar を作成します。

事前入力サービスを起動し、使用します

事前入力サービスを起動するには、JAR ファイルを AEM Forms Web Console にアップロードし、サービスをアクティブ化します。サービスはアダプティブフォームエディターに表示されるようになります。事前入力サービスをアダプティブフォームに関連付けるには:

  1. アダプティブフォームをフォームエディターで開き、フォームコンテナのプロパティパネルを開きます。
  2. プロパティコンソールで、AEM Formsコンテナ/基本/事前入力サービス​に移動します。
  3. Default Prefill Service を選択し、「保存」をクリックします。サービスはフォームに関連付けられます。

このページ