预填充JSON结构示例

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

对于同名的绑定字段或未绑定字段,所有字段中都会填充在XML标记或JSON对象中指定的数据。 例如,表单中的两个字段映射到预填充数据中的名称textbox。 在运行时,如果第一个文本框字段包含“A”,则“A”会自动填充到第二个文本框中。 此链接称为自适应表单字段的实时链接。

使用XFA表单模板的自适应表单

基于XFA的自适应Forms的预填充XML和提交的XML的结构如下:

  • 预填充XML结构:基于XFA的自适应表单的预填充XML必须与XFA表单模板的数据架构兼容。 要预填充未绑定的字段,请将预填充XML结构包装到/afData/afBoundData标记中。

  • 提交的XML结构:当不使用预填充XML时,提交的XML包含afData包装器标记中绑定和未绑定字段的数据。 如果使用预填充XML,则提交的XML具有与预填充XML相同的结构。 如果预填充XML以afData根标记开头,则输出XML也具有相同的格式。 如果预填充XML没有afData/afBoundData包装器,而是直接从架构根标记(如employeeData)开始,则提交的XML也以employeeData标记开始。

Prefill-Submit-Data-ContentPackage.zip

获取文件
包含预填充数据和已提交数据的示例

基于XML架构的自适应Forms 

基于XML架构的自适应Forms的预填充XML和提交的XML的结构如下:

  • 预填充XML结构:预填充XML必须符合关联的XML架构。 要预填充未绑定字段,请将预填充XML结构包装到/afData/afBoundData标记中。
  • 提交的XML结构:如果未使用预填充XML,则提交的XML包含afData包装器标记中绑定和未绑定字段的数据。 如果使用预填充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架构的字段,数据将预填充到afBoundData标记中,如下面的示例XML所示。 它可用于使用一个或多个未绑定的文本字段预填自适应表单。

<?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>
NOTE
建议不要在绑定面板(通过从Sidekick或数据源选项卡拖动组件而创建的具有非空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架构的自适应Forms

对于基于JSON模式的自适应Forms,预填充JSON和提交的JSON的结构描述如下。 有关详细信息,请参阅使用JSON架构创建自适应Forms

  • 预填充JSON结构:预填充JSON必须与关联的JSON架构兼容。 或者,如果您还希望预填充未绑定字段,也可以将其包装到/afData/afBoundData对象中。
  • 提交的JSON结构:如果未使用预填充JSON,则提交的JSON包含afData包装器标记中绑定和未绑定字段的数据。 如果使用预填充JSON,则提交的JSON具有与预填充JSON相同的结构。 如果预填充JSON以afData根对象开头,则输出JSON具有相同的格式。 如果预填充JSON没有afData/afBoundData包装器,而是直接从架构根对象(如用户)开始,则提交的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架构模型的字段,数据预填充到afBoundData对象中,如下面的示例JSON所示。 它可用于使用一个或多个未绑定的文本字段预填自适应表单。 以下是使用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"
    }
  }
}
NOTE
在绑定面板(通过从Sidekick或数据源选项卡拖动组件而创建的具有非空bindRef的面板)中使用未绑定字段,是​ ​推荐的,因为它可能会导致未绑定字段的数据丢失。 建议在表单中保留唯一的字段名称,尤其是未绑定的字段。

无表单模型的自适应表单

对于没有表单模型的自适应Forms,所有字段的数据都在<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>

配置预填充服务

使用​ 默认预填充服务配置 ​的alloweddataFileLocations属性设置数据文件的位置或数据文件位置的正则表达式。

以下JSON文件显示了一个示例:

  {
  "alloweddataFileLocations": "`file:///C:/Users/public/Document/Prefill/.*`"
  }

要设置配置的值,请使用AEM SDK生成OSGi配置将配置部署到您的Cloud Service实例。

NOTE
  • 默认情况下,所有类型的自适应Forms(XSD、XDP、JSON、FDM,且不基于表单模型)都允许通过crx文件预填充。 仅允许对JSON和XML文件使用预填充。
  • crx协议负责预填充的数据安全性,因此默认情况下允许使用。 使用通用正则表达式通过其他协议进行预填充可能会导致漏洞。 在配置中,指定用于保护数据的安全URL配置。

可重复面板的奇特案例

通常,绑定(表单架构)和未绑定字段是在同一自适应表单中创作的,但如果绑定是可重复的,则以下是一些例外情况:

  • 使用XFA表单模板、XSD、JSON架构或FDM架构的自适应Forms不支持未绑定的可重复面板。
  • 请勿在绑定可重复面板中使用未绑定字段。
NOTE
根据经验,如果绑定字段和未绑定字段在用户填充的数据中相交,请勿将其混合使用。 如果可能,您应该修改架构或XFA表单模板,并为未绑定的字段添加一个条目,这样该字段也会绑定,并且其数据就像提交数据中的其他字段一样可用。

支持预填充用户数据的协议

配置了有效的正则表达式后,可通过以下协议使用预填充数据格式的用户数据预填充自适应Forms:

crx://协议

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

指定的节点必须具有名为jcr:data的属性并保存数据。

file://协议 

https://`servername`/content/forms/af/someAF.html?wcmmode=disabled&dataRef=file:///C:/Users/form-user/Downloads/somesamplexml.xml

引用的文件必须位于同一服务器上。

https://协议

https://`servername`/content/forms/af/xml.html?wcmmode=disabled&dataRef=https://servername/somesamplexmlfile.xml

service://协议

https://`servername`/content/forms/af/abc.html?wcmmode=disabled&dataRef=service://[SERVICE_NAME]/[IDENTIFIER]
  • SERVICE_NAME是指OSGI预填充服务的名称。 请参阅创建并运行预填充服务
  • 标识符是指OSGI预填充服务获取预填充数据所需的任何元数据。 登录用户的标识符是可以使用的元数据的示例。
NOTE
不支持传递身份验证参数。

在slingRequest中设置数据属性

您还可以在slingRequest中设置data属性,其中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中进行设置。 可以在任何组件的渲染器JSP中轻松完成此操作,您想要将这些组件包含在可设置slingRequest数据属性的页面中。

例如,您希望为具有特定标题类型的页面使用特定设计。 要实现此目的,您可以编写自己的header.jsp,将其包含在页面组件中并设置data属性。

另一个很好的示例是用例,您想要在通过Facebook、Twitter或LinkedIn等社交帐户登录时预填充数据。 在这种情况下,您可以在header.jsp中包含一个简单的JSP,它从用户帐户中获取数据并设置数据参数。

预填充页面component.zip

获取文件
页面组件中的prefill.jsp示例