# Benutzerdefinierte Felder (V1) Kurzreferenz Letzte Aktualisierung: 2026-03-06 ## Ziel Tenant-spezifische Zusatzfelder für User: - Definitionen und Optionen werden pro Tenant gepflegt. - Werte werden pro User gespeichert. - Address-Book-Filter nutzen dynamische Query-Parameter. ## Berechtigungen - `custom_fields.manage` - Definitionen/Optionen im Tenant-Tab pflegen. - `custom_fields.edit_values` - Werte im User-Tab pflegen. ## Tabellen - `tenant_custom_field_definitions` - Felddefinition pro Tenant (Label, Typ, aktiv, filterbar, `field_key` intern). - `tenant_custom_field_options` - Optionen für `select`/`multiselect` je Definition. - `user_custom_field_values` - Gespeicherter Wert pro `user_id + definition_id` (unique). - `user_custom_field_value_options` - N:M-Optionen für Multiselect-Werte. ## Typen und Verhalten - `text`, `textarea` - Eingabe am User möglich. - Nicht als Address-Book-Filter zugelassen. - `select`, `multiselect`, `boolean`, `date` - Eingabe am User möglich. - Optional als Address-Book-Filter (wenn `is_filterable=1`). ## Wichtige Regeln - `field_key` - Wird serverseitig aus Label erzeugt und tenant-weit eindeutig gehalten. - Kein manuelles UI-Feld. - User-Werte sind in V1 optional (keine Pflichtvalidierung). - Bei Tenant-Wechsel am User werden Werte außerhalb der aktuellen User-Tenants bereinigt. ## Query-Parameter im Address Book - `cf_` - scalar/select/boolean - `cfm_` - multiselect (CSV mit Option-IDs) - `cfd__from` - `cfd__to` - date-range Unbekannte/manipulierte Parameter werden ignoriert. ## Relevante Pfade - Tenant-Tab Formular: - `/pages/admin/tenants/_form.phtml` - Tenant Actions: - `/pages/admin/tenants/custom-field-create($id).php` - `/pages/admin/tenants/custom-field-update($id).php` - `/pages/admin/tenants/custom-field-delete($id).php` - User-Werte: - `/lib/Service/CustomField/UserCustomFieldValueService.php` - `/lib/Repository/CustomField/*` - Address-Book-Filter: - `/pages/address-book/index().php` - `/pages/address-book/index(default).phtml` ## Troubleshooting (kurz) - Multiselect speichert nichts: - Feldname ohne doppeltes `[]` prüfen. - Optionen sind leer: - Label-Key für MultiSelect auf `label`/`description` prüfen. - Filterbar ist deaktiviert: - Typ ist nicht in `select|multiselect|boolean|date`.