KEPLIN Docs

Validation

Les deux lignes de défense des données — ce que le modèle garantit et les règles que les formulaires des écrans vérifient avant d'enregistrer.

Les données fausses entrent par distraction, pas par malveillance : un numéro fiscal à huit chiffres, un e-mail sans arobase, une remise de 300 %, un enregistrement enregistré sans le champ dont le reste du processus a besoin. Valider, c'est fermer ces portes — et dans Keplin, elles se ferment sur deux couches, qu'il vaut mieux ne pas confondre.

Couche Où elle se définit Quand elle agit Ce qu'elle attrape
Le modèle Dans l'éditeur de la table (voir Tables et champs) À toute écriture, d'où qu'elle vienne Ce qui ne peut jamais arriver aux données.
Les règles des champs Dans l'inspecteur de chaque champ de formulaire, catégorie Validation Quand l'utilisateur enregistre un formulaire Ce que la personne est en train d'écrire, avec le bon message à côté du champ.

La règle pratique : ce qui est vrai des données vit dans le modèle ; ce qui est une aide à l'utilisateur vit dans le formulaire. Un champ obligatoire est les deux à la fois — on désactive Autorise NULL dans le modèle et on active Obligatoire sur le champ de l'écran.

Ce que le modèle garantit

Ce ne sont pas des « règles de validation » sous ce nom, mais c'est la seule défense qu'on ne contourne pas : elle vaut pour les écrans, pour les APIs, pour les scripts et pour qui écrit directement dans la base de données.

Pièce Ce qu'elle empêche
Autorise NULL désactivé Un enregistrement sans valeur dans cette colonne.
Type de la colonne Du texte dans un champ de date, des lettres dans un nombre.
Longueur / Précision · Échelle Du texte plus long que la colonne, ou de l'argent avec trop de décimales.
Clé primaire (PK) Des enregistrements en double et des enregistrements qu'on ne peut pas identifier.
Index unique Deux clients avec le même numéro fiscal, deux utilisateurs avec le même e-mail.
Colonne de type enum Un état qui n'existe pas dans la liste.
Relation physique + À la suppression du parent Des enfants orphelins, ou des suppressions qui emportent ce qu'elles ne devraient pas.

La colonne estado dans l'éditeur de structure : le type, le Nom convivial (apps) et l'interrupteur Autorise NULL sont la première défense des données.
La colonne estado dans l'éditeur de structure : le type, le Nom convivial (apps) et l'interrupteur Autorise NULL sont la première défense des données.

Dica

Avant d'écrire une règle sur un formulaire, demandez-vous : ceci peut-il être vrai sur un enregistrement, une fois ? Si la réponse est non, l'endroit est le modèle — parce que le formulaire n'est qu'une des portes par lesquelles les données entrent.

Les règles des champs de formulaire

Tous les champs de formulaire — Champ de texte, Zone de texte, Nombre, Oui/Non, Liste, Date, Couleur, Fichier — ont dans l'inspecteur la catégorie Validation. C'est là qu'on déclare ce que ce champ accepte.

Pour y arriver :

  1. Ouvrez l'écran dans le designer.
  2. Sélectionnez le champ — dans le canvas, ou par l'onglet Structure de l'inspecteur.
  3. Dans l'onglet Propriétés, ouvrez la catégorie Validation.

La catégorie Validation d'un Champ de texte : Obligatoire, Masque, limites de caractères, Motif (regex), Format et Égal au champ.
La catégorie Validation d'un Champ de texte : Obligatoire, Masque, limites de caractères, Motif (regex), Format et Égal au champ.

Obligatoire

L'interrupteur Obligatoire est la première et la plus utilisée des règles : le champ doit être rempli. C'est aussi la seule qui parle du vide — toutes les autres laissent passer un champ vide, parce que le vide est l'affaire de l'Obligatoire.

L'interrupteur Obligatoire du champ Téléphone — la première règle à s'exécuter, et la seule qui parle du vide.
L'interrupteur Obligatoire du champ Téléphone — la première règle à s'exécuter, et la seule qui parle du vide.

Les règles standard

Selon le type de champ, la catégorie affiche les règles qui ont du sens :

Règle Où elle apparaît Ce qu'elle vérifie
Masque Champ de texte Le format pendant la saisie : # chiffre, A lettre, N alphanumérique, * n'importe quoi — le reste est du texte fixe. Ex. : +351 ### ### ###.
Min. caractères Champ de texte, Zone de texte Longueur minimale du texte.
Max. caractères Champ de texte, Zone de texte Longueur maximale du texte.
Motif (regex) Champ de texte, Zone de texte Une expression régulière que la valeur doit respecter. Ex. : ^[A-Z]{2}\d{4}$.
Format Champ de texte Aucun, Est un e-mail, Est un téléphone ou Est un nombre. Ils sont exclusifs : une valeur ne peut pas être e-mail et téléphone en même temps.
Valeur min. Nombre La plus petite valeur acceptée.
Valeur max. Nombre La plus grande valeur acceptée.
Égal au champ Tous les champs La valeur doit être égale à celle d'un autre champ de l'écran — la confirmation de mot de passe, l'e-mail répété.

Nota

Le Masque est une aide à la saisie, ce n'est pas une validation : il guide ce que la personne écrit, mais celui qui garantit le format, c'est le Motif (regex) ou le Format. Un téléphone avec masque peut rester à moitié saisi.

Validation par code

Sous les règles standard se trouve la ligne Validation, qui affiche Aucune validation — définir ou Définie — modifier. Le bouton ouvre un éditeur de code pour les règles que les champs ne couvrent pas : un numéro fiscal avec chiffre de contrôle, un IBAN, une date qui doit être postérieure à une autre, une règle métier que seule votre entreprise a.

Le code reçoit value — la valeur actuelle du champ — et renvoie :

  • true (ou rien) si la valeur est valide ;
  • une chaîne avec le message d'erreur à afficher, si elle ne l'est pas.
const s = String(value ?? "").replace(/\D/g, "");
if (s.length !== 9) return "Le numéro fiscal doit avoir 9 chiffres";
return true;

Dans ce code, vous avez aussi keplin à disposition — de quoi comparer avec un autre champ, avec une valeur de la session ou avec des données déjà chargées dans l'écran. C'est du TypeScript, avec des suggestions pendant que vous écrivez (Ctrl+Espace) ; l'éditeur refuse d'enregistrer du code qui n'est pas exécutable.

L'éditeur de la validation par code : il reçoit la valeur du champ et renvoie true, ou le message d'erreur à afficher.
L'éditeur de la validation par code : il reçoit la valeur du champ et renvoie true, ou le message d'erreur à afficher.

Quand la validation s'exécute

La validation d'un formulaire s'exécute à l'enregistrement — quand le bouton d'enregistrement demande d'enregistrer le datastore de l'enregistrement. L'ordre est toujours le même, par champ :

  1. Obligatoire — le champ est-il rempli ?
  2. Les règles standard — longueur, format, minimum, maximum, motif, égalité.
  3. La validation par code — votre règle.

La première erreur l'emporte : dès qu'une règle échoue, c'est le message de cette règle qui apparaît sous le champ et les suivantes ne s'exécutent pas. Si un champ échoue, rien n'est enregistré — l'enregistrement reste tel quel et la personne reste dans le formulaire, avec les erreurs sous les yeux.

On peut aussi valider un champ à la main, depuis le code d'un événement — par exemple pour vérifier un champ dès qu'il change au lieu d'attendre la fin. C'est l'affaire de Événements et le SDK.

Les messages

Les messages des règles standard sont ceux de la plateforme, écrits dans la langue de l'app : Champ obligatoire., E-mail non valide., Minimum {min} caractères., Valeur maximale : {max}., Les valeurs ne correspondent pas., Format non valide. Ils ne se modifient pas un par un — si vous devez dire les choses autrement, l'endroit est la validation par code, où le message est la chaîne que vous renvoyez.

La langue vient des paramètres de l'app (Paramètres de l'app ▸ Traductions) : la même app en portugais et en anglais affiche les erreurs dans la langue de celui qui l'utilise.

Ce que la validation N'EST PAS

Atenção

La validation d'un formulaire est une commodité, pas une sécurité. Elle s'exécute dans le navigateur de celui qui utilise l'app et sert à éviter les erreurs honnêtes. Qui veut vraiment écrire une valeur invalide ne passe pas par le formulaire — il passe par l'API. La vraie défense est celle du modèle (types, obligation, clés, index uniques, enums) et celle des permissions de qui peut écrire quoi.

Pourquoi ne… ?

  • Pourquoi je ne vois pas la catégorie Validation dans ce widget ? Seuls les champs de formulaire valident. Un Bouton, un Libellé ou une Table n'ont pas de valeur à valider.
  • Pourquoi la règle ne se déclenche-t-elle pas avec le champ vide ? C'est exprès : les règles standard ignorent le vide, qui est le territoire de l'Obligatoire. Activez-le.
  • Pourquoi un enregistrement invalide a-t-il été enregistré quand même ? Soit le champ n'était pas relié au datastore (sans liaison, il n'entre pas dans la validation), soit la valeur a été écrite par une autre voie — une API, un script, un import. Voyez ce que le modèle garantit, plus haut sur cette page.
  • Pourquoi le Motif (regex) ne correspond-il pas ? C'est une expression régulière dans la syntaxe habituelle, et chaque caractère compte : ^[A-Z]{2}\d{4}$ accepte PT1234 et refuse pt1234. Testez l'expression avant de la coller.
  • Pourquoi ma validation par code n'a-t-elle pas été enregistrée ? L'éditeur refuse le code qui n'est pas exécutable — corrigez l'erreur signalée et enregistrez à nouveau.
  • Pourquoi le message apparaît-il en anglais ? La langue de l'app est l'anglais. Changez-la dans Paramètres de l'app ▸ Traductions.