<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title>Openweb.eu.org - Utilisation des formulaires</title>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
    <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
    <meta name="DC.Language" scheme="RFC3066" content="fr" />
    <meta name="DC.Identifier" content="formulaire_accessible" />
    <meta name="DC.Creator" content="Eric Daspet" />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2003-12-17" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2003-12-17" />
    <meta name="DC.Subject" content="debutant, expert, xhtml, accessibilite" />
  </head>
  <body>
    <h1>Utilisation des formulaires</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/debutant/">Débutant</a>, <a href="/expert/">Expert</a>
      </li>
      <li>
        <strong>Technologie :</strong> <a href="/xhtml/">(X)HTML</a>
      </li>
      <li>
        <strong>Thème :</strong> <a href="/accessibilite/">Accessibilité</a>
      </li>
      <li>
        <strong>Auteur :</strong> Eric Daspet</li>
      <li>
        <strong>Mise à jour :</strong> 17/12/2003</li>
    </ul>
    <h2>En bref</h2>
    <p>Les formulaires sont souvent utilisés mais parfois de manière peu
      souhaitable ou peu accessible. Cet article est là pour faire un tour
      d'horizon des possibilités et des bonnes habitudes. Il peut être
      autant utile au débutant cherchant à comprendre les formulaires qu'au
      confirmé cherchant quelques notions d'accessibilité.</p>
    <hr />
    <p>
      <acronym title="HyperText Markup Language" lang="en">HTML</acronym> permet, via
    des objets nommés "formulaire", d'interagir avec l'utilisateur
    au-delà des simples liens de navigation. Il est possible de faire faire des
    choix à l'utilisateur ou de lui demander de remplir des informations. Une
    fois le formulaire rempli, il est envoyé par le navigateur et analysé par
    un programme sur le serveur Web. Parmi leurs utilisations courantes on peut noter :</p>
    <ul>
      <li>Récupérer des informations sur l'utilisateur (par exemple
      nom/prénom) ;</li>
      <li>Procéder à des authentifications ;</li>
      <li>Permettre à l'utilisateur de contribuer à un site (via des
      forums par exemple) ;</li>
      <li>Opérer des recherches ou sélections sur le site ;</li>
      <li>etc.</li>
    </ul>
    <p>Les exemples décrits plus bas sont faits en <a href="http://www.la-grange.net/w3c/xhtml1/" title="XHTML 1.0 : Le langage de balisage hypertexte extensible">
        <acronym title="eXtensible HyperText Markup Language" lang="en">XHTML</acronym>
    1.0</a>.</p>
    <h3>Définir un formulaire simple</h3>
    <h4>Délimitation</h4>
    <p>Un formulaire est délimité par la balise
      <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html" title="HTML 4.01 - Les formulaires">
        <code>form</code>
      </a>.
    La délimitation permet d'en mettre plusieurs indépendants sur
    une même page et d'en définir les paramètres généraux d'envoi. Si plusieurs formulaires peuvent exister sur une page, il est
    interdit de les imbriquer : une même zone ne peut être contenue que
    par un et un seul formulaire. La balise contient un attribut obligatoire
    nommé <code>action</code>, dont nous verrons plus loin l'utilité.</p>
    <h4>Emplacement dans la page et structure</h4>
    <p>La balise de formulaire n'est qu'un délimiteur, elle est
    destinée à recevoir des éléments de <a href="http://www.la-grange.net/w3c/html4.01/struct/global.html#h-7.5.3" title="HTML 4.01 - Les éléments de bloc et les éléments en-ligne">niveau bloc</a> et
    non du contenu dit "en-ligne" (pour plus d'informations, voir l'article <a href="http://openweb.eu.org/articles/initiation_display/">Boîtes bloc, boîtes en ligne et propriété display</a>). Elle est donc elle-même une balise de type bloc, et à ce titre ne peut pas être incluse dans un paragraphe (ou autre élément qui n'accepte que le contenu en-ligne).</p>
    <p>Pour pouvoir y insérer des éléments comme des cases à cocher ou du texte (qui sont du contenu en-ligne), vous devrez les regrouper dans une balise comme <code>&lt;p&gt;</code> (paragraphe), <code>&lt;li&gt;</code> (élément de liste) ou <code>&lt;div&gt;</code> (balise de type bloc qui accepte le contenu en-ligne).</p>
    <pre>
&lt;div&gt;
  &lt;form action="..."&gt;
    &lt;p&gt;texte&lt;/p&gt;
  &lt;/form&gt;
&lt;/div&gt;
      </pre>
    <h4>Champs de données</h4>
    <p>Commençons d'abord par demander le nom du visiteur. Pour qu'il
    puisse l'inscrire nous allons créer un champ (balise
    <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-INPUT" title="HTML 4.01 - L'élément INPUT">
        <code>input</code>
      </a>)
    de type texte (attribut <code>type="text"</code>). À
    l'affichage le visiteur aura une zone de saisie simple où il pourra
    écrire du texte.</p>
    <pre>
&lt;input type="text" value="exemple" /&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#texte">Exemple de champ texte</a>.</p>
    <h4>Description du champ</h4>
    <p>Afin que l'utilisateur puisse savoir à quoi sert ce champ de texte
    il est nécessaire de lui donner une légende ou un titre. Les descriptions
    de champs sont faites à l'aide de la balise
	<a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-LABEL" title="HTML 4.01 - L'élement LABEL">
        <code>label</code>
      </a>.</p>
    <p>Cette balise est souvent oubliée mais est indispensable à la compréhension
    de votre formulaire pour de nombreuses personnes employant des méthodes de
    navigation alternatives. Sans elle, ces personnes seront dans
    l'impossibilité de comprendre le rôle de chaque champ du formulaire,
    et donc de le remplir.</p>
    <p>Un champ correctement symbolisé facilitera d'ailleurs l'accès d'un formulaire à
      tout le monde puisque cliquer sur la légende activera le champ concerné. Pour un champ
      texte il s'agit d'y déplacer le focus clavier, pour une case à cocher cliquer sur la
      légende cochera la case. Ce sont ces petits plus qui améliorent l'ergonomie
      pour l'utilisateur final.</p>
    <p>Pour indiquer une description de champ, on inclus celle-ci entre les balises de label
      et on indique, par l'attribut <code>"for"</code>, l'id
      du champ auquel la description est rattachée, comme ceci :</p>
    <pre>
&lt;form action="..."&gt;
  &lt;p&gt;
    &lt;label for="nom"&gt;Nom :&lt;/label&gt;
    &lt;input type="text" id="nom" /&gt;
  &lt;/p&gt;
&lt;/form&gt;
      </pre>
    <p>Il existe une autre façon d'utiliser la balise <code>&lt;label&gt;</code> :
      celle d'inclure le champ de saisie entre les balises de label, en même
      temps que la description :</p>
    <pre>
&lt;form action="..."&gt;
  &lt;p&gt;
    &lt;label for="nom"&gt;
      Nom : &lt;input type="text" id="nom" /&gt;
    &lt;/label&gt;
  &lt;/p&gt;
&lt;/form&gt;
      </pre>
    <p>Dans ce cas, <em>en théorie</em>, il est possible d'omettre l'attribut
      <code>"for"</code>, mais les navigateurs ne savent pas tous
      bien gérer cette situation, en particulier Internet Explorer (il ne fait pas la
      liaison entre le champ et sa description, et donc par exemple, un clic sur le label
      ne mettra pas le focus sur le champ de saisie). Il est donc
      recommandé de toujours mettre l'attribut <code>"for"</code>.</p>
    <p>
      <a href="annexes/champs.html#label">Exemple d'utilisation de <code>&lt;label&gt;</code>
      </a>.</p>
    <h4>Désignation des champs</h4>
    <p>Le contenu du formulaire est normalement destiné à être envoyé à un
    programme sur le serveur Web. À la réception, le programme doit pouvoir
    connaître le contenu de chaque élément, donc identifier les différentes
    données. Cette identification est faite en attribuant un nom à chaque
    champ du formulaire, via l'attribut <code>"name"</code>. Cet attribut n'est
    pas unique. Vous pouvez par exemple avoir plusieurs formulaires dans une même page, certains
    ayant des champs nommés de la même façon. Le programme serveur qui interprète le formulaire
    n'aura alors pas à savoir sur quel formulaire l'utilisateur a cliqué, il interprétera les
    données uniquement à partir de leur nom.</p>
    <p>Attention à ne pas confondre le nom (attribut <code>"name"</code>)
      avec l'identifiant
      (attribut <code>"id"</code>) : le premier sert à identifier les
      données qui sont soumises, le second à identifier des éléments dans la page en cours de
      visualisation. Seul l'identifiant est unique, deux éléments peuvent envoyer une donnée
      sous le même nom. Utiliser les mêmes valeurs pour les deux attributs vous épargnera
      toutefois beaucoup d'erreurs dans vos développements.</p>
    <pre>
&lt;input type="text" name="nom" id="identifiant" /&gt;
      </pre>
    <h4>Grouper les champs</h4>
    <p>Dans un formulaire avec plusieurs zones de saisies il est généralement
    de bon ton de regrouper les champs par catégories. On peut par exemple
    séparer les quelques champs qui vous demandent des informations sur
    votre situation familiale des champs qui demandent vos coordonnées
    bancaires. L'utilisateur en retirera une meilleure compréhension du
    formulaire et de son utilisation.</p>
    <p>L'élément qui remplit ce rôle est
      <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-FIELDSET" title="HTML 4.01 - L'élement FIELDSET">
        <code>fieldset</code>
      </a>.
      Il suffit de faire délimiter les données appartenant à un même
    groupe par cette balise. Toutefois, cet élément seul ne permet que de
    grouper certaines parties du formulaire, il ne renseigne pas sur
    l'utilité de la partie en question. Vous pouvez donc rajouter un
    élément <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-LEGEND" title="HTML 4.01 - L'élement LEGEND">
        <code>legend</code>
      </a>
    à l'intérieur, son contenu servira de description au groupe.</p>
    <pre>
&lt;form action="..."&gt;
&lt;fieldset&gt;
  &lt;legend&gt;Adhérent&lt;/legend&gt;
  &lt;p&gt;&lt;label&gt;Nom : &lt;input type="text" /&gt;&lt;/label&gt;&lt;/p&gt;
  &lt;p&gt;&lt;label&gt;Prénom : &lt;input type="text" /&gt;&lt;/label&gt;&lt;/p&gt;
&lt;/fieldset&gt;
&lt;fieldset&gt;
  &lt;legend&gt;Conjoint(e)&lt;/legend&gt;
  &lt;p&gt;&lt;label&gt;Nom : &lt;input type="text" /&gt;&lt;/label&gt;&lt;/p&gt;
  &lt;p&gt;&lt;label&gt;Prénom : &lt;input type="text" /&gt;&lt;/label&gt;&lt;/p&gt;
&lt;/fieldset&gt;
&lt;/form&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#fieldset">Exemple d'utilisation de <code>&lt;fieldset&gt;</code>
      </a>.</p>
    <h3>Les autres types de données</h3>
    <p>La zone de saisie créée plus haut est intéressante mais est loin de
    couvrir tous les besoins d'une application Web. Voici une liste des
    différentes possibilités qui s'offrent à vous :</p>
    <h4>Zone de texte courte</h4>
    <p>La <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#text-input" title="HTML 4.01 - Saisie de texte">zone de
    texte courte</a> est l'élément qui a été pris en exemple plus haut. Il
    s'agit d'une balise <code>&lt;input&gt;</code> avec
    l'attribut <code>type="text"</code>. Si l'attribut
    <code>"value"</code> est présent, il donne la valeur par défaut de la zone de
    saisie (<code>&lt;input type="text" value="valeur par
    défaut" /&gt;</code>).</p>
    <p>Vous pouvez définir la taille à l'affichage en spécifiant un nombre
    de caractères dans l'attribut <code>"size"</code>. Si l'utilisateur
    rentre une donnée plus longue il ne la verra pas en entier. Plus intéressant, vous pouvez
    aussi limiter la taille de la donnée grâce à l'attribut
    <code>"maxlength"</code> : <code>&lt;input type="text"
    size="10" maxlength="20" /&gt;</code>. Faites tout de même attention au fait que cette limitation est faite pour empêcher l'utilisateur honnête de se tromper et de dépasser. Spécifier cet attribut n'empêchera pas l'utilisateur malhonnête d'envoyer une donnée trop longue volontairement.</p>
    <p>Vous trouverez aussi deux attributs vides : <code>"readonly"</code>
    et <code>"disabled"</code>. Le premier, s'il est mis, indique que le
    contenu ne peut pas être changé par l'utilisateur mais seulement
    affiché. Le deuxième indique que le champ est totalement désactivé, il
    n'est pas éditable, ne reçoit pas le focus et n'est pas transmis
    pendant l'envoi du formulaire. Pour un document <acronym>HTML</acronym> il suffit de faire
    apparaître l'attribut (<code>&lt;input type="text"
    disabled&gt;</code>). Dans un document <acronym>XHTML</acronym> les attributs
    doivent avoir une valeur, il faut alors leur donner le nom de
    l'attribut comme valeur : <code>&lt;input type="password"
    disabled="disabled" /&gt;</code>. Ces deux attributs sont
    communs à la plupart des champs de formulaire.</p>
    <h4>Mot de passe</h4>
    <p>Il existe un élément spécifique à la saisie de mot de passe. En
    spécifiant <code>type="password"</code> à la place de <code>type="text"</code> on
    obtient une zone qui affiche des étoiles à la place des caractères tapés.
    Cette saisie est appréciée pour les mots de passe, de façon à ce que
    l'assistance ne puisse pas lire à l'écran.</p>
    <p>Attention toutefois : si vous spécifiez une valeur par défaut, même si elle
	apparaîtra sous forme d'étoiles dans la plupart des navigateurs, la valeur reste
	en clair dans le code source. Cela veut dire qu'il suffit de demander au navigateur d'afficher le code source pour connaître le mot de passe par défaut. De même, quelqu'un ayant accès au cache du navigateur, ou écoutant sur le réseau, pourra connaître ce mot de passe. La procédure ne protège donc que de ceux qui regardent l'écran en même temps que l'utilisateur, mais de rien ni de personne d'autre.</p>
    <pre>
&lt;input type="password" value="en clair" /&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#password">Exemple de champ pour mot de passe</a>.</p>
    <h4>Cases à cocher</h4>
    <p>Pour des séries d'options, il est possible de définir des <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#checkbox" title="HTML 4.01 - Cases à cocher">cases à
    cocher</a> (<code>type="checkbox"</code> à la place de <code>type="text"</code>). Ces
    cases ont un fonctionnement spécial : cochées elles envoient la
    valeur définie par l'attribut <code>"value"</code>, non cochées
    elles n'envoient rien (comme si elles n'étaient pas là). Il est
    possible de définir une case comme cochée par défaut en lui ajoutant un
    attribut vide nommé <code>"checked"</code> (<code>checked="checked"</code> en XHTML).</p>
    <p>Il est fréquent de fournir une liste de cases à cocher pour poser des
    questions assez proches. N'oubliez alors pas de grouper ces
    différentes cases grâce à <code>&lt;fieldset&gt;</code> pour en
    faciliter la compréhension.</p>
    <pre>
&lt;fieldset&gt;
  &lt;legend&gt;Conditions générales&lt;/legend&gt;

  &lt;p&gt;&lt;label&gt;
    &lt;input type="checkbox" value="OK" name="condgen" /&gt;
    J'ai lu les conditions générales du service
  &lt;/label&gt;&lt;/p&gt;

  &lt;p&gt;&lt;label&gt;
    &lt;input type="checkbox" value="OK" name="spam" checked="checked" /&gt;
    J'autorise l'utilisation de mes coordonnées par la société
  &lt;/label&gt;&lt;/p&gt;

&lt;/fieldset&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#checkbox">Exemple de cases à cocher</a>.</p>
    <h4>Zones d'options</h4>
    <p>Dans une série de cases à cocher, on aime souvent que l'utilisation
    d'une case désactive les autres pour sélectionner une option parmi
    plusieurs. Ces <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#radio" title="HTML 4.01 - boutons radio">zones
    d'options</a> (aussi appelées boutons radio) sont gérées par le type
    "radio". Le fonctionnement est similaire aux cases à cocher mais
    si plusieurs cases ont le même nom (attribut <code>"name"</code>) dans le
    formulaire, une seule pourra être activée à la fois (l'activation
    d'une case désactivera les autres).</p>
    <p>Si le groupement des options lors de leur utilisation se fait par le
    nom, il est toujours conseillé de grouper aussi par <code>
          <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#h-17.10" title="HTML 4.01 - L'élement FIELDSET">&lt;fieldset&gt;</a>
        </code>
    pour permettre à l'utilisateur de prévoir ce fonctionnement et de le
    comprendre.</p>
    <pre>
&lt;fieldset&gt;
  &lt;legend&gt;Civilité&lt;/legend&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;label&gt;
      &lt;input type="radio" value="monsieur" name="civilite" /&gt;
      Monsieur
    &lt;/label&gt;&lt;/li&gt;
    &lt;li&gt;&lt;label&gt;
      &lt;input type="radio" value="madame" name="civilite" checked="checked" /&gt;
      Madame
    &lt;/label&gt;&lt;/li&gt;
    &lt;li&gt;&lt;label&gt;
      &lt;input type="radio" value="mademoiselle" name="civilite" /&gt;
      Mademoiselle
    &lt;/label&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/fieldset&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#radio">Exemple de zones d'options</a>.</p>
    <h4>Listes de sélection</h4>
    <p>Les <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#menu" title="HTML 4.01 - listes de sélection">listes
    de sélection</a> (balise
    <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-SELECT" title="HTML 4.01 - L'élement SELECT">
        <code>select</code>
      </a>)
    sont une autre manière de choisir entre plusieurs options. Quand l'attribut
    <code>"size"</code> n'est pas défini il s'agit d'une liste
    déroulante, sinon la zone est une liste de taille fixe (l'attribut
    définissant le nombre de choix à afficher à la fois). Si l'attribut
    <code>"multiple"</code> est défini il est possible pour l'utilisateur de
    choisir plusieurs options dans la liste (généralement avec les touches
    "control" et "shift" en plus de la méthode de sélection habituelle).</p>
    <p>Les différents choix possibles sont définis par les balises
      <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-OPTION" title="HTML 4.01 - L'élément OPTION">
        <code>option</code>
      </a>
    contenues dans le <code>&lt;select&gt;</code>. Chaque balise a un
    attribut <code>"value"</code> qui définit la valeur de l'option et
    contient sa description. Une option présélectionnée a de plus
    l'attribut <code>"selected"</code> de défini.</p>
    <p>Si vous pouvez facilement faire plusieurs groupes distincts dans les
    options, il vous est recommandé de les grouper grâce à l'élément
    <code>&lt;optgroup&gt;</code> afin d'aider l'utilisateur à
    s'y retrouver. Il est similaire à <code>&lt;fieldset&gt;</code> mais
    au lieu d'avoir un sous-élément <code>&lt;legend&gt;</code> il
    contient un attribut <code>"label"</code>. Ces groupes ne peuvent pas être
    imbriqués. Les navigateurs peuvent interpréter des groupes comme des sous
    menus ou comme des titres.</p>
    <pre>
&lt;select name="pays"&gt;
  &lt;optgroup label="Europe"&gt;
    &lt;option value="fr" selected="selected"&gt;France&lt;/option&gt;
    &lt;option value="it"&gt;Italie&lt;/option&gt;
  &lt;/optgroup&gt;
  &lt;optgroup label="Asie"&gt;
    &lt;option value="ch"&gt;Chine&lt;/option&gt;
  &lt;/optgroup&gt;
&lt;/select&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#select">Exemple de liste déroulante</a>.</p>
    <h4>Zone de texte longue</h4>
    <p>La zone de saisie <code>&lt;input type="text"&gt;</code> vue
    préalablement n'est adaptée que pour des courtes chaînes et ne
    permet pas d'éditer simplement des textes sur plusieurs lignes. Pour cela il existe l'élément
    <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#edef-TEXTAREA" title="HTML 4.01 - L'élement TEXTAREA">
        <code>textarea</code>
      </a>.
    L'affichage sera un cadre de texte éditable, sa taille peut être
    définie par les attributs <code>"cols"</code> (nombre de caractère par
    ligne) et <code>"rows"</code> (nombre de lignes). Le texte défini par défaut
    est celui contenu entre la balise de début et la balise de fin.
    N'oubliez pas que ce texte ne remplace pas la balise <code>&lt;label&gt;</code>.</p>
    <pre>
&lt;textarea cols="80" rows="4" name="article"&gt;
  Tapez ici votre article
&lt;/textarea&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#textarea">Exemple de zone de texte longue</a>.</p>
    <h4>Fichiers</h4>
    <p>Il vous est possible d'<a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#file-select" title="HTML 4.01 - sélection de fichier">envoyer
    des fichiers</a> via les formulaires. L'élément <code>&lt;input
    type="file" /&gt;</code> permettra à l'internaute de
    sélectionner un fichier local à envoyer. Si théoriquement l'attribut
    <code>"value"</code> peut définir l'emplacement par défaut du fichier,
    les navigateurs désactivent généralement cette possibilité pour des
    raisons de sécurité.</p>
    <p>Vous pouvez restreindre le choix à une liste de types de contenu
    autorisés séparés par des virgules, en la spécifiant dans l'attribut
    <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#adef-accept" title="HTML 4.01 - L'attribut ACCEPT">
        <code>"accept"</code>
      </a>.
    Les types de contenu sont les mêmes que ceux des entêtes <acronym title="HyperText Transfer Protocol" lang="en">HTTP</acronym>
      <code>Content-Type</code> et <code>Accept</code>.
    On y trouve en vrac <code>text/plain</code> pour les textes, <code>text/html</code>
    pour le <acronym>HTML</acronym>, 
    <code>application/xml</code> pour le 
    <acronym title="eXtensible Markup Language" lang="en">XML</acronym>, <code>image/png</code> pour
    les <acronym title="Portable Network Graphics" lang="en">PNG</acronym>, ou plus généralement
    <code>image/*</code> pour tous les types d'images. Le support par les navigateurs de
    cette propriété n'est malheureusement pas toujours très bon, il ne s'agit au plus
    que d'une aide pour l'utilisateur. Vous pouvez toutefois trouver une liste détaillée des
    types de contenu standardisés via <a href="http://www.iana.org/assignments/media-types/" title="MIME Media Types">la page de 
    l'<acronym>IANA</acronym> sur les types 
    <acronym title="Multipurpose Internet Mail Extension" lang="en">MIME</acronym>
      </a>.</p>
    <pre>
&lt;form action="..." accept="text/plain,text/html"&gt;&lt;p&gt;
  &lt;label&gt;Fichier à envoyer &lt;input type="file" /&gt;&lt;/label&gt;
&lt;/p&gt;&lt;/form&gt;
      </pre>
    <p>
      <a href="annexes/champs.html#inputfile">Exemple de soumission de fichier</a>.</p>
    <h4>Valeurs cachées</h4>
    <p>Un dernier type de champ est possible pour transférer des
    données : des <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#hidden-control" title="HTML 4.01 - champs invisibles">champs
    invisibles</a>. Ces champs sont faits pour pouvoir définir sur la page des
    valeurs qui ne changeront pas ou qui n'ont pas besoin d'interactions
    directes avec l'utilisateur. Ils seront envoyés avec le formulaire au même titre
    que les autres champs. Il vous suffit de définir un élément
    <code>&lt;input type="hidden" /&gt;</code> avec une valeur et un
    nom en attributs. Attention toutefois, ce n'est pas parce que le champ n'est pas
    visible dans le rendu que les valeurs ne peuvent pas être lues ou modifiées par
    le visiteur. Ne mettez rien de confidentiel ou ayant trait à la sécurité.</p>
    <h3>Envoi du formulaire</h3>
    <h4>Cible du formulaire</h4>
    <p>Un formulaire est habituellement destiné à être traité par un programme
    sur le serveur. L'attribut <code>"action"</code> permet de définir
    l'<acronym title="Universal Resource Identifier" lang="en">URI</acronym> où
    sera envoyé le formulaire pour traitement. Cet attribut est le seul
    obligatoire.</p>
    <p>Il existe deux manières d'envoyer le contenu d'un formulaire,
    gérées avec l'attribut <code>"method"</code> : post et get. Cette
    dernière se voit habituellement car les différentes valeurs du formulaire
    sont visibles dans l'adresse de la page résultante ; c'est
    la méthode utilisée par défaut. L'autre méthode fait passer les
    informations à envoyer dans le corps de la requête <acronym>HTTP</acronym>, et permet d'envoyer
    des informations plus conséquentes. Il vous est recommandé d'utiliser
    la méthode get quand aucune information envoyée n'est exagérément
    secrète (pas de mot de passe), que la quantité d'information est
    limitée et que deux soumissions avec les mêmes paramètres renvoient
    toujours la même information ; si un de ces trois critères
    n'est pas vérifié, vous devriez envisager la méthode post.</p>
    <pre>
&lt;form action="http://www.domaine.ext/rep/script" method="post"&gt;
  &lt;!-- contenu du formulaire --&gt;
&lt;/form&gt;
      </pre>
    <p>
      <em>Note :</em> une erreur très courante est d'écrire les valeurs de
    l'attribut <code>"method"</code> en majuscule. En fait, elles doivent
    être en minuscule : <code>method="get"</code> ou <code>method="post"</code>.</p>
    <h4>Déclenchement de l'envoi</h4>
    <p>Jusqu'à présent nous avons rempli notre formulaire mais nous
    n'avons toujours aucun élément permettant de déclencher l'envoi.
    En ajoutant un champ de type "submit" (<code>&lt;input
    type="submit" /&gt;</code>) vous obtiendrez un <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#submit-button" title="HTML 4.01 - bouton de soumission">bouton
    qui déclenche la soumission</a> des données. Le texte par défaut du bouton
    est déterminé par le navigateur, vous pouvez le changer grâce à
    l'attribut <code>"value"</code>. Si ce bouton de validation a un nom
    (attribut <code>"name"</code>) et une valeur, cette valeur sera transmise
    lors de l'envoi ; une telle fonctionnalité permet
    d'utiliser plusieurs boutons et de déterminer lequel a été utilisé.</p>
    <p>
      <a href="annexes/champs.html#submit">Exemple de bouton de soumission</a>.</p>
    <p>Il est aussi possible d'utiliser une image comme bouton
    d'envoi (<code>&lt;input type="image" /&gt;</code>). Dans ce
    cas l'adresse de l'image devra être spécifiée via l'attribut
    <code>"src"</code> et un texte alternatif devra être fourni dans
    l'attribut <code>"alt"</code>, comme une image classique. Lorsque
    l'utilisateur envoie le formulaire en cliquant sur l'image, la
    position du clic dans l'image est envoyée en plus des données
    normales. Dans ce cas, la donnée "monimage.x" est la position
    horizontale en pixel et la donnée "monimage.y" est la position
    verticale, où "monimage" est le nom du champ de formulaire
    contenant l'image. Il est aussi possible de définir les zones
    réactives de l'image grâce aux attributs <code>"ismap"</code> et
    <code>"usemap"</code>, ces propriétés fonctionnent alors comme pour les
    <a href="http://www.la-grange.net/w3c/html4.01/struct/objects.html#h-13.6.1.1" title="HTML 4.01 - Images cliquables">images
    cliquables</a> classiques.</p>
    <h4>Codage des données</h4>
    <p>Lorsqu'un formulaire est envoyé, les données sont codées de façon à
    ne pas perturber la requête HTTP. Le programme serveur qui reçoit les
    données doit pouvoir comprendre ce codage pour les relire. Vous
    pouvez, pour ce but, définir quel codage sera employé.</p>
    <p>L'attribut <code>"enctype"</code> de l'élément <code>&lt;form&gt;</code>
    défini la façon de traiter les données. Par défaut la valeur est
    <code>application/x-www-form-urlencoded</code>. Vous devrez utiliser
    <code>multipart/form-data</code> si votre formulaire contient des fichiers à envoyer
    tels quels.</p>
    <p>Pour finir, l'attribut <code>accept-charset</code> définit une liste
    de jeux de caractères utilisables pour l'envoi, séparés par des
    virgules ou espaces. Cette dernière propriété supporte des valeurs comme UTF-8
    ou ISO-8859-1 mais pour compatibilité avec les navigateurs qui ne s'en servent pas,
    il est préférable de savoir gérer n'importe quel codage et de faire des conversions
    à la volée en se basant sur les entêtes <acronym>HTTP</acronym>
    </p>
    <h3>Exemple complet</h3>
    <pre>
&lt;div&gt;
&lt;form action="destination"&gt;

  &lt;p&gt;
    &lt;label for="nom"&gt;Nom : &lt;/label&gt;
    &lt;input type="text" name="nom" id="nom" /&gt;
  &lt;/p&gt;

  &lt;p&gt;
    &lt;label for="prenom"&gt;Prénom : &lt;/label&gt;
    &lt;input type="text" name="prenom" id="prenom" /&gt;
  &lt;/p&gt;

  &lt;fieldset&gt;&lt;legend&gt;Sexe :&lt;/legend&gt;
    &lt;ul&gt;&lt;li&gt;
      &lt;input type="radio" value="H" name="sexe" id="sH"/&gt;
      &lt;label for="sH"&gt;Homme&lt;/label&gt;
    &lt;/li&gt;&lt;li&gt;
      &lt;input type="radio" value="F" name="sexe" id="sF"/&gt;
      &lt;label for="sF"&gt;Femme&lt;/label&gt;
    &lt;/li&gt;&lt;/ul&gt;
  &lt;/fieldset&gt;

  &lt;p&gt;
    &lt;label for="pays"&gt;Pays : &lt;/label&gt;
    &lt;select name="pays"&gt;
      &lt;optgroup label="Europe"&gt;
        &lt;option value="fr"&gt;France&lt;/option&gt;
        &lt;option value="it"&gt;Italie&lt;/option&gt;
      &lt;/optgroup&gt;
      &lt;optgroup label="Asie"&gt;
        &lt;option value="ch"&gt;Chine&lt;/option&gt;
      &lt;/optgroup&gt;
    &lt;/select&gt;
  &lt;/p&gt;

&lt;/form&gt;
&lt;/div&gt;
    </pre>
    <h3>Notions d'accessibilité et d'usabilité</h3>
    <h4>Descriptions</h4>
    <p>Comprendre un formulaire est souvent complexe pour des visiteurs sur
    navigateurs non graphiques. Pour ceux-ci une description complète du
    formulaire est une nécessité. Cela passe par l'utilisation de la
    balise <code>&lt;label&gt;</code> pour tous les champs, l'exploitation des
    groupes <code>&lt;fieldset&gt;</code> et <code>&lt;optgroup&gt;</code> dès que possible, mais
    aussi par la définition des zones dans une image cliquable grâce à
    l'attribut <code>"usemap"</code> et l'élément <code>&lt;map&gt;</code>
    (se reposer
    uniquement sur la position du clic rend la fonctionnalité inaccessible
    pour les navigateurs non graphiques ou avec un pointage alternatif).</p>
    <p>Malheureusement tous les logiciels ne mettent pas à profit ces
    balisages. Il est donc important de vérifier la compréhension du
    formulaire lors d'une lecture linéaire : faire en sorte que la
    description suive ou précède toujours directement le champ décrit, et
    éviter de disperser les éléments du formulaire dans la page. Vous pouvez
    par exemple tester le rendu avec le navigateur Lynx pour vérifier que le
    formulaire, et le rôle de chaque élément, y sont compréhensibles.</p>
    <h4>Automatismes</h4>
    <p>Tous les visiteurs n'ont pas un navigateur configuré pour exécuter
    le javascript, il est donc nécessaire de permettre l'accès au
    formulaire sans scripts. L'ajout d'un bouton de soumission (<code>&lt;input
    type="submit" value="envoyer"/&gt;</code>) et une
    destination correctement remplie pour le formulaire sont indispensables.
    Les scripts pouvant, quant à eux, prendre la main en complément des éléments normaux
    lorsque le navigateur les supporte.</p>
    <p>Dans le même esprit, si une validation des données par javascript peut
    être faite pour aider l'utilisateur à remplir les cases, elle ne
    remplace pas une validation par le programme sur le serveur car rien ne
    garantit que le visiteur utilise javascript et n'envoie pas les données
    directement.</p>
    <p>Inversement, lorsque le javascript est supporté, il peut aussi limiter
    l'accessibilité du formulaire. C'est particulièrement le cas des
    scripts qui déclenchent automatiquement l'envoi après sélection
    d'une entrée (par exemple dans une liste déroulante) : certains
    logiciels ne permettent pas de naviguer dans une liste sans sélectionner
    un à un les éléments, ce qui activerait le javascript dès le premier
    élément et déclencherait l'action. Ces scripts de validation automatique sont
    donc à éviter.</p>
    <h4>Accès rapides</h4>
    <p>La structure est une chose, mais tel quel le formulaire n'est pas
    encore parfait pour un accès avec autre chose qu'une souris. Pour une
    meilleure accessibilité, il peut être intéressant de rajouter deux types
    d'éléments :</p>
    <ul>
      <li>Ajouter des combinaisons d'accès rapide. Avec un attribut
          <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#adef-accesskey" title="HTML 4.01 - Les clés d'accès">
          <code>"accesskey"</code>
        </a>
      sur quelques éléments spécifiques vous permettrez aux gens d'accéder
      directement à un élément du formulaire. C'est particulièrement
      valable pour des formulaires qui servent à la navigation, comme un
      formulaire de recherche.</li>
      <li>Ajouter un ordre d'accès. L'attribut
          <a href="http://www.la-grange.net/w3c/html4.01/interact/forms.html#h-17.11.1" title="HTML 4.01 - La navigation par tabulation">
          <code>"tabindex"</code>
        </a>
      permet de spécifier un ordre de parcours dans les champs de formulaire.
      Il doit contenir une valeur numérique entière, l'accès sera ordonné
      par cette valeur. Vous permettrez au visiteur d'accéder aux éléments
      dans l'ordre le plus pertinent, et leur évitez ainsi une recherche
      et un accès qui peuvent être longs ou complexes suivant leur handicap et
      logiciel.</li>
    </ul>
    <h4>Informations</h4>
    <p>L'accès technique au formulaire étant fait, il reste une dernière
    touche importante : aider l'utilisateur à se servir du
    formulaire.</p>
    <p>Indiquez toujours si un champ est obligatoire, éventuellement par une
    simple ligne qui nomme les valeurs nécessaires au traitement si vous
    pensez qu'il serait trop lourd de le signaler à chaque fois.</p>
    <p>Lorsqu'une erreur survient dans le traitement, indiquez précisément ce qui
    doit être fait comme correction et pointez la donnée manquante ou erronée.
    Renvoyez le message d'erreur sur la même page que le
    formulaire ; lui-même devant reproduire toutes les
    données entrées précédemment, ou conserver les données valides, et ne
    redemander que les manquantes ou erronées. L'utilisateur ne doit pas avoir à
    ressaisir les données correctement renseignées, ni à chercher où est son erreur.</p>
    <p>Inversement, si aucune erreur n'apparaît, et à défaut d'une réponse spécifique,
    informez l'utilisateur que les données ont été reçues et traitées avec succès. Ne 
    redirigez pas directement l'utilisateur vers la page d'accueil ou un nouveau formulaire
    vierge sans lui donner de confirmation sur le traitement du précédent.</p>
    <h3>Le mot de la fin</h3>
    <p>Il y a encore beaucoup de choses à découvrir sur les formulaires, surtout sur 
	l'ergonomie et les interactions avec l'utilisateur. Vous pouvez d'ailleurs trouver le
	détail des possibilités javascript de validation dans <a href="/articles/validation_formulaire/" title="Bien valider ses formulaires avec Javascript">un
	article dédié</a>.</p>
    <p>S'il fallait mettre en avant un point de cet article afin de le garder à l'esprit,
	ce serait l'accessibilité. Les formulaires se révèlent souvent des barrières pour
	l'utilisateur, que ce soit celui qui n'est pas à l'aise avec l'informatique ou celui
	qui a de réelles difficultés d'accès au Web. Généralement quelques points simples
	permettent d'améliorer sensiblement la facilité d'utilisation de votre formulaire.
	On peut citer par exemple la présence des balises <code>&lt;label&gt;</code> ou
	le regroupement	des champs et valeurs similaires (avec entre autres la balise
	<code>&lt;fieldset&gt;</code>).</p>
  </body>
</html>
