Un formulaire est défini par la balise ouvrante <form>, et doit être terminé par la balise fermante </form>, qui est obligatoire.

La balise ouvrante accepte divers attributs. Parmis ceux-ci, il y a method et action, qui sont les seuls vraiment obligatoires. Le premier sert à spécifier la méthode HTTP qui sera utilisée pour la transmission du formulaire, il n'y a que deux valeurs possibles : soit post, soit get. Le second sert à spécifier la cible du formulaire, càd le script ou la page qui collectera les données du formulaire dans le but de les traiter et/ou de les ré-afficher. Sa valeur est donc un nom de fichier ou d'exécutable, avec le chemin relatif ou absolu qui permet de l'atteindre...

exemples :
<form method="post" action="script.php"></form>
<form method="get" action="traitement.asp"></form>
<form method="post" action="http://www.killeak.net/cgi-bin/script.exe"></form>
<form method="post" action="../cgi/script.bat"></form>

Autres attributs de <form>

Autre attribut utile dans les formulaires, mais facultatif, name permet de donner un nom au formulaire, ce qui peut être très pratique pour les fonctions JavaScript, ou tous simplement pour avoir une syntaxe propre et une organisation intelligente de ces pages ; l'autre attribut, lui aussi facultatif, est target, qui permet de spécifier le nom du cadre ou de la fenêtre dans lequel doit s'exécuter le script (celui renseigné dans l'attribut action). Ce second paramètre accepte les valeurs _blank, _self, _parent ou tous noms de frame ou d'iframe valide...

exemples :
<form name="connexion" method="post" action="login.php"></form>
<form name="action_exterieure" method="post" action="http://www.killeak.net/cgi-bin/process.exe" target="_blank"></form>

Attention, avertissement ! Attention ! Si votre formulaire intègre des fonctionnalités de téléchargement de fichiers, vous devez rajouter un attribut qui permet de spécifier que le formulaire gère une sorte d'encodage multi-format (à la fois des données saisies dans les champs en même tant que des éléments binaires...). Cet attribut est enctype. Il accepte les valeurs standard "text/html", "text/css", "text/javascript", "text/vbscript", "text/plain" et enfin "multipart/form-data", de loin la plus utilisée...

exemple :
<form name="telecharge" method="post" action="upload.php" enctype="multipart/form-data"></form>

Prise en charge de CSS

Bien sûr, les formulaires peuvent être soumis aux feuilles de style, que ce soit CSS 1 ou CSS 2, ils acceptent donc les attributs class et id.

exemples :
<form name="connexion" method="post" action="login.php" class="css_connexion"></form>
<form name="connexion" method="post" action="login.php" id="connect"></form>

En résumé <form
method="post|get"
action="{nom du script}"
[ name="{nom du formulaire}" ]
[ target="_self|_blank|_parent|{nom de cible}" ]
[ enctype="text/html|text/css|text/javascript|text/vbscript|text/plain|multipart/form-data" ]
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]
>...</form>

éléments de formulaire


Les éléments de saisie : <input />

Les éléments <input /> font partie des balises dites orphelines, càd qui n'ont pas de balise fermante. La spécification W3C recommande donc de les clôturer en rajoutant un espace et une barre oblique...

Les zones de texte
Sans doute l'élément de saisie le plus répandu. Dès lors qu'il y a un formulaire, vous pouvez être sûr(e) qu'il y en a au moins un ;-) Il permet à un utilisateur de saisir une petite quantité de texte.

Votre identifiant :<br />
<input type="text" name="identifiant" value="" /><br />
Votre identifiant :


Il existe divers attributs, qui peuvent être appliqués à la plupart des balises <input />. Parmis celles-ci, size permet de définir une largeur, mais il est préférable de passer par les CSS pour définir proprement la largeur souhaitée, et définir plus facilement, et plus proprement, d'autres effets tels que couleurs et bordures...

Votre identifiant :<br />
<input type="text" name="identifiant" value="" size="30" /><br />
Votre identifiant :


L'attribut maxlenght permet de spécifier la longueur maximale que l'élément pourra accueillir ; cette valeur est spécifiée en nombre de caractères, mais attention, certains navigateurs n'en tiennent pas compte...

Code postal (5 caratères maxi) :<br />
<input type="text" name="zonedetexte" value="" size="10" maxlength="5" /><br />
Code postal (5 caratères maxi) :


Les mots de passe
Afin de permettre à vos utilisateurs de saisir une donnée confidentielle, comme un mot de passe, la classe password permet de masquer ce qui est saisi, en affichant à la place des étoiles, ronds, croix ou tout autre caractère (selon le navigateur utilisé).
Dans l'exemple ci-dessous, le mot de passe est écrit en clair dans le code source, c'est toto, mais il n'est pas lisible lors de l'affichage.
Attention, avertissement ! Attention ! Le mot de passe n'est ni crypté ni encodé, juste masqué à l'affichage... Lorsqu'il sera transmis par les méthodes GET ou POST, il sera récupéré en clair...

Votre mot de passe :<br />
<input type="password" name="motdepasse" value="toto" /><br />
Votre mot de passe :


Les boutons radio ou boutons bascule
Un bouton radio permet de basculer de l'une à l'autre des valeurs proposées, et pour que cela puisse se faire, il est impératif que les différents boutons aient le même nom.

Avez-vous un animal de compagnie :<br />
<input type="radio" name="animal" value="1" /> Oui<br />
<input type="radio" name="animal" value="0" /> Non<br />
Avez-vous un animal de compagnie :
Oui
Non

Une fois une valeur choisie, il n'est plus possible de la déselectionner, sauf si il existe un autre cercle d'option pour servir de valeur d'échappement.
Pour préselectionner une valeur, vous devez utiliser l'attribut checked, qui prends pour valeur "checked" et rien d'autre... Ce sera évidemment la valeur effectivement cochée lorsque le formulaire sera validé qui sera utilisée, elle peut bien sûr être différente de celle de départ ;-)

Voulez-vous répondre à notre questionnaire ?<br />
<input type="radio" name="animal" value="1" checked="checked" /> Oui<br />
<input type="radio" name="animal" value="0" /> Non<br />
Voulez-vous répondre à notre questionnaire ?
Oui
Non

Les cases à cocher
Les cases à cocher sont des éléments un petit peu spéciaux des formulaires, car ils répondent à des contraintes très spécifiques... Si, contrairement au bouton radio, on peut annuler le cochage, seuls les éléments effectivement cochés sont réceptionnés après validation du formulaire, et encore, par défaut avec la valeur logique "on" (pour dire "allumé"). On peut heureusement spécifier une valeur propre...
Attention, avertissement ! Attention ! Si vous voulez autoriser les gens à choisir plusieur valeurs, voire toutes, il faut faire suivre le nom de vos cases à cocher par une paire de crochets et en utilisant toujours le même nom, ce qui permet de dire que l'ensemble de vos cases cochées seront un tout (sous la forme d'une variable de type array, un tableau)...

Si vous avez un animal de compagnie, quel(s) est(sont)-il(s) :<br />
<input type="checkbox" name="type_animal[]" value="chat" /> un chat<br />
<input type="checkbox" name="type_animal[]" value="chien" /> un chien<br />
<input type="checkbox" name="type_animal[]" value="hamster" /> un hamster<br />
<input type="checkbox" name="type_animal[]" value="poisson" /> un poisson rouge<br />
<input type="checkbox" name="type_animal[]" value="autre" /> autre(s)<br />
Si vous avez un animal de compagnie, quel(s) est(sont)-il(s) :
un chat
un chien
un hamster
un poisson rouge
autre(s)

Pour préselectionner une valeur, vous devez utiliser l'attribut checked, qui prends pour valeur "checked" et rien d'autre... Ce seront évidemment les seules cases effectivement cochées lorsque le formulaire sera validé qui seront utilisés, elle peut bien sûr être différente de celle de départ ;-)

Approuvez-vous les clauses abusives de ce <abbr lang="fr" title="Contrat de Licence Utilisateur Final">CLUF</abbr> M****$**t ?<br />
<input type="checkbox" name="abusdeposition" value="voui" checked="checked" /> Oui, je suis un pigeon.<br />
Approuvez-vous les clauses abusives de ce CLUF M****$**t ?
Oui, je suis un pigeon.

En résumé <input
type="text|password|radio|checkbox|submit|reset|file|hidden|image|button"
name="{nom du champ}"
value="[ {valeur} ]"
[ checked="checked" ]
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]
/>


Listes & listes déroulantes : <select> ... </select>

Les listes déroulantes sont des éléments très répandus à la fois sur internet et dans les logiciels courants, elles permettent de mettre dans un minimum de place un très grand nombre d'items, ce que les boutons radio ou les cases à cocher ne permettent pas forcément. Leur comportement est différent de celui des <input />. D'une part, la balise d'ouverture s'écrit <select>, et prends les attributs de base tels que le nom, la classe, l'identifiant (name, class, id) et quelques autres que nous verront plus bas. Ensuite, elle nécessite une balise fermante </select>, et c'est avant cette fermeture que s'intercaleront un certain nombre de couples de balises <option> et </option>, qui désignent les sous-éléments, ou plutôt les composants, de la liste. Ce sont les tags <option> qui gèrent l'attribut value.

Dans quelle tranche d'âge vous situez-vous ?<br />
<select name="age">
<option value=""></option>
<option value="0018">moins de 18 ans</option>
<option value="1825">18-25 ans</option>
<option value="2535">25-35 ans</option>
<option value="3550">35-50 ans</option>
<option value="5060">50-60 ans</option>
<option value="6080">60-80 ans</option>
<option value="8099">plus de 80 ans</option>
</select><br />
Dans quelle tranche d'âge vous situez-vous ?


Dans ce premier exemple, la ligne <option value=""></option> créé une ligne blanche, soit en quelque sorte une valeur d'échappement si aucun élément ne nous concerne (ce qui n'est pas vrai dans cet exemple précis, mais cela peut arriver...). On peut indiquer une valeur sélectionnée par défaut à l'aide de l'attribut selected et de son unique et systématique valeur "selected".

Dans quelle tranche d'âge vous situez-vous ?<br />
<select name="age">
<option value=""></option>
<option value="0018" selected="selected">moins de 18 ans</option>
<option value="1825">18-25 ans</option>
<option value="2535">25-35 ans</option>
<option value="3550">35-50 ans</option>
<option value="5060">50-60 ans</option>
<option value="6080">60-80 ans</option>
<option value="8099">plus de 80 ans</option>
</select><br />
Dans quelle tranche d'âge vous situez-vous ?


Il est aussi possible de faire des regroupement d'options au sein de groupes, ce qui permet de faire des recoupements logiques d'une part, mais aussi de mettre en avant certaines informations sans pour autant que celles-ci soient sélectionnables. En effet, le contenu des balises <optgroup> et son pendant fermant </optgroup> ne peut pas être choisi comme valeur, mais les différentes <option> à l'intérieur le peuvent, et apparaîssent légèrement décalées par rapport à leur homologues situées en dehors des groupes d'options...
Attention, avertissement ! Attention !, pour apparaître, le groupe d'options <optgroup> doit avoir son attribut label renseigné avec une petite chaîne de caractères, une description plus longue pouvant être donnée via l'attribut facultatif title, qui apparaîtra en info-bulle en survolant le libellé du groupe...

Quel est votre opérateur/forfait de téléphonie mobile ?<br />
<select name="operateur">

<option value=""></option>
<optgroup label="Bétonneur Télécom">

<option value="cnp">Carte nomadisme pré-payée</option>
<option value="ptf">P'tit forfait</option>
<option value="mxf">Maxi forfait</option>
<option value="fvr">Forfait verrouillé</option>

</optgroup>
<optgroup label=
"Orônge">

<option value="ocp">Carte pré-payée</option>
<option value="opr">Orônge pour pro</option>
<option value="oje">Orônge pour jeune</option>
<option value="ots">Orônge pour tout les autres</option>

</optgroup>
<optgroup label=
"Hesse-Eff-Ere">

<option value="cpp">Carte pré-payée</option>
<option value="fch">Forfait cher</option>
<option value="fjf">Forfait pour jeune fauché</option>
<option value="fpr">Forfait pro</option>

</optgroup>
<option value=
"otr">Autre opérateur/forfait</option>

</select>
Quel est votre opérateur/forfait de téléphonie mobile ?

Une liste peut aussi ne pas être déroulante, et pouvoir permettre le choix de plusieurs valeurs, un peu de la même façon que les cases à cocher d'ailleurs. Il suffit de renseigner l'attribut multiple et son unique et systématique valeur "multiple", de rajouter une paire de crochets après le nom du <select>, et le tour est joué. L'attribut facultatif size permet de limiter à un certain nombre la quantité d'éléments affichés avant que la barre de défilement vertical ne prenne le relai...

Quel(s) achat(s) envisagez-vous dans les prochains mois ? (au moins une réponse, plusieurs possibles)<br />
<select name="achats[]" multiple="multiple" size="5">
<option value="mobile">Téléphone portable</option>
<option value="mp3">Baladeur Mp3</option>
<option value="pc">PC</option>
<option value="tvhd">TV Plasma HD</option>
<option value="hifi">Chaîne Hi-Fi</option>
<option value="voiture">Voiture</option>
<option value="maison">Appartement/maison</option>
<option value="bateau">Bateau</option>
</select><br />
Quel(s) achat(s) envisagez-vous dans les prochains mois ? (au moins une réponse, plusieurs possibles)


En résumé <select

name="{nom de la liste}"
[ multiple="multiple" ]
[ size="{nombre}" ]
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]

>

<option

value="[ {valeur} ]"
[ class="{classe(s) css}" ]
[ selected="selected" ]

>[ {label d'option} ]</option>
<optgroup

label="{label de groupe}"
[ title="{titre contextuel}" ]
[ class="{classe(s) css}" ]

>

[ <option [ ... ]>[ ... ]</option> ]

</optgroup>
[ <option [ ... ]>[ ... ]</option> ]

</select>


Zones de texte étendues : <textarea>




Compléments


Zones de champs

Ces balises spécifiques vous permettent de faire des regroupements, donc du rangement et de l'ordonnancement, de vos différents éléments de formulaire. Ces zones sont caractérisées par des filets tout autour de la zone de champs, et peuvent être munies d'un titre. Les feuilles de style permettent de jouer sur les styles et attributs de texte, de bordures, et de tout ce que vous voulez ;-) Il s'agit du tag <fieldset> et de son pendant fermant </fieldset>, qui peut avoir une légende grâce au couple <legend> </legend>.

<fieldset>
<legend>
Titre de la zone de champs</legend>
</fieldset>
Titre de la zone de champs

Bien sûr, on peut imbriquer les <fieldset> entre eux, mettre des calques (<div>) ou des tables (<table>) à l'intérieur, etc, etc...

Labels cliquables

Une petite astuce qui peut augmenter la convivialité de vos formulaires. Vous avez sans doute remarqué que dans les boîtes de dialogue des logiciels, il n'est pas nécessaire de cliquer sur une case à cocher ou sur le bouton radio en lui-même, le simple fait de cliquer sur le texte sélectionne l'item correspondant... Et bien il est tout à fait possible de faire cela dans un formulaire HTML...
Il suffit dans un premier temps de renseigner pour chaque élément du formulaire son attribut id, et de leur donner un nom unique (même pour les boutons bascule, car il doit y avoir un label par valeur). Dans un deuxième temps, il faut encadrer chaque texte descriptif par des balises <label> et </label>, et pour la balise ouvrante, renseigner l'attribut for, qui prend donc le fameux nom de l'id. Si ce n'est pas très clair, voyez les exemples ci-après :

Vous êtes :<br />
<input type="radio" name="sexe" value="h" id="homme" /> <label for="homme">un homme</label> <input type="radio" name="sexe" value="f" id="femme" /> <label for="femme">une femme</label> <input type="radio" name="sexe" value="-" id="sexe_nc" /> <label for="sexe_nc">ne voulez pas le dire</label>.<br />
Vous êtes :
.

Synthèse <!-- début de formulaire -->
<form

method="post|get"
action="{nom du script}"
[ name="{nom du formulaire}" ]
[ target="_self|_blank|_parent|{nom de cible}" ]
[ enctype="text/html|text/css|text/javascript|text/vbscript|text/plain|multipart/form-data" ]
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]

>

<!-- début de zone de champs -->
<fieldset [...]>

<!-- légende de zone de champs -->
<legend [...]>Légende de zone de champs</legend>


<!-- élément(s) de saisie de texte mono-ligne, boutons, etc... -->
<input

type="text|password|radio|checkbox|submit|reset|file|hidden|image|button"
name="{nom du champ}"
value="[ {valeur} ]"
[ checked="checked" ]
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]
[ src="chemin/image.ext" ]

/>


<!-- zone de texte multi-ligne -->
<textarea

name="{nom du champ}"
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]
[ rows="{nombre de lignes}" ]
[ cols="{nombre de colonnes}" ]

>[ {contenu de la zone de texte long} ]

</textarea>


<!-- liste d'options -->
<select

name="{nom de la liste}"
[ multiple="multiple" ]
[ size="{nombre}" ]
[ class="{classe(s) css}" ]
[ id="{identifiant}" ]

>

<!-- une option de la liste -->
<option

value="[ {valeur} ]"
[ class="{classe(s) css}" ]
[ selected="selected" ]

>[ {label d'option} ]</option>

<!-- groupe(s) d'options au sein de la liste -->
<optgroup

label="{label de groupe}"
[ title="{titre contextuel}" ]
[ class="{classe(s) css}" ]

>

<!-- option(s) au sein d'un groupe -->
[ <option [ ... ]>[ ... ]</option> ]

</optgroup>

<!-- autres options au sein de la liste -->
[ <option [ ... ]>[ ... ]</option> ]

</select>


<!-- fin de zone de champs -->
</fieldset>


<!-- fin de formulaire -->
</form>