Adobe 建议使用现代、可扩展的数据捕获核心组件,以创建新的自适应表单或将自适应表单添加到 AEM Sites 页面。这些组件代表有关创建自适应表单的重大改进,确保实现令人印象深刻的用户体验。本文介绍了使用基础组件创作自适应表单的旧方法。
版本 | 文章链接 |
---|---|
AEM 6.5 | 单击此处 |
AEM as a Cloud Service | 本文 |
您可以使用现有数据预填自适应表单的字段。 当用户打开表单时,这些字段的值会预先填充。 要在自适应表单中预填充数据,请按照预填充自适应Forms数据结构所遵循的格式,将用户数据作为预填充XML/JSON提供。
自适应表单可以包含绑定字段和未绑定字段的组合。 绑定字段是从内容查找器选项卡拖动并包含非空的字段 bindRef
字段编辑对话框中的属性值。 未绑定的字段直接从Sidekick的组件浏览器中拖动,并且为空 bindRef
值。
您可以预填自适应表单的绑定和未绑定字段。 预填充数据包含afBoundData和afUnBoundData部分,用于预填充自适应表单的绑定和未绑定字段。 此 afBoundData
部分包含绑定字段和面板的预填充数据。 此数据必须与关联的表单模型架构兼容:
<?xml version="1.0" encoding="UTF-8"?>
<afData>
<afBoundData>
<employeeData>
.
</employeeData>
</afBoundData>
<afUnboundData>
<data>
<textbox>Hello World</textbox>
.
.
<numericbox>12</numericbox>
.
.
</data>
</afUnboundData>
</afData>
{
"afBoundData": {
"employeeData": { }
},
"afUnboundData": {
"data": {
"textbox": "Hello World",
"numericbox": "12"
}
}
}
对于同名的绑定字段或未绑定字段,所有字段中都会填充在XML标记或JSON对象中指定的数据。 例如,表单中的两个字段映射到名称 textbox
在预填充数据中。 在运行时,如果第一个文本框字段包含“A”,则“A”会自动填充到第二个文本框中。 此链接称为自适应表单字段的实时链接。
基于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和提交的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>
建议不要在绑定面板(非空的面板)中使用未绑定字段 bindRef
通过从“Sidekick”或“数据源”选项卡拖动组件而创建的)。 它可能会导致这些未绑定字段的数据丢失。 此外,建议整个表单中的字段名称是唯一的,特别是对于未绑定的字段。
<?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和提交的JSON的结构描述如下。 有关更多信息,请参阅 使用JSON架构创建自适应Forms.
{
"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"
}
}
}
在绑定面板(具有非空bindRef的面板,这些面板是通过从“Sidekick”或“数据源”选项卡拖动组件创建的)中使用未绑定字段是 非 建议这样做,因为它可能会导致未绑定字段的数据丢失。 建议在表单中保留唯一的字段名称,尤其是未绑定的字段。
对于无表单模型的自适应Forms,所有字段的数据都在 <data>
标记 <afUnboundData> tag
.
此外,请注意以下事项:
为各个字段提交的用户数据的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实例。
通常,绑定(表单架构)和未绑定字段是在同一自适应表单中创作的,但如果绑定是可重复的,则以下是一些例外情况:
根据经验,如果绑定字段和未绑定字段在用户填充的数据中相交,请勿将其混合使用。 如果可能,您应该修改架构或XFA表单模板,并为未绑定的字段添加一个条目,这样该字段也会绑定,并且其数据就像提交数据中的其他字段一样可用。
配置了有效的正则表达式后,可通过以下协议使用预填充数据格式的用户数据预填充自适应Forms:
http
https://`servername`/content/forms/af/xml.html?wcmmode=disabled&dataRef=crx:///tmp/fd/af/myassets/sample.xml
指定的节点必须具有名为的属性 jcr:data
保存数据。
https://`servername`/content/forms/af/someAF.html?wcmmode=disabled&dataRef=file:///C:/Users/form-user/Downloads/somesamplexml.xml
引用的文件必须位于同一服务器上。
https://`servername`/content/forms/af/xml.html?wcmmode=disabled&dataRef=https://servername/somesamplexmlfile.xml
https://`servername`/content/forms/af/abc.html?wcmmode=disabled&dataRef=service://[SERVICE_NAME]/[IDENTIFIER]
不支持传递身份验证参数。
您还可以设置 data
中的属性 slingRequest
,其中 data
attribute是一个包含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等社交帐户登录时预填充数据。 在这种情况下,可以在中包含一个简单的JSP header.jsp
,用于从用户帐户中提取数据并设置数据参数。
预填充页面component.zip
获取文件
页面组件中的prefill.jsp示例
您可以对这些方案使用自定义预填充服务,在这些方案中,您会不断从预定义的源中读取数据。 预填充服务从定义的数据源中读取数据,并使用预填充数据文件的内容预填充自适应表单的字段。 它还有助于您将预填数据与自适应表单永久关联。
预填充服务是一种OSGi服务,通过OSGi捆绑包进行打包。 您可以创建OSGi捆绑包,并将其上传和安装到 AEM Forms 捆绑。 开始创建捆绑包之前:
下载样板包
将数据(预填充数据)文件放入crx存储库中。 可以将文件放置在crx-repository的\contents文件夹中的任意位置。
样例预填充服务包(样例预填充服务包)包含实现样例 AEM Forms 预填充服务。 在代码编辑器中打开样板包。 例如,在Eclipse中打开样板项目进行编辑。 在代码编辑器中打开样板包后,请执行以下步骤,以创建该服务。
打开src\main\java\com\adobe\test\Prefill.java文件进行编辑。
在代码中,将值设置为:
nodePath:
指向crx存储库位置的节点路径变量包含数据(预填充)文件的路径。 例如, /content/prefilldata.xmllabel:
label参数指定服务的显示名称。 例如,默认预填充服务保存并关闭 Prefill.java
文件。
添加 AEM Forms Client SDK
包到样板项目的生成路径。
编译项目并为包创建.jar。
要启动预填充服务,请将JAR文件上传到 AEM Forms Web控制台,并激活该服务。 现在,该服务开始出现在自适应Forms编辑器中。 要将预填充服务与自适应表单关联,请执行以下操作: