Skapa anpassningsbara formulär med JSON-schema creating-adaptive-forms-using-json-schema
Förutsättningar prerequisites
Om du skapar ett anpassat formulär med ett JSON-schema som formulärmodell måste du ha grundläggande kunskaper i JSON-schemat. Du bör läsa igenom följande innehåll före den här artikeln.
Använda ett JSON-schema som formulärmodell using-a-json-schema-as-form-model
AEM Forms har stöd för att skapa ett adaptivt formulär genom att använda ett befintligt JSON-schema som formulärmodell. Detta JSON-schema representerar strukturen i vilken data produceras eller används av det bakomliggande systemet i din organisation. Det JSON-schema som du använder ska vara kompatibelt med v4-specifikationer.
De viktigaste funktionerna i ett JSON-schema är:
- Strukturen för JSON visas som ett träd på fliken Innehållssökning i redigeringsläget för ett anpassat formulär. Du kan dra och lägga till element från JSON-hierarkin i det adaptiva formuläret.
- Du kan fylla i formuläret i förväg med JSON som är kompatibel med det associerade schemat.
- När data skickas skickas skickas de som anges av användaren som JSON som är i linje med det associerade schemat.
Ett JSON-schema består av enkla och komplexa elementtyper. Elementen har attribut som lägger till regler i elementet. När dessa element och attribut dras till ett adaptivt formulär mappas de automatiskt till motsvarande adaptiv formulärkomponent.
Den här mappningen av JSON-element med adaptiva formulärkomponenter är följande:
Vanliga schemaegenskaper common-schema-properties
Det adaptiva formuläret använder information som finns i JSON-schemat för att mappa varje genererat fält. Särskilt gäller följande:
- Egenskapen title fungerar som etikett för de adaptiva formulärkomponenterna.
- Egenskapen description anges som lång beskrivning för en adaptiv formulärkomponent.
- Egenskapen default fungerar som ett initialt värde i ett adaptivt formulärfält.
- Egenskapen maxLength anges som maxlength-attribut för textfältskomponenten.
- Egenskaperna minimum, maximum, exclusiveMinimum och exclusiveMaximum används för Numeric box-komponenter.
- Ytterligare JSON-schemaegenskaper minDate och maxDate anges som stöd för intervall för DatePicker-komponenten.
- Egenskaperna minItems och maxItems används för att begränsa antalet objekt/fält som kan läggas till eller tas bort från en panelkomponent.
- Egenskapen readOnly anger det skrivskyddade attributet för en adaptiv formulärkomponent.
- Den obligatoriska egenskapen anger att det adaptiva formulärfältet är obligatoriskt, medan det för panel (där typen är objekt) finns fält med tomma värden som motsvarar det objektet i de slutliga skickade JSON-data.
- Egenskapen pattern anges som valideringsmönster (reguljärt uttryck) i adaptiv form.
- Tillägget för JSON-schemafilen måste behållas som .schema.json. Till exempel: <filename>.schema.json.
Exempel på JSON-schema sample-json-schema
Här är ett exempel på ett JSON-schema.
{
"$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"
}
}
}
Återanvändbara schemadefinitioner reusable-schema-definitions
Definitionsnycklar används för att identifiera återanvändbara scheman. Återanvändbara schemadefinitioner används för att skapa fragment. Det liknar att identifiera komplexa typer i XSD. Ett exempel på JSON-schema med definitioner ges nedan:
{
"$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" }
}
}
Exemplet ovan definierar en kundpost där varje kund har både en leveransadress och en faktureringsadress. Adressernas struktur är densamma - adresserna har en gatuadress, ort och delstat - så det är en bra idé att inte duplicera adresserna. Det gör det också enkelt att lägga till och ta bort fält för framtida ändringar.
Förkonfigurerar fält i JSON-schemadefinition pre-configuring-fields-in-json-schema-definition
Du kan använda aem:afProperties för att förkonfigurera JSON-schemafältet för mappning till en anpassad adaptiv formulärkomponent. Ett exempel visas nedan:
{
"properties": {
"sizeInMB": {
"type": "integer",
"minimum": 16,
"maximum": 512,
"aem:afProperties" : {
"sling:resourceType" : "/apps/fd/af/components/guideTextBox",
"guideNodeClass" : "guideTextBox"
}
}
},
"required": [ "sizeInMB" ],
"additionalProperties": false
}
Begränsa tillåtna värden för en adaptiv formulärkomponent limit-acceptable-values-for-an-adaptive-form-component
Du kan lägga till följande begränsningar i JSON-schemaelement för att begränsa vilka värden som tillåts för en adaptiv formulärkomponent:
Konstruktioner som inte stöds non-supported-constructs
Adaptiva formulär stöder inte följande JSON-schemakonstruktioner:
- Null-typ
- Unionstyper, t.ex., och
- OneOf, AnyOf, AllOf, och NOT
- Endast homogena arrayer stöds. Objektbegränsningen måste därför vara ett objekt och inte en array.
Vanliga frågor frequently-asked-questions
Varför kan jag inte dra enskilda element i ett delformulär (struktur som genereras från en komplex typ) för repeterbara delformulär (värdena minOcCours och maxOccurs är större än 1)?
I ett upprepningsbart delformulär måste du använda hela delformuläret. Om du bara vill ha selektiva fält använder du hela strukturen och tar bort de oönskade.
Jag har en lång komplex struktur i Content Finder. Hur hittar jag ett specifikt element?
Du har två alternativ:
- Bläddra genom trädstrukturen
- Använd sökrutan för att hitta ett element