Inhaltsverzeichnis

User Defined Fields - Zusatzfelder

Ab Version 3.3 ist es möglich, FH-Complete mit User Defined Fields zu erweitern. Derzeit können Personen und Prestudenten mit Zusatzfeldern erweitert werden. Dadurch können bei Interessenten, Studierenden und Mitarbeitern zusätzliche Felder hinzugefügt werden. Diese können im FAS verwaltet und auch wieder exportiert werden.

Features von UserDefinedFields

Hinzufügen von UserDefinedFields

Um UserDefinedFields hinzuzufügen, muss in der Datenbank in der Tabelle system.tbl_udf definiert werden welche UDF in welcher Tabelle zur Verfügung stehen sollen. Dies wird mit Hilfe eines JSON Schema definiert.

Um Beispielsweise die Schuhgröße erfassen zu können wird in der Tabelle system.tbl_udf folgender Eintrag hinzugefügt:

schema: public
table: tbl_person
jsons:

[{
	"name": "udf_schuhgroesse",
	"description": "udf/schuhgroesseDescription",
	"placeholder": "udf/schuhgroessePlaceholder",
	"title": "udf/schuhgroesseTitle",
	"type": "dropdown", 
	"sort":1,
	"defaultValue":"43",
	"listValues": {
		"enum": [
		 "42","43"
		]
	  },
        "requiredPermissions": ["basis/person"]
}]

Die Bezeichnungen werden mehrsprachig erfasst und daher im Phrasensystem in der Datenbank abgelegt. Dazu muss für die app „core“ die Phrase „udf/schuhgroesseDescription“ und „udf/schuhgroessePlaceholder“ erstellt werden. Dies erfolgt in den Tabellen system.tbl_phrase, system.tbl_phrasentext und system.tbl_app.

Nachdem die Einträge angelegt wurden, werden die Eingabefelder im FAS im Karteireiter Zusatzfelder angezeigt:

Hintergrundinformationen

In der Datenbank existiert die Tabelle system.tbl_udf in dieser wird gespeichert welche Tabellen mit UserDefinedFields erweitert werden können.

system.tbl_udf
  table_schema varchar
  table_name varchar
  udf_schema jsonb

Die Grundstruktur wie das udf_schema JSON aussieht wird in einem eigenen JSON Schema definiert. Dieses wird im Filesystem abgelegt. udfmasterschema.json

In vordefinierten Tabellen wird eine Spalte udf_values hinzugefügt. In dieser Spalte werden die Daten der UserDefinedFields gespeichert.

zB

public.tbl_person
  person_id
  vorname
  nachname
  ....
  udf_values jsonb

Aufbau udfmasterschema.json

{
	"title": "UDF",
	"type": "object",
	"tableswhitelist":{
		"type": "string",
		"enum": ["tbl_person", "tbl_prestudent","tbl_mitarbeiter","tbl_lehrveranstaltung","tbl_lehreinheit"]
	},
	"properties": {
		"name": {
			"type": "string"
		},
		"description": {
			"type": "array",
		},
		"placeholder": {
			"type": "array",
		},
		"title":{
			"type": "array",
		},
		"type": {
			"type": "string",
			"enum": ["checkbox","textfield","textarea","date","dropdown","multipledropdown"]
		},
		"sort":{
			"type": "integer"
		},
		"defaultValue":{
			"type": "string"
		},
		"validation":{
			"type": "object",
			"properties": {
				"required":{
					"type": "boolean"
				},
				"min-length":{
					"type": "integer"
				},
				"max-length":{
					"type": "integer"
				},
				"min-value":{
					"type": "integer"
				},
				"min-value":{
					"type": "integer"
				},
				"regex":{
					"type": "object",
					"properties": {
						"language": "string",
						"expression": "string"
					}
				}
			},
		},
		"listValues":{
			"type": "object",
			"properties": {
				"sql":{
					"type":"string"
				},
				"enum":{
					"type":"array"
				},
			},
		},
	},
	"required": ["type","name"]
}

Aufbau udf_schema in system.tbl_udf

[{
	"name": "udf_schuhgroesse",
	"description": "udf/schuhgroesseDescription",
	"placeholder": "udf/schuhgroessePlaceholder",
	"title": "udf/schuhgroesseTitle",
	"type": "dropdown", 
	"sort":1,
	"defaultValue":"43",
	"validation": {
		"required":true,
		"min-value":10,
		"max-value":100,
		"regex":[{
				"language": "php",
				"expression": "/[1-9]*/"
		},{
				"language": "js",
				"expression": "/[0-9]*/"
		}]
	},
	"listValues": {
		"enum": [
		 "42","43"
		]
	  },
       "requiredPermissions": ["basis/person"]
},
{
	"name": "udf_kleriker",
	"description": "udf/klerikerDescription",
	"placeholder": "udf/klerikerPlaceholder",
	"title": "udf/klerikerTitle",
	"type": "checkbox", 
	"sort":2,
	"defaultValue":false,
        "requiredPermissions": ["basis/person"]
}]

Bei den ListValues können derzeit keine Phrasennamen verwendet werden. Statt enum kann hier auch sql verwendet werden. Dabei wird anstatt einer fixen Liste ein SQL Befehl hinterlegt der die Daten für das Dropdown liefert. Der SQL muss 2 Spalten mit den verpflichtenden Titeln „id“ und „description“ zurückliefern, wobei „id“ der Wert ist, der im UDF gespeichert wird und „description“ der angezeigte Text im UDF.

Aufbau udf_values

Die Spalte udf_values in tbl_person enthält lediglich die Daten des Eingabefeldes:

{
     "udf_schuhgroesse": "44",
     "udf_kleriker": true,
     "udf_arrayvalue": ["1", "2"],
     "udf_nullvalue": null,
     "udf_stringvalue": "string"
}

Beispiele

[{
	"name": "udf_example1",
	"sort": 1,
	"type": "multipledropdown",
	"title": "udf/example1Title",
	"listValues": {
		"enum": [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
	},
	"validation": {
		"regex": [
			{"language": "php", "expression": "/^[0-9]+$/"},
			{"language": "js", "expression": "/[0-9]*/"}
		],
		"required": true,
		"min-value": 40,
		"max-value": 50
	},
	"description": "udf/example1Description",
	"placeholder": "udf/example1Placeholder",
	"defaultValue": 42,
        "requiredPermissions": ["basis/person"]
},
{
	"name": "udf_example2",
	"sort": 2,
	"type": "dropdown",
	"title": "udf/example2Title",
	"listValues": {
		"enum": [[10, 50], [11, 51], {"id": 12, "description": 52}, [13, 53], [14, 54], [15, 55], [16, 56], [17, 57], [18, 58], [19, 59]]
	},
	"validation": {
		"regex": [
			{"language": "php", "expression": "/^[0-9]+$/"},
			{"language": "js", "expression": "/[0-9]*/"}
		],
		"required": false,
		"min-value": 10,
		"max-value": 19
	},
	"description": "udf/example2Description",
	"placeholder": "udf/example2Placeholder",
	"defaultValue": 15,
        "requiredPermissions": ["basis/person"]
},
{
	"name": "udf_example5",
	"sort": 5,
	"type": "dropdown",
	"title": "udf/example5Title",
	"listValues": {
		"sql": "WITH RECURSIVE t(id, description) AS (VALUES (10, 60) UNION ALL SELECT id + 1, description + 1 FROM t WHERE id < 20) SELECT id, description FROM t"
	},
	"validation": {
		"regex": [
			{"language": "php", "expression": "/^[0-9]+$/"},
			{"language": "js", "expression": "/[0-9]*/"}
		],
		"required": false,
		"min-value": 10,
		"max-value": 19
	},
	"description": "udf/example5Description",
	"placeholder": "udf/example5Placeholder",
	"defaultValue": 12,
        "requiredPermissions": ["basis/person"]
},
{
	"name": "udf_example3",
	"sort": 3,
	"type": "textarea",
	"title": "udf/example3Title",
	"validation": {
		"regex": [
			{"language": "php", "expression": "/^[a-zA-Z0-9]+$/"},
			{"language": "js", "expression": "/^[a-zA-Z0-9]+$/"}
		],
		"required": true,
		"min-length": 2,
		"max-length": 20
	},
	"description": "udf/example3Description",
	"placeholder": "udf/example3Placeholder",
	"defaultValue": "Ex3",
        "requiredPermissions": ["basis/person"]
},
{
	"name": "udf_example4",
	"sort": 4,
	"type": "textfield",
	"title": "udf/example4Title",
	"validation": {
		"regex": [
			{"language": "php", "expression": "/^[0-9]+$/"},
			{"language": "js", "expression": "/[0-9]*/"}
		],
		"required": false,
		"min-value": 1,
		"max-value": 99,
		"min-length": 1,
		"max-length": 2
	},
	"description": "udf/example4Description",
	"placeholder": "udf/example4Placeholder",
	"defaultValue": 1,
        "requiredPermissions": ["basis/person"]
},
{
	"name": "udf_example6",
	"sort": 6,
	"type": "checkbox",
	"title": "udf/example6Title",
	"validation": {
		"required": true
	},
	"description": "udf/example6Description",
	"defaultValue": false,
        "requiredPermissions": ["basis/person"]
}]