TD5 Les formulaires.
Introduction
Nous allons ajouter un formulaire d’inscription à notre site de fans de
Chuck Norris, en utilisant la balise <form>
. Cette balise
<form>
nous permettra d’avoir des réponses à des questions des plus ouvertes
(“Que voulez-vous dire à Chuck ?”) aux plus fermées (“Parmi ces trois choix
quel est votre sport favori ?”, “Quel est votre sexe ?” … ). Il y a
beaucoup de types de questions, correspondant chacune à un type de balises
<input>
ou <textarea>
que nous verrons par la suite.
La balise <form>
et les balises <input>
Le coeur du formulaire est constitué par deux types de balises : <form>
et
<input>
.
La balise <form>
délimite le contenu du formulaire et renseigne plusieurs
attributs nécessaires au fonctionnement du formulaire :
-
method
: nom de la méthode HTTP utilisée pour envoyer les données. Peut prendre pour valeurpost
ouget
:-
get
envoie les données comme composantes de l’URL du serveur et requiert par conséquent que :- les données soient encodées pour être compatibles avec les spécifications URL,
- l’ensemble des données du formulaire plus l’URL du serveur forment une chaîne de caractères de moins de 2000 caractères (limite imposée par certains navigateurs).
-
post
envoie les données dans le corps de la requête HTTP et ne présente pas la limitation de taille, elle est donc à privilégier.
-
-
action
: URL du serveur où les données du formulaire doivent être envoyées.
La balise <input>
permet de définir différents champs dans lesquels
l’utilisateur peut entrer des données. Ces champs offrent plus ou moins de
liberté d’expression selon le type utilisé. La balise <input>
a pour attributs:
type
: définit l’apparence visuelle du champ et la nature des données qui peuvent y être renseignées.value
: la valeur envoyée au serveur. Si elle est déjà renseignée lors de la création du formulaire, elle fait office de valeur par défaut.name
: le nom que prendra la donnée envoyée au serveur. Si l’input a pourname
“firstname” et pour valeur “Éric”, dans le cas d’une methodget
l’URL lors la soumission du formulaire contiendra ‘firstname=Éric’ et si la méthode estpost
ces valeurs seront transmises via les champsForm Data
de la requête HTTP.
Afin de pouvoir être envoyé, votre formulaire doit obligatoirement contenir une
balise <input>
avec l’attribut type
fixé à “submit”
. Cette balise définit
le bouton qui déclenchera l’envoi des données au serveur lorsque l’on cliquera
dessus.
Nous allons voir comment est envoyée la valeur d’un <input>
lorsque l’on soumet un formulaire.
-
Créez une nouvelle page
inscription.html
au site de Chuck Norris. Cette page va contenir le formulaire d’inscription au fan-club de Chuck que nous allons construire dans ce TD. -
Ajoutez à la page
inscription.html
le formulaire suivant :<form action="sendToMySecondYearInIut.php" method="post"> <input name="uname" type="text" > <input type="submit" value="Envoyer"> </form>
-
Sous Chrome relativement récent uniquement : Affichez la page et ouvrez la console (F12) pour aller sur l’onglet ‘Réseau’, cocher la case “Preserve log”, donnez la valeur
dupont
au champ texte, puis cliquez sur le bouton “Envoyer” du formulaire. Vous devez voir une requête contenantsendToMySecondYearInIut
dans la console. Cliquez sur cette ligne et cherchez la valeurdupont
dans les détails de la transaction. -
Donnez à l’attribut
method
du formulaire la valeurget
. Cliquez sur le bouton “Envoyer” du formulaire, l’URL doit maintenant finir par “sendToMySecondYearInIut.php?uname=dupont”.
Note : il est normal que l’URL sendToMySecondYearInIut.php
n’existe pas (le fameux code de retour HTTP 404 apparaît dans
la console), puisque vous êtes en première année. Nous verrons en deuxième année
dans le cours “Programmation Web - Côté Serveur” comment le serveur peut
récupérer les données envoyées par notre formulaire et les traiter.
La balise <label>
Il serait bien de préciser à l’utilisateur à quoi notre champ <input>
fait référence. La balise <label>
permet d’associer la question sous-tendue (“Nom?”) à l’input. Cette balise comporte un attribut for
qui doit prendre pour valeur la valeur de l’attribut id
du champ auquel est associé le label
(il faut donc penser à donner un id
à notre <input>
).
-
Remplacez le code de votre champ
<input>
par le code suivant :<label for="surname">Nom</label> <input id="surname" name="uname" type="text">
- Rajoutez au formulaire une entrée qui correspondra au prénom (calqué sur l’exemple précédent).
- Validez ce dernier et vérifiez que vos deux champs sont bien présents dans
l’URL du navigateur (l’URL doit finir par
sendToMySecondYearInIut.php?uname=dupont&firstname=super
et lamethod
du formulaire doit toujours êtreget
). - Nous vous fournissons une page Web qui vous permet de visualiser les informations envoyées par votre formulaire. Pour ceci, remplacez l’action
sendToMySecondYearInIut.php
parhttps://webinfo.iutmontp.univ-montp2.fr/~eturosenfeld/php_pour_TD5/exempleTraitement.php
. Vous apprendrez l’an prochain comment faire cela par vous-même en cours de PHP au semestre 3. - Les deux champs apparaissent les uns à la suite des autres. Avec quelle balise vue dans le TD précédent peut-on les englober pour qu’il y ait un saut de ligne entre les deux ?
Les principaux types de balises <input>
Il existe un assez grand nombre de types d’input :
- Le type
radio
permet de ne sélectionner qu’une seule des options possibles. - Le type
checkbox
(case à cocher) permettent de sélectionner autant d’options que l’utilisateur le souhaite. - Le type
password
masque automatiquement les caractères entrés. - Les types
email
,URL
,tel
,date
,time
etnumber
, etc. permettent d’adapter le clavier virtuel quand la page est affichée sur un smartphone. Suivant le navigateur, une présentation différente peut être associée. Des validateurs sont associés à ces champs (nous le verrons plus loin), une valeur de champ email doit par exemple contenir un “@”.
A l’aide de w3schools, ajoutez dans le formulaire les <input>
libellés :
- “Sexe” avec les deux valeurs que vous connaissez.
- “Date de naissance” avec le type d’input
date
. - “Mot de passe” avec le type d’input
password
. - “Email” avec le type d’input de type …
email
. - “Niveau en karaté” avec le type d’input
number
allant de 0 à 5. - “Niveau d’engagement” avec un choix parmi trois valeurs libellées “Basique (5 €) “, “Gold (15 €)” et “Tatane in your face (50 €)”.
- “J’ai bien lu les clauses que je n’ai pas lues” associé à une case à cocher.
- Vérifier par envoi du formulaire que tous les champs sont bien renseignés, on rappelle que c’est l’attribut
name
de l’input qui est utilisé. - Faite en sorte qu’il y ait un saut de ligne entre chaque
<input>
(comme dans le dernier exercice de la section précédente).
Notes :
-
Certains de ces inputs sont issus de la norme HTML5. De fait leurs adoptions au sein des navigateurs n’est pas uniforme. Les développeurs web peuvent être amenés à demander la nature du parc informatique cible du site web qu’ils doivent implémenter (en clair ils demandent : “quelle est la version d’Internet Explorer encore en cours sur votre parc ?”). Le site caniuse.com permet ensuite de savoir si nous pouvons utiliser tel ou tel aspect pour la réalisation d’un site. Les types
date
ettime
par exemple sont plus ou moins bien supportés par les navigateurs. Le typenumber
l’est un peu plus. Vous pouvez constater quelques différences d’apparence dans votre formulaire suivant si vous êtes sur Chrome, Firefox, Internet Explorer ou Edge. -
A propos du mot de passe, remarquez que ce dernier apparaît en clair dans l’URL si vous êtes en
get
lors de l’envoi via àsendToMySecondYearInIut.php
. Définitivement donc, un envoi avecpost
doit être privilégié, même si cela n’augmente pas vraiment la sécurité puisque le mot de passe transite toujours en clair sur le réseau (utilisez l’onglet Réseau comme dans l’exercice 1 pour le voir).
La balise <select>
Voyons maintenant un autre élément important d’un formulaire, correspondant à la balise <select>
.
Il permet de choisir parmi un ensemble de valeurs présentées par un menu déroulant.
Tout comme <input>
, cet élément peut aussi être libellé via un <label>
. La liste déroulante permet de base de ne sélectionner
qu’une option.
Plusieurs options peuvent être sélectionnées si l’attribut multiple
est ajouté à la balise <select>
. Il faudra alors adapter l’attribut name
pour que le résultat soit stocké dans un tableau. Par exemple, name=reponse
doit devenir name=reponses[]
, et les crochets indique que le serveur récuperera les réponses dans un tableau.
Des groupes de choix peuvent être proposés avec la balise <optgroup>
.
A l’aide de developer.mozilla.org :
-
Ajoutez un
<select>
libellé “Pays d’origine” qui prend comme valeur de paysU.S.A
,France
,Chine
etViêt Nam
, lesvalues
associées ne doivent pas dépendre de la langue du formulaire (lavalue
associée àFrance
doit êtrefr
par exemple). L’utilisateur ne peut pas sélectionner plusieurs valeurs, le pays sélectionné par défaut est la France (indépendamment de l’ordre des balises<option>
dans le HTML). -
Ajoutez à la suite de ce champ un autre sélecteur libellé “Arts-martiaux préférés”. Les valeurs sont “Kung fu” , “Karaté” et “Full-contact”. L’utilisateur peut sélectionner plusieurs valeurs.
La balise <textarea>
La balise <textarea>
permet de proposer une grande zone de texte pour que l’utilisateur puisse
s’exprimer.
- Ajoutez un champ à votre formulaire libellé “Message pour Chuck” associé à un
<textarea>
sur lequel l’utilisateur peut s’épancher.
La balise <fieldset>
La balise <fieldset>
permet de regrouper visuellement différents champs <input>
.
A l’aide de cette page, regroupez les champs sur ces trois grands axes suivant :
- “Informations personnelles” (contenant “Nom”, “Prénom”, “Email”, etc.),
- “Les sports de combat” (contenenant “Sport de combat préféré”” et “Niveau en karaté”),
- “Inscription” (contenant “Message personnel à Chuck”, “Mot de passe”, la coche “J’ai bien lu..”, “Niveau d’engagement’, etc.).
Ergonomie et convivialité
Navigation
Pour les utilisateurs avancés, la navigation à l’aide de la touche “tabulation” permet de parcourir très vite le formulaire. L’attribut “autofocus” permet de spécifier au navigateur quel élément du formulaire doit avoir le focus quand la page est chargée. L’attribut “tabindex” permet de spécifier l’ordre dans lequel les éléments sont parcourus en appuyant sur “tabulation”.
- Vérifiez que vous pouvez accéder à tous les champs avec la touche tabulation. Modifier l’ordre de tabulation avec la propriété “tabindex”.
Convivialité
Quelques attributs permettent d’améliorer la convivialité des champs de votre formulaire :
-
placeholder
: permet d’afficher une ligne de texte dans le champ qui disparaît dès lors que l’utilisateur tape une information. Cela permet de donner à l’utilisateur des renseignements sur le contenu attendu. À utiliser impérativement avec les champs pour lesquels vous avez spécifié un “pattern”, sous peine de cause une extrême frustration à l’utilisateur. Vous devez alors utiliser l’attributplaceholder
pour spécifier le format attendu, les caractères interdits/autorisés, etc.ex : placeholder=“Entrez votre nom ici.”
-
checked
/selected
: pour les types “radio” et “checkbox”, et pour<option>
respectivement. Cet attribut permet de spécifier que l’option en question est sélectionnée/cochée par défaut. Utile quand vous savez que l’une des options sera utilisée beaucoup plus fréquemment que les autres. Vous épargnez alors du temps à l’utilisateur.
- Ajoutez un placeholder de valeur “yourmail@domain.com” au champ Email.
- Ajoutez un attribut
placeholder
dans le<textarea>
avec le texte suivant “Un inscrit sera tiré au sort, et verra son message transmis à Chuck Norris.”
Note : Il existe depuis peu un pseudo attribut css ::placeholder
, mais celui-ci est moins bien supporté que
l’attribut.
Contrôle du contenu
La sécurité de votre serveur et de vos utilisateurs impose que vous contrôliez toujours au niveau du serveur les données entrées (cf. cours l’an prochain). Toutefois, le contrôle par le serveur demande que les données soient envoyées, que le serveur teste, puis réponde ; l’opération peut être longue.
Afin d’éviter une attente inutile aux utilisateurs de votre formulaire, vous pouvez demander au navigateur d’effectuer directement certains tests de validation, afin de prévenir les erreurs courantes (ex : mauvais numéro de téléphone, mauvaise date…). Attention : cela ne vous dispense quand même pas de procéder aux vérifications côté serveur ! Deux attributs permettent de vérifier le contenu du formulaire :
required
: spécifie que le champ doit être obligatoirement rempli. Attribut à ajouter à tous les champs dont la légende comporte une *pattern
: attribut spécifique aux champs “libres”, il permet de spécifier une expression régulière. Cette chaîne de caractère au format particulier indique au navigateur tous les formats d’entrée autorisés pour le champ et le navigateur refusera d’envoyer le formulaire si un champ n’est pas correctement rempli. Par exemple, un “pattern” égal à0[1-9](\.\d{2}){4}
permettra de s’assurer qu’un numéro de téléphone respecte bien les règles de numérotation françaises, tandis que le pattern[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4}
bloquera les erreurs d’adresse email les plus grossières. Note : les patterns HTML sont automatiquement évalués sur la totalité de l’entrée. Il est donc inutile de les encadrer entre ^ et $ comme une expression régulière classique.
- Rendre la coche “J’ai bien lu les clauses que je n’ai pas lues” obligatoire. Vérifiez si l’envoi du formulaire est bien impossible alors.
- Rendre aussi les champs “Nom” “Mot de passe” et “Email” obligatoires.
- Par convention d’usage, le nom des champs obligatoires est suivi d’une “*”. Ajoutez la aux labels des
<input>
obligatoires. - Ajoutez au champ password un pattern pour que ne soient acceptés que des caractères de l’alphabet latin ou numériques.
- Faites en sorte que le mot de passe acceptable soit d’une longueur de 8 caractères minimum.
Note : Pour être toujours protégé contre les bugs lorsque vous cogitez sur une expression régulière, ne sortez jamais sans votre Regulex. Regulex, le visualisateur de machine d’état qu’il vous faut pour vos expressions régulières.