Felder und Validierung
Definiere Felder einmal, und Ikiform validiert jede Einsendung auf dem Server, mit klaren Meldungen und typisierten Werten.
Felder sind optional. Ein Formular ohne Felder akzeptiert alle Daten, die dein Formular sendet. Sobald du Felder veröffentlichst, validiert Ikiform jede Einsendung auf dem Server dagegen, lehnt fehlerhafte Daten mit klaren Meldungen ab und speichert saubere, typisierte Werte.
Felder definieren
Öffne ein Formular im Dashboard und gehe zu Fields. Füge Felder im visuellen Editor hinzu oder bearbeite die JSON-Definition direkt. Die id jedes Felds ist der Input-name, den dein Formular senden muss.
{
"version": 1,
"title": "Contact",
"fields": [
{ "id": "name", "type": "text", "label": "Name", "required": true, "validation": { "max_length": 120 } },
{ "id": "email", "type": "email", "label": "Email", "required": true },
{
"id": "topic",
"type": "select",
"label": "Topic",
"options": [
{ "value": "sales", "label": "Sales" },
{ "value": "support", "label": "Support" }
]
},
{ "id": "message", "type": "textarea", "label": "Message", "validation": { "min_length": 10 } }
],
"settings": { "submit_label": "Send", "success_message": "Thanks, we'll reply within a day." }
}Die Definition
| Schlüssel | Pflicht | Regeln |
|---|---|---|
version | Ja | Immer 1 |
title | Ja | 1 bis 200 Zeichen |
description | Nein | Bis zu 2.000 Zeichen |
fields | Ja | 1 bis 100 Felder mit eindeutigen IDs, insgesamt höchstens 2.000 Optionen |
settings.submit_label | Nein | 1 bis 100 Zeichen, genutzt von Renderern wie der shadcn/ui-Komponente |
settings.success_message | Nein | 1 bis 1.000 Zeichen |
settings.redirect_url | Nein | Eine http:- oder https:-URL mit bis zu 2.048 Zeichen |
$schema | Nein | Beliebiger String mit bis zu 200 Zeichen, wird ignoriert |
Unbekannte Schlüssel werden abgelehnt, auf oberster Ebene und bei jedem Feld, sodass ein Tippfehler wie requried beim Speichern als Fehler erscheint.
Schlüssel jedes Felds
| Schlüssel | Pflicht | Regeln |
|---|---|---|
id | Ja | snake_case in Kleinbuchstaben, beginnt mit einem Buchstaben, höchstens 64 Zeichen, zum Beispiel team_size |
type | Ja | Einer der 12 Typen unten |
label | Ja | 1 bis 200 Zeichen. Wird in Fehlerseiten und Benachrichtigungs-E-Mails verwendet |
required | Nein | true macht einen leeren Wert zum Fehler |
placeholder | Nein | Bis zu 200 Zeichen |
help_text | Nein | Bis zu 1.000 Zeichen |
Playground
201 Created: Der Server würde das speichern
{
"ok": true,
"id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3"
}Führt den Validator von Ikiform in deinem Browser aus. Felder, die mit einem Unterstrich beginnen, sind reserviert und werden vor der Validierung verworfen, wie auf dem Server.
Feldtypen
| Typ | Gespeichert als | Akzeptiert |
|---|---|---|
text | string | Beliebiger einzeiliger Text |
textarea | string | Mehrzeiliger Text |
email | string, Domain in Kleinbuchstaben | Eine E-Mail-Adresse |
number | number | Zahlen oder numerische Strings aus HTML-Formularen |
select | string | Ein aufgelisteter Optionswert |
radio | string | Ein aufgelisteter Optionswert |
multi_select | string[] | Aufgelistete Optionswerte, Duplikate entfernt |
checkbox | boolean | on, true, 1, yes oder nichts |
date | string, YYYY-MM-DD | Ein echtes Kalenderdatum |
url | string, normalisiert | Eine Webadresse, https:// wird ergänzt, wenn es fehlt |
phone | string | Ziffern, Leerzeichen, + ( ) . - |
rating | integer | Eine ganze Zahl von 1 bis max |
text
| validation | Werte | Default |
|---|---|---|
min_length | 0 bis 10.000 | Keiner |
max_length | 1 bis 10.000, oder höchstens 256 mit einem Pattern | 1.000, oder 256 mit einem Pattern |
pattern | Ein regulärer Ausdruck mit bis zu 200 Zeichen, der gegen den ganzen Wert geprüft wird | Keiner |
pattern_message | 1 bis 200 Zeichen | Invalid format |
Patterns laufen mit dem Flag u und müssen auf den ganzen Wert passen. Beim Speichern lehnt Ikiform Patterns ab, die katastrophales Backtracking verursachen könnten: Rückreferenzen, wiederholte Gruppen, die Wiederholungen oder Alternativen enthalten ((a+)+, (a|b)*), und zu viele verschachtelte Wiederholungen.
textarea
| Schlüssel | Werte | Default |
|---|---|---|
validation.min_length | 0 bis 16.000 | Keiner |
validation.max_length | 1 bis 16.000 | 10.000 |
rows | 1 bis 50, ein Darstellungshinweis für Renderer | Keiner |
| validation | Werte | Default |
|---|---|---|
allowed_domains | 1 bis 100 Domains wie example.com, exakt abgeglichen | Beliebige Domain |
Adressen mit mehr als 254 Zeichen werden abgelehnt. Der Domain-Teil wird in Kleinbuchstaben gespeichert; der Teil vor @ bleibt wie gesendet.
number
| validation | Werte | Default |
|---|---|---|
min | Beliebige Zahl | Keiner |
max | Beliebige Zahl, mindestens min | Keiner |
integer | true, um Dezimalzahlen abzulehnen | false |
select, radio und multi_select
| Schlüssel | Werte | Default |
|---|---|---|
options | 1 bis 500 { "value", "label" }-Objekte mit eindeutigen Werten, jeweils 1 bis 200 Zeichen | Pflicht |
validation.min_items | Nur multi_select, 0 bis 500 | 0, oder 1, wenn Pflichtfeld |
validation.max_items | Nur multi_select, 1 bis 500 | Die Anzahl der Optionen |
Nur aufgelistete Werte werden akzeptiert. select und radio nehmen einen Wert; sende multi_select als wiederholte Namen, name[] oder als JSON-Array.
checkbox
Keine zusätzlichen Schlüssel. Eine fehlende Checkbox ist false. required: true bedeutet, dass sie angehakt sein muss, was zu Einwilligungs-Checkboxen passt. Andere Werte als on, true, 1, yes, off, false, 0, no oder leer werden abgelehnt.
date
| validation | Werte | Default |
|---|---|---|
min | Ein YYYY-MM-DD-Datum | Keiner |
max | Ein YYYY-MM-DD-Datum, gleich oder nach min | Keiner |
url
| validation | Werte | Default |
|---|---|---|
https_only | true, um http: abzulehnen | false |
max_length | 1 bis 4.096 | 2.048 |
Akzeptiert werden nur http:- und https:-URLs mit einem Hostnamen, der einen Punkt enthält, und ohne Benutzername oder Passwort. Gespeichert wird die normalisierte URL.
phone
| validation | Werte | Default |
|---|---|---|
e164 | true, um das internationale Format zu verlangen, ohne Trennzeichen gespeichert | false |
Ohne e164 braucht eine Telefonnummer 6 bis 15 Ziffern und wird wie gesendet gespeichert. Damit wird +1 (415) 555-0123 als +14155550123 gespeichert.
rating
| validation | Werte | Default |
|---|---|---|
max | 2 bis 10 | 5 |
Typumwandlung
HTML-Formulare senden alles als Text. Ikiform wandelt es vor dem Speichern in den Typ um, den jedes Feld deklariert. Mit name als Text, email, guests als Zahl, newsletter als Checkbox, site als URL und phone als Telefonfeld:
name=++Ada+Lovelace++&email=Ada@Example.COM&guests=3&newsletter=on&site=example.com&phone=%2B1%20415%20555%200123{
"name": "Ada Lovelace",
"email": "Ada@example.com",
"guests": 3,
"newsletter": true,
"site": "https://example.com/",
"phone": "+14155550123"
}- Werte werden getrimmt. Ein leerer String gilt als fehlend.
- Ein Feld, das einen Wert erwartet, lehnt ein Array mit mehr als einem Element ab.
- Zahlen akzeptieren einfache Dezimal- und Exponentialschreibweise mit bis zu 64 Zeichen, etwa
3,-2.5oder1e3.
Validierungsfehler
Eine Einsendung, die die Validierung nicht besteht, wird mit 422 validation_failed abgelehnt, und nichts wird gespeichert. error.fields ordnet jeder Feld-ID ihre Meldungen zu. Bei Posts aus dem Browser erscheinen dieselben Meldungen auf einer gehosteten Fehlerseite, beschriftet mit deinen Feld-Labels.
{
"ok": false,
"error": {
"code": "validation_failed",
"message": "Some fields are invalid.",
"fields": {
"email": ["Enter a valid email address"],
"website": ["Unknown field \"website\""]
}
},
"request_id": "req_01k7v2c9t3e8m5q4x6z0a1b2c3"
}Unbekannte Felder
Wenn Felder definiert sind, wird jedes Feld, das nicht in der Definition steht, als Unknown field "name" abgelehnt. Reservierte Felder, die mit _ beginnen, der Honeypot und cf-turnstile-response zählen nicht. Ohne Definition werden beliebige Feldnamen akzeptiert.
Meldungen
| Problem | Meldung |
|---|---|
| Fehlender Pflichtwert | This field is required |
| Pflicht-Checkbox nicht angehakt | This box must be checked |
| Zu kurz oder zu lang | Must be at least 10 characters, Must be at most 120 characters |
| Pattern passt nicht | Deine pattern_message oder Invalid format |
Enter a valid email address, Email must be at one of: example.com | |
| Zahl | Enter a number, Enter a whole number, Must be at least 1 |
| Optionen | Choose one of the listed options, Choose at least 2 options, Choose at most 3 options |
| Datum | Enter a valid date (YYYY-MM-DD), Must be on or after 2026-01-01 |
| URL | Enter a valid URL, Enter a valid https:// URL |
| Telefon | Enter a valid phone number, Use international format, e.g. +14155550123 |
| Bewertung | Choose a rating, Rating must be at most 5 |
Im Browser validieren
validate im SDK spiegelt die Server-Regeln und -Meldungen für alle 12 Feldtypen, sodass du Fehler schon vor dem Absenden anzeigen kannst. Der Server bleibt die maßgebliche Instanz. Siehe validate.