# Form Schema ## Ort `config/form_schema.php` ## Struktur ```php [ 'steps' => [ [ 'title' => '...', 'description' => '...', 'fields' => [ [ 'key' => 'feldname', 'label' => 'Label', 'type' => 'text|email|date|select|textarea|checkbox|file|table', 'required' => true|false, 'required_if' => ['field' => 'anderes_feld', 'equals' => 'Wert'], 'options' => [['value' => 'x', 'label' => 'X']], 'rows' => 4, // nur für type=table 'columns' => [ // nur für type=table ['label' => 'Spalte 1', 'type' => 'text'], ['label' => 'Spalte 2', 'type' => 'date'], ], 'accept' => '.pdf,.jpg', 'max_length' => 100, 'max_size' => 10485760, 'extensions' => ['pdf','jpg'], 'mimes' => ['application/pdf','image/jpeg'], ] ] ] ] ] ``` ## Validierungslogik - `required: true` macht Feld immer verpflichtend. - `required_if` macht Feld verpflichtend, wenn Quellfeld exakt `equals` entspricht. - Upload-Pflicht wird gegen vorhandene Upload-Metadaten geprüft. - Für `type: table` gilt ein Feld als leer, wenn in allen Datenzeilen alle Zellen leer sind. ## Table-Felder (CSV-Textblock) - `type: table` rendert eine feste Tabelle mit vordefinierten Spalten (`columns`) und fixer Zeilenanzahl (`rows`). - Es gibt bewusst keine UI, um zusätzliche Zeilen hinzuzufügen. - Der Inhalt wird als einzelner `form_data`-Wert gespeichert (CSV-Textblock mit Headerzeile + festen Datenzeilen). Beispiel-Format im gespeicherten Feldwert: ```text Feuerwehr/Hilfsorganisation,von,bis Organisation A,2026-01-01,2026-02-01 Organisation B,2025-01-01,2025-02-01 ... ``` ## Upload-Verhalten - Original-Dateiname wird serverseitig bereinigt und erhalten. - Speichern in kurzem Random-Unterordner (`rand8`) zur Kollisionsvermeidung. - Metadaten werden im Draft/Submission JSON abgelegt. - Für jedes `type: file` Feld rendert das Frontend zwei Eingabepfade: - Datei auswählen (`name = `) - Foto aufnehmen (`name = __camera`, `accept=image/*`, `capture=environment`) - Backend priorisiert regulären Datei-Upload, verwendet sonst Kamera-Upload. - Upload wird direkt nach Auswahl ausgelöst; es gibt keinen separaten „Jetzt speichern“-Schritt mehr.