Champs et validation
Définissez les champs une fois et Ikiform valide chaque soumission côté serveur, avec des messages clairs et des valeurs typées.
Les champs sont facultatifs. Un formulaire sans champs accepte toutes les données qu'il reçoit. Dès que vous publiez des champs, Ikiform valide chaque soumission par rapport à eux côté serveur, refuse les données invalides avec des messages clairs et stocke des valeurs propres et typées.
Définir les champs
Ouvrez un formulaire dans le tableau de bord et allez dans Fields. Ajoutez des champs dans l'éditeur visuel ou modifiez directement la définition JSON. L'id de chaque champ est le name d'input que votre formulaire doit envoyer.
{
"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." }
}La définition
| Clé | Obligatoire | Règles |
|---|---|---|
version | Oui | Toujours 1 |
title | Oui | 1 à 200 caractères |
description | Non | Jusqu'à 2 000 caractères |
fields | Oui | 1 à 100 champs aux ids uniques, 2 000 options au maximum au total |
settings.submit_label | Non | 1 à 100 caractères, utilisé par les moteurs de rendu comme le composant shadcn/ui |
settings.success_message | Non | 1 à 1 000 caractères |
settings.redirect_url | Non | Une URL http: ou https: jusqu'à 2 048 caractères |
$schema | Non | N'importe quelle chaîne jusqu'à 200 caractères, ignorée |
Les clés inconnues sont refusées, à la racine comme sur chaque champ, donc une faute de frappe comme requried apparaît comme une erreur à l'enregistrement.
Clés communes à tous les champs
| Clé | Obligatoire | Règles |
|---|---|---|
id | Oui | snake_case en minuscules, commence par une lettre, 64 caractères au maximum, par exemple team_size |
type | Oui | L'un des 12 types ci-dessous |
label | Oui | 1 à 200 caractères. Utilisé dans les pages d'erreur et les e-mails de notification |
required | Non | true fait d'une valeur vide une erreur |
placeholder | Non | Jusqu'à 200 caractères |
help_text | Non | Jusqu'à 1 000 caractères |
Bac à sable
201 Created : le serveur stockerait ceci
{
"ok": true,
"id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3"
}Exécute le validateur d'Ikiform dans votre navigateur. Les champs qui commencent par un underscore sont réservés et retirés avant la validation, comme sur le serveur.
Types de champs
| Type | Stocké en | Accepte |
|---|---|---|
text | string | N'importe quel texte sur une ligne |
textarea | string | Texte sur plusieurs lignes |
email | string, domaine en minuscules | Une adresse e-mail |
number | number | Des nombres, ou des chaînes numériques venant de formulaires HTML |
select | string | Une valeur d'option listée |
radio | string | Une valeur d'option listée |
multi_select | string[] | Des valeurs d'options listées, doublons retirés |
checkbox | boolean | on, true, 1, yes, ou rien |
date | string, YYYY-MM-DD | Une date réelle du calendrier |
url | string, normalisée | Une adresse web, avec https:// ajouté s'il manque |
phone | string | Chiffres, espaces, + ( ) . - |
rating | integer | Un nombre entier de 1 à max |
text
| validation | Valeurs | Par défaut |
|---|---|---|
min_length | 0 à 10 000 | Aucun |
max_length | 1 à 10 000, ou 256 au maximum avec un pattern | 1 000, ou 256 avec un pattern |
pattern | Une expression régulière jusqu'à 200 caractères, appliquée à la valeur entière | Aucun |
pattern_message | 1 à 200 caractères | Invalid format |
Les patterns s'exécutent avec le flag u et doivent correspondre à la valeur entière. À l'enregistrement, Ikiform refuse les patterns susceptibles d'un backtracking catastrophique : références arrière, groupes répétés contenant des répétitions ou des alternatives ((a+)+, (a|b)*), et trop de répétitions imbriquées.
textarea
| Clé | Valeurs | Par défaut |
|---|---|---|
validation.min_length | 0 à 16 000 | Aucun |
validation.max_length | 1 à 16 000 | 10,000 |
rows | 1 à 50, une indication d'affichage pour les moteurs de rendu | Aucun |
| validation | Valeurs | Par défaut |
|---|---|---|
allowed_domains | 1 à 100 domaines comme example.com, comparés exactement | N'importe quel domaine |
Les adresses de plus de 254 caractères sont refusées. La partie domaine est stockée en minuscules ; la partie avant @ est gardée telle qu'envoyée.
number
| validation | Valeurs | Par défaut |
|---|---|---|
min | N'importe quel nombre | Aucun |
max | N'importe quel nombre, au moins min | Aucun |
integer | true pour refuser les décimales | false |
select, radio et multi_select
| Clé | Valeurs | Par défaut |
|---|---|---|
options | 1 à 500 objets { "value", "label" } aux valeurs uniques, de 1 à 200 caractères chacun | Obligatoire |
validation.min_items | multi_select uniquement, 0 à 500 | 0, ou 1 si obligatoire |
validation.max_items | multi_select uniquement, 1 à 500 | Le nombre d'options |
Seules les valeurs listées sont acceptées. select et radio prennent une seule valeur ; envoyez multi_select sous forme de noms répétés, de name[] ou d'un tableau JSON.
checkbox
Pas de clé supplémentaire. Une case absente vaut false. required: true signifie qu'elle doit être cochée, ce qui convient aux cases de consentement. Les valeurs autres que on, true, 1, yes, off, false, 0, no ou vide sont refusées.
date
| validation | Valeurs | Par défaut |
|---|---|---|
min | Une date YYYY-MM-DD | Aucun |
max | Une date YYYY-MM-DD, égale ou postérieure à min | Aucun |
url
| validation | Valeurs | Par défaut |
|---|---|---|
https_only | true pour refuser http: | false |
max_length | 1 à 4 096 | 2,048 |
Seules les URL http: et https: avec un nom d'hôte contenant un point, sans nom d'utilisateur ni mot de passe, sont acceptées. La valeur stockée est l'URL normalisée.
phone
| validation | Valeurs | Par défaut |
|---|---|---|
e164 | true pour exiger le format international, stocké sans séparateurs | false |
Sans e164, un numéro de téléphone doit avoir de 6 à 15 chiffres et est stocké tel qu'envoyé. Avec, +1 (415) 555-0123 est stocké sous la forme +14155550123.
rating
| validation | Valeurs | Par défaut |
|---|---|---|
max | 2 à 10 | 5 |
Conversion
Les formulaires HTML envoient tout sous forme de texte. Ikiform convertit chaque valeur dans le type déclaré par le champ avant de la stocker. Avec name en texte, email, guests en nombre, newsletter en case à cocher, site en URL et phone en téléphone :
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"
}- Les espaces en début et fin de valeur sont retirés. Une chaîne vide compte comme absente.
- Un champ qui attend une seule valeur refuse un tableau de plus d'un élément.
- Les nombres acceptent la notation décimale et exponentielle jusqu'à 64 caractères, comme
3,-2.5ou1e3.
Erreurs de validation
Une soumission qui échoue à la validation est refusée avec 422 validation_failed et rien n'est stocké. error.fields associe chaque id de champ à ses messages. Les envois depuis un navigateur affichent les mêmes messages sur une page d'erreur hébergée, avec les libellés de vos champs.
{
"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"
}Champs inconnus
Avec des champs définis, tout champ absent de la définition est refusé avec Unknown field "name". Les champs réservés qui commencent par _, le honeypot et cf-turnstile-response ne comptent pas. Sans définition, tous les noms de champs sont acceptés.
Messages
| Problème | Message |
|---|---|
| Valeur obligatoire manquante | This field is required |
| Case obligatoire non cochée | This box must be checked |
| Trop court ou trop long | Must be at least 10 characters, Must be at most 120 characters |
| Pattern non respecté | Votre pattern_message, ou Invalid format |
Enter a valid email address, Email must be at one of: example.com | |
| Nombre | Enter a number, Enter a whole number, Must be at least 1 |
| Options | Choose one of the listed options, Choose at least 2 options, Choose at most 3 options |
| Date | 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 |
| Téléphone | Enter a valid phone number, Use international format, e.g. +14155550123 |
| Note | Choose a rating, Rating must be at most 5 |
Valider dans le navigateur
Le validate du SDK reproduit les règles et messages du serveur pour les 12 types de champs, ce qui permet d'afficher les erreurs avant l'envoi. Le serveur reste la référence. Voir validate.