Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 620 minDébutant

Formulaires et messages d'erreur : les bonnes pratiques

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • organiser un formulaire en une colonne, dans l'ordre de la tâche ;
  • choisir le bon type de champ et indiquer le format attendu ;
  • valider au bon moment, dans le navigateur et sur le serveur ;
  • rédiger des messages d'erreur clairs, polis et utiles ;
  • protéger l'utilisateur des actions irréversibles.

4 exercices corrigés1 schéma

Un formulaire ergonomique demande le moins d'informations possible, dans l'ordre où l'utilisateur les a en tête, avec un libellé visible et une aide pour chaque champ ; il prévient les erreurs plutôt que de les reprocher et, quand une erreur arrive, il dit où elle est et comment la corriger, sans rien effacer. Ce chapitre donne les règles pour structurer un formulaire, choisir les bons champs, valider au bon moment et rédiger des messages d'erreur utiles, puis les applique au formulaire de réservation de Prêt'Matos.

Avant le formulaire : chaque champ doit se justifier

Le formulaire est l'endroit où les utilisateurs abandonnent, se trompent et appellent le support. Chaque champ ajouté coûte du temps et une occasion d'erreur. Pour chacun, pose deux questions : en a-t-on vraiment besoin pour rendre le service ? et le sait-on déjà ?

Dans Prêt'Matos, le salarié est connecté avec son compte de l'entreprise : son nom, son service et son adresse sont connus, il ne faut pas les redemander (critère de concision). Il reste trois informations : le matériel (déjà choisi sur la fiche), la période, et un motif facultatif qui aide la logistique à arbitrer quand deux demandes se chevauchent.

Structurer le formulaire

Une seule colonne. L'œil descend le long des champs sans se demander dans quel ordre les lire. Deux colonnes font sauter des champs et cassent au zoom ou sur téléphone. Seule exception : deux champs courts et indissociables, comme la date de retrait et la date de retour, peuvent tenir côte à côte sur un grand écran.

Les libellés au-dessus des champs. C'est la disposition la plus rapide à parcourir, la seule qui fonctionne sur un téléphone et avec un fort zoom, et celle qui laisse la place aux libellés longs et aux traductions.

Des groupes nommés. Les champs qui vont ensemble forment un groupe avec un titre (en HTML, un fieldset et sa legend) : « Période du prêt » réunit les deux dates. Un long formulaire se découpe en étapes, avec un indicateur « Étape 2 sur 3 » (critère de guidage).

L'ordre de la tâche. Les champs suivent la façon dont l'utilisateur pense sa demande : quoi, puis quand, puis pourquoi. Pas l'ordre des colonnes de la table reservation.

Des boutons qui disent ce qu'ils font. Le bouton principal porte un verbe et son objet (« Confirmer la réservation », « Enregistrer le retour »), pas « OK » ni « Valider ». Il n'y en a qu'un par formulaire, visuellement dominant, placé à la fin des champs, là où l'utilisateur arrive. L'action secondaire (« Annuler ») est visible mais discrète. Le bouton « Réinitialiser » qui efface tout est à bannir : personne n'en a besoin, et tout le monde le clique un jour par erreur.

Choisir le bon type de champ

Le bon champ empêche des erreurs avant même la saisie (critère de protection contre les erreurs) et, sur un téléphone, ouvre le bon clavier.

BesoinChamp adaptéPourquoi
Une dateSélecteur de date (en HTML, <input type="date">)Pas d'erreur de format ; le téléphone ouvre son calendrier
Un choix parmi 2 à 5 optionsBoutons radioToutes les options sont visibles (reconnaissance plutôt que rappel)
Un choix parmi beaucoup d'optionsListe déroulante, ou champ avec suggestions s'il y en a des dizainesÉvite une saisie libre, tout en restant compacte
Oui ou non, une acceptationCase à cocher, jamais cochée d'avance pour un consentementUn seul clic, un état clair
Un texte courtChamp texte avec autocomplete adaptéLe navigateur peut remplir les données connues
Une quantitéChamp numérique (type="number") avec minimum et maximumContraint la valeur
Un code, un téléphone, un code postalChamp texte avec inputmode="numeric" ou type="tel"Clavier numérique, sans les flèches et l'arrondi d'un champ nombre
Un texte longZone de texte (textarea), avec le nombre de caractères restantsMontre la place disponible
Un fichierSélecteur de fichier, avec les types et la taille acceptés écrits à côtéL'utilisateur sait d'avance ce qui sera refusé

Libellés, aides et exemples

Un libellé visible pour chaque champ, toujours. Le texte grisé à l'intérieur du champ (l'attribut placeholder) ne remplace pas un libellé : il disparaît dès qu'on tape, si bien qu'on ne sait plus ce qu'on remplissait ; il est souvent trop pâle pour être lu ; et un champ qui contient du texte gris ressemble à un champ déjà rempli.

Une aide sous le libellé quand le champ a une contrainte. « 15 jours au maximum », « Format : JJ/MM/AAAA », « Le numéro est sur l'étiquette collée sous le matériel ». L'aide est écrite avant l'erreur, pas révélée par elle.

Champs obligatoires et facultatifs. Si presque tous les champs sont obligatoires, signale plutôt les facultatifs (« Motif (facultatif) ») et dis-le en tête du formulaire. Sinon, marque les obligatoires d'un astérisque expliqué en tête (« Les champs marqués * sont obligatoires ») et déclare-les comme tels dans le code (required), pour que les lecteurs d'écran l'annoncent.

Accepter les saisies naturelles. Un numéro de téléphone tapé avec des espaces ou des points, une adresse électronique avec une majuscule ou un espace à la fin : nettoie la saisie au lieu de la refuser. Chaque refus d'une saisie compréhensible est une erreur que tu fabriques (critère de compatibilité).

Valider au bon moment

La validation dit à l'utilisateur si sa saisie est acceptable. Trop tôt, elle l'interrompt ; trop tard, elle l'oblige à revenir en arrière.

MomentCe qu'on vérifieExemple sur Prêt'Matos
Pendant la frappeSeulement des aides positivesLe compteur « 72 caractères restants » sous le motif
À la sortie du champLe format et les contraintes du champ, s'il a été rempliDate de retour antérieure à la date de retrait
À l'envoiTout le formulaire : champs obligatoires, cohérence entre champsPériode qui dépasse 15 jours ; champ obligatoire vide
Sur le serveur, toujoursToutes les règles, y compris celles qui dépendent des autres donnéesMatériel déjà réservé sur une partie de la période

Trois règles accompagnent ce tableau.

  • Pas d'erreur sur un champ qu'on n'a pas fini de remplir : afficher « adresse invalide » après la première lettre agace et inquiète.
  • Une erreur disparaît dès qu'elle est corrigée : une fois qu'un message est affiché, revérifie le champ à chaque frappe pour l'effacer aussitôt.
  • La validation du navigateur est un confort, celle du serveur est une obligation. N'importe qui peut envoyer une requête à l'API sans passer par le formulaire : le serveur revérifie tout, comme l'explique le cours sécurité applicative.

Rédiger un message d'erreur utile

Un bon message d'erreur a quatre qualités.

  1. Visible : placé juste sous le champ concerné, et rappelé en haut du formulaire quand il y a plusieurs erreurs.
  2. Explicite : il dit quel champ pose problème et pourquoi, dans les mots de l'utilisateur.
  3. Constructif : il dit comment corriger, avec un exemple ou la valeur acceptable.
  4. Courtois : il décrit la situation sans accuser l'utilisateur, sans jargon technique, sans majuscules ni points d'exclamation.

Il doit aussi être perceptible sans la couleur : un texte, éventuellement précédé d'une icône, et pas seulement une bordure rouge, que ne distinguent ni une personne daltonienne ni un lecteur d'écran.

Date de retour15 jours au maximum, premier et dernier jour compris30/03/2027⚠Choisissez une date de retour au plus tardle 26/03/2027 : un prêt dure 15 jours au maximum.libellé : visible, collé au champaide : la contrainte, avant la saisiesaisie conservée,bordure d'erreur épaisseun texte, pas seulementune couleur ; dit comment corrigerDans le code, le champ porte aria-invalid et aria-describedby,qui le relie à l'aide et au message : le lecteur d'écran lit les deux.
Un champ en erreur : libellé, aide, saisie conservée et message qui dit comment corriger

Voici des messages relevés dans des applications, et leur réécriture pour Prêt'Matos. L'application vouvoie ses utilisateurs : c'est un choix de l'équipe, appliqué à tous les textes (critère d'homogénéité).

Message à éviterDéfautMessage utile
« Champ invalide »Ne dit ni quel champ ni quoi faire« Indiquez une date de retour postérieure à la date de retrait. »
« Erreur 409 »Code technique« PC-07 est déjà réservé du 10 au 14 mars. Choisissez d'autres dates ou un autre portable. »
« Vous n'avez pas rempli le champ obligatoire !!! »Accusateur, criard, ne dit pas lequel« Indiquez la date de retrait. »
« Format incorrect »Ne donne pas le format attendu« Saisissez la date au format JJ/MM/AAAA, par exemple 12/03/2027. »
« Une erreur est survenue »Ne dit ni quoi ni que faire« La réservation n'a pas pu être envoyée : la connexion a été interrompue. Vos informations sont conservées ; réessayez dans un instant. »
« Durée > 15 j »Symboles, abréviations« Choisissez une date de retour au plus tard le 26/03/2027 : un prêt dure 15 jours au maximum. »

Quand un formulaire long contient plusieurs erreurs après l'envoi, affiche en haut un récapitulatif (« 2 erreurs empêchent l'envoi : »), avec un lien vers chaque champ, et place le focus dessus pour que les utilisateurs de lecteur d'écran l'entendent. Quand l'erreur vient du serveur ou du réseau, affiche un message global, conserve tout ce qui a été saisi et propose de réessayer.

Prévenir plutôt que corriger

Le meilleur message d'erreur est celui qu'on n'a pas besoin d'afficher (heuristique 5 de Nielsen).

  • Contraindre la saisie : le calendrier n'autorise pas une date passée ; la date de retour ne peut pas précéder la date de retrait ni la dépasser de plus de 15 jours ; les jours où le matériel est déjà réservé sont grisés, avec la raison au survol ou au focus.
  • Proposer de bonnes valeurs par défaut : le matériel de la fiche consultée, la date du jour pour un retour.
  • Doser les confirmations : une confirmation (« Supprimer définitivement PC-07 du catalogue ? ») se justifie pour une action rare et irréversible. Pour une action fréquente, une confirmation systématique finit par être cliquée sans être lue ; mieux vaut permettre de défaire pendant quelques secondes (« Retour de PC-07 enregistré. Annuler »).
  • Empêcher le double envoi : pendant l'envoi, le bouton affiche « Envoi en cours… » et ne réagit plus ; le serveur, de son côté, refuse proprement une deuxième réservation identique.
  • Ne jamais perdre la saisie : après une erreur, un rechargement de page ou une déconnexion, l'utilisateur retrouve ce qu'il avait tapé.

Après l'envoi : confirmer et dire la suite

Le succès mérite autant de soin que l'erreur. Le message de confirmation récapitule ce qui a été enregistré et dit ce qui se passe ensuite :

Réservation confirmée : vidéoprojecteur VP-01, du mercredi 24/03 au vendredi 26/03/2027. À retirer au stock, bâtiment B, de 8 h à 17 h. Vous recevrez un rappel la veille du retour.

Pour Mathis, cette seule phrase aurait évité le point le plus bas de son parcours (chapitre 4).

Des formulaires honnêtes

Certaines interfaces sont conçues pour pousser l'utilisateur à faire ce qu'il ne veut pas : on les appelle interfaces trompeuses (dark patterns). Case d'inscription à la lettre d'information cochée d'avance, bouton « Refuser » minuscule et grisé à côté d'un grand « Accepter », formule culpabilisante (« Non merci, je préfère payer plus cher »), abonnement en un clic mais résiliation en dix écrans.

Ce n'est pas seulement contraire à l'ergonomie (contrôle explicite, compatibilité avec les intentions de l'utilisateur), c'est souvent illégal. Un consentement au sens du RGPD doit résulter d'un acte positif : une case cochée d'avance ne vaut pas consentement, comme l'a jugé la Cour de justice de l'Union européenne en 2019. La CNIL exige que refuser les cookies soit aussi simple que les accepter (cookies et traceurs). Et le règlement européen sur les services numériques (DSA) interdit aux plateformes en ligne de concevoir leurs interfaces de façon à tromper ou manipuler leurs utilisateurs (LCEN et DSA).

Le formulaire de réservation de Prêt'Matos en HTML

Voici l'écran ECR3 « Réserver » écrit en HTML. Il applique les règles du chapitre ; le chapitre 10 en fait un composant React avec la validation et les messages.

html
<main>
  <h1>Réserver le vidéoprojecteur VP-01</h1>
  <p>Tous les champs sont obligatoires, sauf le motif.</p>

  <form action="/reservations" method="post">
    <input type="hidden" name="materiel" value="VP-01">

    <fieldset>
      <legend>Période du prêt</legend>
      <p id="aide-periode">
        15 jours au maximum, premier et dernier jour compris.
        Retrait et retour au stock, bâtiment B, de 8 h à 17 h.
      </p>

      <label for="debut">Date de retrait</label>
      <input type="date" id="debut" name="debut" required
             min="2027-03-08" aria-describedby="aide-periode">

      <label for="fin">Date de retour</label>
      <input type="date" id="fin" name="fin" required
             min="2027-03-08" aria-describedby="aide-periode">
    </fieldset>

    <label for="motif">Motif (facultatif)</label>
    <p id="aide-motif">Par exemple : présentation chez un client. 100 caractères au maximum.</p>
    <input type="text" id="motif" name="motif" maxlength="100"
           aria-describedby="aide-motif">

    <button type="submit">Confirmer la réservation</button>
    <a href="/catalogue/VP-01">Annuler</a>
  </form>
</main>
ChoixRègle appliquée
Titre « Réserver le vidéoprojecteur VP-01 »Guidage : l'utilisateur sait où il est et sur quel matériel il agit
Phrase sur les champs obligatoires, motif marqué « facultatif »Incitation ; les champs obligatoires sont aussi déclarés required
fieldset « Période du prêt »Groupement par la localisation, nommé pour les lecteurs d'écran
Aide reliée aux champs par aria-describedbyLa contrainte est annoncée avant l'erreur, à l'écran comme au lecteur d'écran
type="date" avec minProtection contre les erreurs : pas de format à deviner, pas de date passée (la valeur de min est calculée par le serveur à chaque affichage)
Un seul bouton principal, au libellé explicite ; « Annuler » en lien discretSignifiance, contrôle utilisateur

Sans JavaScript, ce formulaire fonctionne déjà : le navigateur vérifie les champs obligatoires et les dates, puis le serveur revérifie tout. Le script du chapitre 10 remplace les bulles natives du navigateur par les messages rédigés plus haut.

Exercices

Exercice 1 sur 4 Réécrire des messages d'erreur Réussi À revoir

Réécris chaque message pour une application de gestion des congés qui vouvoie ses utilisateurs.

  1. « ERREUR : CHAMP OBLIGATOIRE »
  2. « Date invalide » (la date de fin saisie précède la date de début)
  3. « Solde insuffisant »
  4. « Erreur 500 »
  5. « Le fichier n'est pas valide » (justificatif de 12 Mo, la limite est de 5 Mo)
Voir la réponseMasquer la réponse de l'exercice 1

Des formulations possibles :

  1. « Indiquez le type de congé. » (Le message nomme le champ ; il est affiché sous lui.)
  2. « La date de fin doit être postérieure ou égale à la date de début (le 14/04/2027). »
  3. « Il vous reste 3 jours de congés payés : réduisez la période ou choisissez un autre type de congé. »
  4. « Votre demande n'a pas pu être enregistrée à cause d'un problème technique. Vos informations sont conservées : réessayez dans quelques minutes. Si le problème continue, contactez le service informatique. »
  5. « Le justificatif fait 12 Mo : la taille maximale est de 5 Mo. Réduisez-le ou envoyez une photo. »

Chaque réponse dit ce qui ne va pas et comment corriger, sans majuscules, sans code technique, sans reproche.

Tu avais trouvé ?

Exercice 2 sur 4 Les défauts d'un formulaire Réussi À revoir

Le formulaire « Ajouter un matériel au catalogue » de la logistique a été codé sans maquette. Le voici décrit :

  • deux colonnes de champs : à gauche « Désignation », « Type », « Date d'achat » ; à droite « N° inventaire », « Prix », « État » ;
  • les libellés sont dans les champs, en texte gris (placeholder) ;
  • « Type » est un champ texte libre ;
  • « N° inventaire » est un champ type="number" ;
  • en cas d'erreur, tous les champs en erreur deviennent rouges, sans texte, et un message « Formulaire invalide » s'affiche en haut ;
  • deux boutons de même taille côte à côte : « Réinitialiser » et « Valider ».

Relève les défauts et propose une correction pour chacun.

Voir la réponseMasquer la réponse de l'exercice 2
DéfautCorrection
Deux colonnesUne seule colonne, dans l'ordre de la tâche (désignation, type, n° d'inventaire, date d'achat, prix, état)
Libellés en placeholderLibellé visible au-dessus de chaque champ ; le texte d'exemple, s'il est utile, va dans une aide sous le libellé
« Type » en saisie libreListe fermée (portable, vidéoprojecteur, casque…) : pas de fautes de frappe, des données homogènes
N° d'inventaire en type="number"Champ texte (le numéro peut commencer par un zéro ou contenir des lettres, comme « PC-07 »), avec le format en aide
Erreurs signalées par la seule couleur, message global vagueUn message sous chaque champ fautif, qui dit comment corriger ; un récapitulatif en haut avec des liens vers les champs
« Réinitialiser » à côté de « Valider », de même tailleSupprimer « Réinitialiser » ; un seul bouton principal au libellé explicite, « Ajouter au catalogue » ; « Annuler » en action secondaire

Tu avais trouvé ?

Exercice 3 sur 4 Quel type de champ ? Réussi À revoir

Choisis le champ le plus adapté pour chaque information et justifie.

  1. Le service de l'emprunteur, parmi 6 services.
  2. L'état d'un matériel rendu : bon état, abîmé, à réparer.
  3. La quantité de câbles HDMI prêtés avec un matériel (de 0 à 3).
  4. Le numéro de téléphone d'un contact.
  5. L'acceptation de la charte de prêt du matériel.
  6. Le commentaire du magasinier sur un matériel abîmé.
Voir la réponseMasquer la réponse de l'exercice 3
  1. Liste déroulante (ou boutons radio si la place le permet) : 6 options fermées ; mais si l'emprunteur est connecté, son service est déjà connu, et le champ disparaît.
  2. Boutons radio : trois options, toutes visibles d'un coup.
  3. Champ numérique avec min="0" et max="3", ou trois boutons radio et « aucun ».
  4. Champ texte de type tel, qui ouvre le clavier téléphonique, avec autocomplete="tel" ; accepter les espaces et les points.
  5. Case à cocher non cochée par défaut, avec un lien vers la charte.
  6. Zone de texte (textarea), avec une limite affichée.

Tu avais trouvé ?

Exercice 4 sur 4 Confirmer ou permettre d'annuler ? Réussi À revoir

Pour chaque action, dis s'il vaut mieux demander une confirmation avant, permettre d'annuler après, ou ni l'un ni l'autre, et justifie.

  1. Annuler sa propre réservation à venir.
  2. Supprimer définitivement un matériel du catalogue, avec son historique de prêts.
  3. Enregistrer le retour d'un matériel (vingt fois par jour pour Noah).
  4. Changer le tri du planning.
Voir la réponseMasquer la réponse de l'exercice 4
  1. Les deux se défendent. L'action est courante, ce qui plaide pour un « Rétablir » pendant quelques secondes. Mais dès l'annulation, le créneau est libéré et un autre salarié peut le réserver : le « Rétablir » ne fonctionnerait pas toujours. C'est pourquoi Prêt'Matos a choisi une confirmation courte (écran ECR6), qui rappelle le matériel et les dates.
  2. Confirmation avant, explicite (« Supprimer définitivement PC-07 et ses 48 prêts ? Cette action est irréversible. »), voire proposer d'archiver plutôt que de supprimer : l'action est rare et irréversible.
  3. Permettre d'annuler après : une confirmation à chaque retour serait cliquée sans être lue (et ralentirait Noah) ; une erreur doit pouvoir se corriger depuis la liste.
  4. Ni l'un ni l'autre : l'action ne détruit rien et se défait en un clic.

Tu avais trouvé ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Accessibilité dès la conception : RGAA, WCAG 2.2 et EAARevoir le sommaire du cours