La creación de un formulario adaptable con un Esquema JSON como modelo de formulario requiere una comprensión básica del Esquema JSON. Se recomienda leer el siguiente contenido antes de este artículo.
AEM Forms admite la creación de un formulario adaptable utilizando un Esquema JSON existente como modelo de formulario. Este Esquema JSON representa la estructura en la que el sistema back-end de su organización produce o consume datos. El Esquema JSON que utilice debe cumplir con especificaciones v4.
Las características clave del uso de un Esquema JSON son:
Un Esquema JSON consta de tipos de elementos simples y complejos. Los elementos tienen atributos que agregan reglas al elemento. Cuando estos elementos y atributos se arrastran a un formulario adaptable, se asignan automáticamente al componente de formulario adaptable correspondiente.
Esta asignación de elementos JSON con componentes de formulario adaptables es la siguiente:
Elemento, propiedades o atributos JSON | Componente de formulario adaptable |
---|---|
Propiedades de cadena con restricción enum y enumNames. Sintaxis,
|
Componente desplegable:
|
Propiedad de cadena con restricción de formato. Por ejemplo, correo electrónico y fecha. Sintaxis,
|
|
{ "type" : "string", } |
Campo de texto |
number, propiedad |
Campo numérico con subtipo definido como flotante |
integer, propiedad |
Campo numérico con subtipo definido como entero |
propiedad booleana |
Cambiar |
propiedad object |
Panel |
array, propiedad | Panel repetible con mínimo y máximo igual a minItems y maxItems respectivamente. Solo se admiten matrices homogéneas. Por lo tanto, la restricción items debe ser un objeto y no una matriz. |
El formulario adaptable utiliza la información disponible en el Esquema JSON para asignar cada campo generado. En particular:
Este es un ejemplo de un Esquema 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"
}
}
}
Las claves de definición se utilizan para identificar esquemas reutilizables. Las definiciones de esquema reutilizables se utilizan para crear fragmentos. Es similar a identificar tipos complejos en XSD. A continuación se muestra un Esquema JSON de muestra con definiciones:
{
"$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" }
}
}
El ejemplo anterior define un registro de cliente, donde cada cliente tiene una dirección de envío y una dirección de facturación. La estructura de ambas direcciones es la misma: las direcciones tienen una dirección, ciudad y estado— así que es una buena idea no duplicado las direcciones. También facilita la adición y eliminación de campos para cualquier cambio futuro.
Puede utilizar la propiedad aem:afProperties para preconfigurar el campo de Esquema JSON para asignarlo a un componente de formulario adaptable personalizado. A continuación se muestra un ejemplo:
{
"properties": {
"sizeInMB": {
"type": "integer",
"minimum": 16,
"maximum": 512,
"aem:afProperties" : {
"sling:resourceType" : "/apps/fd/af/components/guideTextBox",
"guideNodeClass" : "guideTextBox"
}
}
},
"required": [ "sizeInMB" ],
"additionalProperties": false
}
Puede agregar las siguientes restricciones a los elementos de Esquema JSON para limitar los valores aceptables para un componente de formulario adaptable:
Esquema, propiedad |
Tipo de datos |
Descripción |
Componente |
|
Cadena |
Especifica el límite superior de los valores numéricos y las fechas. De forma predeterminada, se incluye el valor máximo. |
|
|
Cadena |
Especifica el límite inferior de los valores numéricos y las fechas. De forma predeterminada, se incluye el valor mínimo. |
|
|
Booleano |
Si es true, el valor numérico o la fecha especificados en el componente del formulario deben ser menores que el valor numérico o la fecha especificados para la propiedad máxima. Si es false, el valor numérico o la fecha especificados en el componente del formulario debe ser menor o igual que el valor numérico o la fecha especificados para la propiedad máxima. |
|
|
Booleano |
Si es true, el valor numérico o la fecha especificados en el componente del formulario deben ser buenos que el valor numérico o la fecha especificados para la propiedad mínima. Si es false, el valor numérico o la fecha especificados en el componente del formulario deben ser buenos o iguales al valor numérico o la fecha especificados para la propiedad mínima. |
|
|
Cadena |
Especifica el número mínimo de caracteres permitidos en un componente. La longitud mínima debe ser igual o buena a cero. |
|
maxLength |
Cadena | Especifica el número máximo de caracteres permitidos en un componente. La longitud máxima debe ser igual o buena a cero. |
|
|
Cadena |
Especifica la secuencia de los caracteres. Un componente acepta los caracteres si éstos se ajustan al patrón especificado. La propiedad pattern se asigna al patrón de validación del componente de formulario adaptable correspondiente. |
|
maxItems | Cadena | Especifica el número máximo de elementos de una matriz. Los elementos máximos deben ser iguales o buenos a cero. | |
minItems | Cadena | Especifica el número mínimo de elementos de una matriz. Los elementos mínimos deben ser iguales o buenos a cero. |
Los formularios adaptables no admiten las siguientes construcciones de Esquema JSON:
¿Por qué no se pueden arrastrar elementos individuales de un subformulario (estructura generada a partir de cualquier tipo complejo) para subformularios repetibles (los valores minOccours o maxoccur son buenos a partir de 1)?
En un subformulario repetible, debe utilizar el subformulario completo. Si solo desea campos selectivos, utilice toda la estructura y elimine los no deseados.
Tengo una estructura larga y compleja en Content Finder. ¿Cómo puedo encontrar un elemento específico?
Tiene dos opciones: