FORM_SCHEMA.md 2.3 KB

Form Schema

Ort

config/form_schema.php

Struktur

[
  '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:

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 = <field_key>)
    • Foto aufnehmen (name = <field_key>__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.