Aller au contenu

Exercice 0 : Formulaire d'inscription (HTML uniquement)

Objectif

Cet exercice se concentre exclusivement sur la structure HTML des formulaires. Vous n'avez pas besoin de CSS pour cet exercice. L'objectif est de maîtriser les différents types de champs, attributs, et bonnes pratiques HTML.

Workflow Git

Avant de commencer cet exercice :

1
2
3
4
5
git checkout main
git pull origin main
git checkout -b exercice-0
mkdir exercice-0
cd exercice-0

Contexte

Vous devez créer un formulaire d'inscription complet pour une plateforme éducative en ligne. Ce formulaire doit collecter toutes les informations nécessaires pour créer un compte étudiant.


Introduction : <fieldset> et <legend>

Nouveaux éléments HTML

Cet exercice introduit deux balises HTML que vous n'avez peut-être pas encore vues en cours : <fieldset> et <legend>.

Qu'est-ce qu'un <fieldset> ?

Un <fieldset> est une balise HTML qui permet de regrouper logiquement des champs de formulaire qui sont liés entre eux. Il crée une bordure visuelle autour du groupe de champs.

Syntaxe :

1
2
3
<fieldset>
  <!-- Vos champs de formulaire ici -->
</fieldset>

Qu'est-ce qu'une <legend> ?

Une <legend> est le titre d'un <fieldset>. Elle décrit le groupe de champs et s'affiche généralement en haut de la bordure du fieldset.

Syntaxe :

1
2
3
4
<fieldset>
  <legend>Titre de la section</legend>
  <!-- Vos champs de formulaire ici -->
</fieldset>

Exemple complet

Voici un exemple concret d'utilisation de <fieldset> et <legend> :

<form>
  <fieldset>
    <legend>Informations de contact</legend>

    <label for="email">Email :</label>
    <input type="email" id="email" name="email" required>

    <label for="phone">Téléphone :</label>
    <input type="tel" id="phone" name="phone">
  </fieldset>

  <fieldset>
    <legend>Adresse</legend>

    <label for="street">Rue :</label>
    <input type="text" id="street" name="street">

    <label for="city">Ville :</label>
    <input type="text" id="city" name="city">
  </fieldset>
</form>

Résultat visuel

Le navigateur affichera :

1
2
3
4
5
6
7
8
9
┌─ Informations de contact ──────────────┐
│ Email : [____________]                 │
│ Téléphone : [____________]             │
└────────────────────────────────────────┘

┌─ Adresse ──────────────────────────────┐
│ Rue : [____________]                   │
│ Ville : [____________]                 │
└────────────────────────────────────────┘
Exemple réel

Informations de contact
Adresse

Pourquoi utiliser <fieldset> et <legend> ?

  1. Organisation visuelle : Rend le formulaire plus clair et structuré
  2. Accessibilité : Les lecteurs d'écran annoncent le groupe de champs, aidant les utilisateurs malvoyants
  3. Sémantique : Indique au navigateur et aux moteurs de recherche la structure logique du formulaire
  4. Meilleure UX : L'utilisateur comprend mieux quelles informations sont demandées

Astuce CSS (optionnel)

Par défaut, <fieldset> a une bordure. Plus tard, vous pourrez la personnaliser avec CSS :

fieldset {
  border: 2px solid #4CAF50;
  border-radius: 8px;
  padding: 20px;
  margin-bottom: 20px;
}

legend {
  font-weight: bold;
  font-size: 1.2em;
  color: #4CAF50;
  padding: 0 10px;
}

1. Structure de base du formulaire

  • Créez un fichier inscription.html dans le dossier exercice-0.
  • Le formulaire doit utiliser la balise <form> avec les attributs suivants :
    • action: /submit-inscription (fictif)
    • method: POST
    • enctype: multipart/form-data (pour l'upload de fichiers)

2. Section : Informations personnelles

Créez une première section avec un <fieldset> et une <legend> intitulée "Informations personnelles".

Cette section doit contenir :

  • Civilité (boutons radio obligatoires) :
    • M.
    • Mme
    • Autre
  • Prénom (champ texte obligatoire, max 50 caractères)
  • Nom (champ texte obligatoire, max 50 caractères)
  • Date de naissance (champ de type date, obligatoire)
  • Lieu de naissance (champ texte, max 100 caractères)

Astuce

Utilisez l'attribut required pour les champs obligatoires et maxlength pour limiter la longueur.

Exemple de code pour cette section

Voici un exemple complet de comment structurer cette section avec <fieldset> et <legend> :

<fieldset>
  <legend>Informations personnelles</legend>

  <!-- Civilité avec boutons radio -->
  <div>
    <label>Civilité * :</label>
    <input type="radio" id="civilite-m" name="civilite" value="M" required>
    <label for="civilite-m">M.</label>

    <input type="radio" id="civilite-mme" name="civilite" value="Mme" required>
    <label for="civilite-mme">Mme</label>

    <input type="radio" id="civilite-autre" name="civilite" value="Autre" required>
    <label for="civilite-autre">Autre</label>
  </div>

  <!-- Prénom -->
  <div>
    <label for="prenom">Prénom * :</label>
    <input type="text" id="prenom" name="prenom" maxlength="50" required>
  </div>

  <!-- Nom -->
  <div>
    <label for="nom">Nom * :</label>
    <input type="text" id="nom" name="nom" maxlength="50" required>
  </div>

  <!-- Date de naissance -->
  <div>
    <label for="date-naissance">Date de naissance * :</label>
    <input type="date" id="date-naissance" name="date_naissance" max="2010-01-01" required>
  </div>

  <!-- Lieu de naissance -->
  <div>
    <label for="lieu-naissance">Lieu de naissance :</label>
    <input type="text" id="lieu-naissance" name="lieu_naissance" maxlength="100">
  </div>
</fieldset>

Points clés :

  • Tous les boutons radio pour "Civilité" ont le même name="civilite" (obligatoire !)
  • Chaque <input> a un id unique
  • Chaque <label> a un attribut for qui correspond à l'id de l'input
  • Les champs obligatoires ont l'attribut required
  • Les champs texte ont maxlength pour limiter la longueur

3. Section : Coordonnées

Créez une deuxième section avec un <fieldset> et une <legend> intitulée "Coordonnées".

Cette section doit contenir :

  • Adresse email (champ email obligatoire avec validation)
  • Téléphone (champ tel avec pattern français : pattern="0[1-9][0-9]{8}")
  • Adresse postale (zone de texte sur 3 lignes, obligatoire)
  • Code postal (champ texte, pattern 5 chiffres : pattern="[0-9]{5}")
  • Ville (champ texte obligatoire)
  • Pays (liste déroulante avec au moins 5 pays, France sélectionnée par défaut)

4. Section : Formation

Créez une troisième section avec un <fieldset> et une <legend> intitulée "Formation".

Cette section doit contenir :

  • Niveau d'études (liste déroulante obligatoire) :
    • Bac
    • Bac +2
    • Bac +3
    • Bac +5
    • Doctorat
  • Domaine d'études (liste déroulante obligatoire) :
    • Informatique
    • Mathématiques
    • Physique
    • Électronique
    • Autre
  • Établissement actuel (champ texte, max 100 caractères)
  • Année d'obtention du diplôme (champ number, min 1950, max 2030)

5. Section : Préférences de cours

Créez une quatrième section avec un <fieldset> et une <legend> intitulée "Préférences de cours".

Cette section doit contenir :

  • Cours souhaités (cases à cocher multiples, au moins 3 choix) :
    • Développement Web
    • Développement Mobile
    • Intelligence Artificielle
    • Cybersécurité
    • Base de données
    • Cloud Computing
  • Niveau souhaité (boutons radio) :
    • Débutant
    • Intermédiaire
    • Avancé
  • Disponibilité (sélection multiple avec <select multiple>) :
    • Lundi
    • Mardi
    • Mercredi
    • Jeudi
    • Vendredi
    • Samedi
    • Dimanche

Select multiple

Utilisez l'attribut multiple et size="7" pour afficher toutes les options.

6. Section : Documents

Créez une cinquième section avec un <fieldset> et une <legend> intitulée "Documents".

Cette section doit contenir :

  • Photo d'identité (champ file, accepte uniquement jpg, jpeg, png, max 2MB)
    • Utilisez : accept="image/jpeg,image/png"
  • CV (champ file, accepte uniquement PDF)
    • Utilisez : accept="application/pdf"
  • Lettre de motivation (zone de texte, 10 lignes minimum, avec placeholder explicatif)

7. Section : Validation et conditions

Créez une dernière section avec :

  • Mot de passe (champ password obligatoire, min 8 caractères)
    • Ajoutez un attribut minlength="8"
    • Ajoutez un pattern pour exiger au moins une majuscule, une minuscule et un chiffre
  • Confirmation mot de passe (champ password obligatoire)
  • Acceptation des conditions (case à cocher obligatoire) :
    • "J'accepte les conditions générales d'utilisation"
    • Lien vers les CGU (fictif : #cgu)
  • Newsletter (case à cocher optionnelle) :
    • "Je souhaite recevoir la newsletter hebdomadaire"
  • Commentaires supplémentaires (zone de texte optionnelle, 5 lignes)

8. Boutons d'action

En dehors de tous les fieldsets, ajoutez :

  • Un bouton Soumettre de type submit avec la classe primary
  • Un bouton Réinitialiser de type reset
  • Un bouton Sauvegarder le brouillon de type button (non fonctionnel pour cet exercice)

9. Accessibilité et conseils pratiques

Assurez-vous que votre formulaire respecte les critères suivants :

  • Chaque <input>, <select>, et <textarea> a un <label> associé (avec for et id)
  • Les champs obligatoires ont l'attribut required
  • Les groupes de boutons radio ont le même attribut name
  • Utilisation de placeholder pour guider l'utilisateur
  • Utilisation de autocomplete approprié (ex: autocomplete="email" pour l'email)
  • Ajout d'attributs aria-describedby pour les champs avec instructions
  • Structure sémantique avec <fieldset> et <legend>

10. Validation HTML5

Utilisez les attributs de validation HTML5 suivants :

Champ Attributs de validation
Email type="email"
Téléphone type="tel" + pattern
Code postal pattern="[0-9]{5}"
Date de naissance type="date" + max="2010-01-01"
Mot de passe minlength="8" + pattern
Année type="number" + min + max

11. Tests à effectuer

Avant de soumettre, testez votre formulaire :

  • Essayez de soumettre sans remplir les champs obligatoires
  • Testez la validation de l'email (entrez un email invalide)
  • Testez la validation du téléphone (numéro français uniquement)
  • Testez la validation du code postal (5 chiffres)
  • Testez le pattern du mot de passe
  • Vérifiez que les boutons radio fonctionnent (un seul sélectionnable par groupe)
  • Vérifiez que les cases à cocher multiples fonctionnent
  • Testez le select multiple (Ctrl+clic pour sélectionner plusieurs jours)
  • Testez l'upload de fichiers (essayez un type non autorisé)

12. Livraison de l'exercice

Checklist avant de soumettre

  • Fichier créé : exercice-0/inscription.html
  • Au moins 6 <fieldset> utilisés avec <legend>
  • Tous les types de champs requis présents (text, email, tel, date, number, password, radio, checkbox, select, textarea, file)
  • Attributs de validation HTML5 appliqués
  • Tous les champs ont des <label> associés
  • Les champs obligatoires ont required
  • Les patterns de validation sont corrects
  • Le formulaire est testé dans le navigateur
1
2
3
git add .
git commit -m "feat(exercice-0): formulaire inscription HTML complet"
git push origin exercice-0

Création de la Pull Request

  1. Allez sur GitHub dans votre dépôt
  2. Cliquez sur "Compare & pull request"
  3. Titre de la PR : feat(exercice-0): formulaire inscription HTML complet
  4. Remplissez la description de la PR :

    ## Exercice 0 : Formulaire d'inscription (HTML uniquement)
    
    ### Ce qui a été réalisé
    
    - [x] Création du fichier `inscription.html`
    - [x] Structure du formulaire avec `<form>` et attributs `action`, `method`, `enctype`
    - [x] Section Informations personnelles (civilité, prénom, nom, date de naissance, lieu de naissance)
    - [x] Section Coordonnées (email, téléphone, adresse, code postal, ville, pays)
    - [x] Section Formation (niveau d'études, domaine, établissement, année)
    - [x] Section Préférences de cours (cours souhaités, niveau, disponibilité)
    - [x] Section Documents (photo, CV, lettre de motivation)
    - [x] Section Validation (mot de passe, confirmation, CGU, newsletter, commentaires)
    - [x] Utilisation de `<fieldset>` et `<legend>` pour chaque section
    - [x] Association de tous les `<label>` avec leurs `<input>` via `for` et `id`
    - [x] Attributs de validation HTML5 (required, pattern, maxlength, minlength, min, max)
    - [x] Boutons d'action (Soumettre, Réinitialiser, Sauvegarder)
    - [x] Tests de validation effectués
    
    ### Captures d'écran
    
    #### Vue du formulaire complet
    
    ![Formulaire complet](URL_de_votre_capture)
    
    #### Validation d'un champ obligatoire
    
    ![Validation champ obligatoire](URL_de_votre_capture)
    
    #### Validation email invalide
    
    ![Validation email](URL_de_votre_capture)
    
    #### Validation pattern (téléphone/code postal)
    
    ![Validation pattern](URL_de_votre_capture)
    
    #### Formulaire correctement rempli
    
    ![Formulaire rempli](URL_de_votre_capture)
    
    ### Points d'attention
    
    - Tous les types de champs HTML5 ont été utilisés (text, email, tel, date, number, password, radio, checkbox, select, textarea, file)
    - Les patterns de validation sont conformes aux spécifications françaises (téléphone: `0[1-9][0-9]{8}`, code postal: `[0-9]{5}`)
    - Le formulaire est entièrement accessible avec des labels appropriés
    - Les champs obligatoires sont clairement identifiés avec l'attribut `required`
    
    ### Questions pour l'enseignant
    
    - (optionnel) Listez vos questions ici
    
  5. Cliquez sur "Create pull request"

Captures d'écran à inclure dans votre PR

  • Vue du formulaire complet (peut nécessiter plusieurs captures si long)
  • Exemple de validation d'un champ obligatoire vide
  • Exemple de validation d'un email invalide
  • Exemple de validation d'un pattern (téléphone ou code postal)
  • Formulaire rempli correctement
Pourquoi cet exercice est important ?

Maîtriser la structure HTML des formulaires est essentiel avant d'ajouter du CSS ou du JavaScript. Cet exercice vous permet de comprendre :

  • Les différents types de champs et leurs attributs
  • La validation côté client avec HTML5
  • L'accessibilité des formulaires
  • La sémantique et l'organisation logique

Dans les exercices suivants, vous ajouterez du style CSS et de l'interactivité JavaScript à vos formulaires.