使用JSON模式创建自适应表单 creating-adaptive-forms-using-json-schema
前提条件 prerequisites
使用JSON模式作为表单模型来创作自适应表单,需要对JSON模式有基本的了解。 建议在本文之前阅读以下内容。
使用JSON模式作为表单模型 using-a-json-schema-as-form-model
AEM Forms支持使用现有JSON模式作为表单模型来创建自适应表单。 此JSON模式表示组织内的后端系统在其中生成或使用数据的结构。 您使用的JSON架构应与 v4规范.
使用JSON架构的主要功能包括:
- 在自适应表单的创作模式下,JSON的结构在内容查找器选项卡中显示为树。 您可以将元素从JSON层次结构拖动并添加到自适应表单。
- 您可以使用与关联架构兼容的JSON预填充表单。
- 提交时,用户输入的数据将以JSON形式提交,并与关联的架构保持一致。
JSON模式由简单和复杂的元素类型组成。 元素具有可向元素添加规则的属性。 将这些元素和属性拖动到自适应表单上后,会自动将它们映射到相应的自适应表单组件。
JSON元素与自适应表单组件的映射如下所示:
常见架构属性 common-schema-properties
自适应表单使用JSON模式中可用的信息来映射每个生成的字段。 特别是:
- 标题属性用作自适应表单组件的标签。
- 描述属性设置为自适应表单组件的长描述。
- 默认属性用作自适应表单字段的初始值。
- maxLength属性设置为文本字段组件的maxlength属性。
- “数值”框组件使用最小、最大、exclusiveMinimum和exclusiveMaximum属性。
- 为了支持DatePicker组件的范围,还提供了其他JSON架构属性minDate和maxDate。
- minItems和maxItems属性用于限制可从面板组件添加或删除的项目/字段数。
- readOnly属性可设置自适应表单组件的只读属性。
- 必需属性将自适应表单字段标记为必填字段,而对于面板(其中类型是对象),最终提交的JSON数据具有对应于该对象的空值的字段。
- 模式属性设置为自适应表单中的验证模式(正则表达式)。
- JSON架构文件的扩展名必须保留为.schema.json。 例如, <filename>.schema.json.
JSON架构示例 sample-json-schema
以下是JSON模式的示例。
{
"$schema": "https://json-schema.org/draft-04/schema#",
"definitions": {
"employee": {
"type": "object",
"properties": {
"userName": {
"type": "string"
},
"dateOfBirth": {
"type": "string",
"format": "date"
},
"email": {
"type": "string",
"format": "email"
},
"language": {
"type": "string"
},
"personalDetails": {
"$ref": "#/definitions/personalDetails"
},
"projectDetails": {
"$ref": "#/definitions/projectDetails"
}
},
"required": [
"userName",
"dateOfBirth",
"language"
]
},
"personalDetails": {
"type": "object",
"properties": {
"GeneralDetails": {
"$ref": "#/definitions/GeneralDetails"
},
"Family": {
"$ref": "#/definitions/Family"
},
"Income": {
"$ref": "#/definitions/Income"
}
}
},
"projectDetails": {
"type": "array",
"items": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
},
"projects": {
"$ref": "#/definitions/projects"
}
}
},
"minItems": 1,
"maxItems": 4
},
"projects": {
"type": "array",
"items": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
},
"projectsAdditional": {
"$ref": "#/definitions/projectsAdditional"
}
}
},
"minItems": 1,
"maxItems": 4
},
"projectsAdditional": {
"type": "array",
"items": {
"properties": {
"Additional_name": {
"type": "string"
},
"Additional_areacode": {
"type": "number"
}
}
},
"minItems": 1,
"maxItems": 4
},
"GeneralDetails": {
"type": "object",
"properties": {
"age": {
"type": "number"
},
"married": {
"type": "boolean"
},
"phone": {
"type": "number",
"aem:afProperties": {
"sling:resourceType": "/libs/fd/af/components/guidetelephone",
"guideNodeClass": "guideTelephone"
}
},
"address": {
"type": "string"
}
}
},
"Family": {
"type": "object",
"properties": {
"spouse": {
"$ref": "#/definitions/spouse"
},
"kids": {
"$ref": "#/definitions/kids"
}
}
},
"Income": {
"type": "object",
"properties": {
"monthly": {
"type": "number"
},
"yearly": {
"type": "number"
}
}
},
"spouse": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"Income": {
"$ref": "#/definitions/Income"
}
}
},
"kids": {
"type": "array",
"items": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
}
}
},
"minItems": 1,
"maxItems": 4
}
},
"type": "object",
"properties": {
"employee": {
"$ref": "#/definitions/employee"
}
}
}
可重用架构定义 reusable-schema-definitions
定义键用于标识可重用的架构。 可重用架构定义用于创建片段。 它类似于在XSD中标识复杂类型。 下面提供了一个具有定义的JSON模式示例:
{
"$schema": "https://json-schema.org/draft-04/schema#",
"definitions": {
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" }
},
"required": ["street_address", "city", "state"]
}
},
"type": "object",
"properties": {
"billing_address": { "$ref": "#/definitions/address" },
"shipping_address": { "$ref": "#/definitions/address" }
}
}
上例定义了客户记录,其中每个客户都同时具有送货地址和帐单地址。 两个地址的结构相同 — 地址具有街道地址、城市地址和州地址 — 因此最好不要重复这些地址。 此外,还可以轻松添加和删除字段,以便将来进行任何更改。
在JSON架构定义中预配置字段 pre-configuring-fields-in-json-schema-definition
您可以使用 aem:afProperties 属性来预配置要映射到自定义自适应表单组件的JSON架构字段。 下面列出了一个示例:
{
"properties": {
"sizeInMB": {
"type": "integer",
"minimum": 16,
"maximum": 512,
"aem:afProperties" : {
"sling:resourceType" : "/apps/fd/af/components/guideTextBox",
"guideNodeClass" : "guideTextBox"
}
}
},
"required": [ "sizeInMB" ],
"additionalProperties": false
}
限制自适应表单组件的可接受值 limit-acceptable-values-for-an-adaptive-form-component
您可以向JSON架构元素添加以下限制,以限制自适应表单组件可接受的值:
不支持的构造 non-supported-constructs
自适应表单不支持以下JSON模式构建:
- Null类型
- 和等并集类型
- OneOf、AnyOf、AllOf和NOT
- 仅支持同构阵列。 因此,项目约束必须是对象而不是数组。
常见问题 frequently-asked-questions
为什么我无法为可重复的子表单(minOccours或maxOccurs值大于1)拖动子表单的单个元素(从任何复杂类型生成的结构)?
在可重复的子表单中,您必须使用完整的子表单。 如果只希望选择字段,请使用整个结构并删除不需要的字段。
我在内容查找器中有一个很长的复杂结构。 如何查找特定元素?
您有两个选项:
- 滚动浏览树结构
- 使用“搜索”框查找元素
recommendation-more-help
a6ebf046-2b8b-4543-bd46-42a0d77792da