Dies ist eine alte Version des Dokuments!
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 Mitarbietern zusätzliche Felder hinzugefügt werden. Diese können im FAS verwaltet und auch wieder exportiert werden.
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" ] } }
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 diese im FAS im Karteireiter Zusatzfelder angezeigt:
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
{ "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"] }
[{ "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" ] } }, { "name": "udf_kleriker", "description": "udf/klerikerDescription", "placeholder": "udf/klerikerPlaceholder", "title": "udf/klerikerTitle", "type": "checkbox", "sort":2, "defaultValue":false }]
Bei den ListValues ist noch nicht geklärt ob hier auch Phrasennamen verwendet werden sollen oder ob hier direkt der Text verwendet wird. 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.
Durch die Angabe eines Phrasennamens anstatt der Bezeichnung können diese einfach über das Phrasensystem übersetzt werden. Nachteil an dieser Variante ist, dass die Anlage des UDF erschwert wird da hier zuerst eine entsprechende Phrase erstellt werden muss. Hier müsste eine Möglichkeit gefunden werden damit die Phrase „on the fly“ erstellt wird.
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" }
[{ "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 }, { "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 }, { "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 }, { "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" }, { "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 }, { "name": "udf_example6", "sort": 6, "type": "checkbox", "title": "udf/example6Title", "validation": { "required": true }, "description": "udf/example6Description", "defaultValue": false }]