# Clés de champ

Les noms stables que les automatisations utilisent pour adresser vos champs — d'où ils viennent, et comment les garder stables.

## Clés de champ

Une clé de champ est le nom technique d'un champ dans un formulaire — company_name, contacts. C'est ce qui permet à une automatisation de préremplir un champ, de le verrouiller, ou de relire la réponse, et cela survit au changement de titre et à la duplication.

<h2 id="why">Pourquoi elles existent</h2>

<p>
  Sans clés de champ, une automatisation devrait adresser vos questions par des ids internes qui ne signifient rien pour personne — et un
  payload de webhook en serait plein. Avec les clés de champ, les deux côtés lisent la même chose :
</p>

```
{ "company_name": "Acme", "employees": 120, "contacts": [{ "name": "Ada" }] }
```

<p>
  Les clés de champ sont utilisées à deux endroits : <code>prefill</code>, <code>context</code>, et <code>readonly</code> lors de la
  création d'une demande ; et les maps <code>answers</code> et <code>display</code> de chaque callback et de chaque payload webhook.
</p>

<h2 id="where">Où les trouver</h2>

<p>
  Chaque clé que le formulaire publie vit à un seul endroit, le tableau <strong>Clés</strong> : chaque champ, et sous une question à choix
  chaque option, sous une matrice chaque ligne et colonne. Il se termine par un aperçu de l'objet <code>answers</code> que votre callback
  portera, avec vos clés dedans.
</p>

<p>
  La ligne d'indice de chaque option — la ligne grise sous l'option que vous modifiez — se termine par sa clé sous forme de puce. Cliquez
  sur la puce pour modifier la clé sur place, appuyez sur Entrée ou Échap une fois terminé. Une matrice affiche la puce pour la ligne ou la
  colonne dont vous modifiez le libellé. Une puce devient ambrée quand le formulaire est publié et que la clé que vous avez tapée
  déplacerait celle que les automatisations utilisent déjà.
</p>

<p>
  Le même tableau apparaît en lecture seule là où vous câblez une intégration : sous le mapping des champs du webhook, et sous les extraits
  de demande de la carte Demandes du panneau Partager. Vous pouvez aussi lire toutes les clés d'un coup avec <code>fields.list</code>.
</p>

<h2 id="derivation">Comment une clé est dérivée</h2>

<p>
  Vous n'avez rien à définir. Tant que vous ne la modifiez pas, une clé est dérivée du titre de la question : les accents sont retirés et
  des lettres comme ø, æ et ß deviennent o, ae et ss, tout est mis en minuscules, chaque suite de caractères qui n'est ni une lettre ni un
  chiffre devient un unique tiret bas, les tirets bas en début et en fin sont retirés, et le résultat est coupé à 64 caractères.
</p>

<p>
  Un titre écrit uniquement dans une écriture non latine, comme l'arabe, l'hébreu, le cyrillique, le grec, le chinois ou le japonais, n'a
  rien à retirer ni à convertir : sa clé est <code>field_</code> suivi de sa position, et celle d'une option est <code>option_</code> suivi
  de sa position. Une fois publiées, ces clés sont aussi stables que les autres, mais elles ne disent rien de la question. Quand une
  automatisation lit les réponses, définissez vous-même une clé lisible dans le tableau Clés.
</p>

<p>
  Si deux champs devaient se retrouver avec la même clé, Formstep tranche dans l'ordre du document en ajoutant <code>_2</code>,{' '}
  <code>_3</code>, et ainsi de suite. Une clé que vous avez définie vous-même l'emporte toujours ; c'est la clé dérivée qui cède.
</p>

<h2 id="setting">Définir votre propre clé</h2>

<p>
  Saisissez un nom dans le champ Clé de champ pour remplacer la clé dérivée. Vider le champ revient à la clé dérivée. Les caractères
  autorisés sont les lettres, les chiffres, <code>_</code>, <code>.</code> et <code>-</code>, jusqu'à 64 caractères — tout le reste est
  refusé avec <em>« Use only letters, numbers and _ . - (max 64 characters). »</em> Les espaces sont convertis en tirets bas au fur et à
  mesure de la saisie, donc « contact name » devient <code>contact_name</code>.
</p>

<p>
  Les clés sont sensibles à la casse et doivent être uniques dans un même formulaire. Réutiliser une clé déjà prise par une autre question,
  un groupe répétable, un champ caché, ou un champ calculé est refusé avec <em>« Another field already uses this key. »</em>
</p>

<h2 id="freeze">Les clés se figent à la première publication</h2>

> ⚠️ **Renommer une clé publiée casse les automatisations**
> <p>
>     Sur un formulaire publié, le champ Clé de champ vous avertit que le formulaire est publié et que les automatisations utilisant la clé
>     actuelle vont se casser. Rien ne vous en empêche, mais chaque workflow qui préremplit ou lit cette clé cesse de correspondre dès que
>     vous publiez le changement. Mettez à jour l'automatisation dans la foulée. La publication vous{' '}
>     <a href="#removed-keys">avertit à nouveau</a> avant que le changement ne soit en ligne.
>   </p>

<p>
  La première fois que vous publiez, la clé de chaque champ est inscrite dans cette version publiée. Chaque publication suivante reporte les
  mêmes clés, ce qui signifie :
</p>

<ul>
  <li>
    <strong>Changer le titre ne déplace jamais une clé.</strong> Renommez « Company name » en « Legal entity name » et la clé reste{' '}
    <code>company_name</code>. Vos automatisations continuent de fonctionner ; seuls les mots affichés changent.
  </li>
  <li>
    <strong>Changer le type d'une question ne déplace jamais une clé.</strong> Transformer une question texte en liste déroulante garde sa
    clé — même si la forme de valeur que votre automatisation doit envoyer change avec elle.
  </li>
  <li>
    <strong>Déplacer une question ne déplace jamais sa clé.</strong> La position ne compte que pour le repli positionnel d'un champ sans
    titre exploitable.
  </li>
  <li>
    <strong>Dupliquer un bloc donne une nouvelle clé à la copie.</strong> Une clé que vous avez définie vous-même est copiée et re-nommée
    vers le prochain <code>_2</code> libre ; les clés dérivées sont rendues uniques à la publication.
  </li>
  <li>
    <strong>Les formulaires créés avant l'existence des clés de champ</strong> reçoivent les leurs à leur prochaine publication.
  </li>
</ul>

<p>
  C'est aussi à la publication que les collisions de clés sont détectées, et toutes les deux bloquent la publication plutôt que de renommer
  silencieusement un champ :
</p>

<ul>
  <li>
    Deux champs revendiquant une clé — <em>Field key "…" is used by more than one field.</em>
  </li>
  <li>
    Une clé que vous avez saisie sur un champ, déjà publiée par un autre champ —{' '}
    <em>
      Field key "…" is already published on "…". Giving it to "…" would rename that field's key to "…_2" and break automations using "…".
    </em>{' '}
    Libérez la clé sur l'un des deux et publiez à nouveau.
  </li>
</ul>

<p>
  Les deux apparaissent à côté du bouton Publier avec tous les autres résultats de la vérification préalable — voir{' '}
  <a href="/fr/building-forms/publish-checks">Contrôles de publication</a>.
</p>

<h2 id="removed-keys">Quand une clé publiée est sur le point de disparaître</h2>

<p>
  Une clé appartient au champ sur lequel elle a été publiée, pas à son titre. Il y a donc deux façons d'en perdre une sans le vouloir :
  saisir une clé différente sur un champ publié, ou <strong>supprimer une question et en ajouter une nouvelle à sa place</strong>. La
  nouvelle question est un nouveau champ — elle reçoit une clé fraîche dérivée de son propre titre, et l'ancienne clé disparaît.
</p>

<p>
  Rien n'échoue côté Formstep quand cela arrive. Le webhook se déclenche toujours et le callback arrive toujours, simplement sans cette
  réponse, et <code>requests.create</code> commence à refuser l'ancienne clé avec <code>UNKNOWN_FIELD_KEY</code>. La publication vérifie
  donc cela en premier. Quand une clé que la version en ligne publie n'existerait plus dans la prochaine, la boîte de dialogue de
  publication et l'indicateur de problème à côté du bouton Publier affichent un avertissement :
</p>

```
La clé de champ "company_name" n’existera plus après cette publication. Les intégrations et demandes qui l’utilisent cesseront de recevoir cette réponse. Un nouveau champ "Company" est publié sous la clé "company". Définissez sa clé de champ sur "company_name" pour qu’elles continuent de fonctionner.
```

<ul>
  <li>
    <strong>Pour garder vos automatisations fonctionnelles</strong>, ouvrez le tableau <strong>Clés</strong>, trouvez le champ que
    l'avertissement nomme, et saisissez l'ancienne clé. L'avertissement disparaît et la clé continue comme si de rien n'était.
  </li>
  <li>
    <strong>Si vous avez supprimé le champ intentionnellement</strong>, publiez quand même — c'est un avertissement, pas une erreur — et
    mettez à jour les automatisations qui lisent la clé.
  </li>
  <li>
    L'avertissement ne nomme un champ que lorsque le choix est évident : le champ dont vous avez retapé la clé, ou l'unique nouveau champ à
    la place d'un unique champ supprimé. Sinon, il nomme seulement la clé.
  </li>
  <li>
    Supprimer un groupe répétable avertit pour la clé du groupe et pour la clé de chaque champ qu'il contient. Publier via{' '}
    <code>form_publish</code> du serveur MCP renvoie les mêmes messages dans <code>warnings</code>.
  </li>
  <li>
    Les clés d'option, de ligne et de colonne reçoivent le même traitement : supprimez une option ou retapez sa clé sur un formulaire publié
    et la publication avertit <em>La clé d'option "pro" de "Plan" n'existera plus après cette publication</em>, en nommant la clé sous
    laquelle l'option est publiée maintenant quand elle existe encore. La boîte de dialogue de publication liste chaque changement de clé,
    aux deux niveaux, sous <strong>Clés qui changent avec cette publication</strong>.
  </li>
</ul>

<h2 id="groups">Groupes répétables et champs cachés</h2>

<p>
  Un groupe répétable a sa propre clé, et chaque champ qu'il contient aussi. Les automatisations adressent le groupe dans son ensemble et
  imbriquent les membres :
</p>

```
{ "contacts": [{ "name": "Ada", "email": "ada@acme.com" }, { "name": "Grace", "email": "grace@acme.com" }] }
```

<p>
  Un champ à l'intérieur d'un groupe n'est atteignable que par son groupe — il n'y a pas de <code>name</code> au premier niveau ici,
  seulement <code>contacts[0].name</code>. Renommer la clé du groupe déplace tout le tableau ; renommer la clé d'un membre ne change que ce
  nom à l'intérieur de chaque objet.
</p>

<p>
  Le nom de paramètre d'un <a href="/fr/building-forms/hidden-fields">champ caché</a> est sa clé de champ. C'est la clé que vous placez dans{' '}
  <code>context</code> lors de la création d'une demande, et le même nom que vous utiliseriez comme paramètre d'URL sur un lien public.
</p>

<p>
  Le nom d'un <a href="/fr/building-forms/calculated-fields">champ calculé</a> est sa clé de champ, et il partage le même jeu de clés du
  formulaire que tout le reste. Il est en lecture seule : c'est le formulaire qui calcule sa valeur, donc vous ne pouvez jamais en envoyer
  un — <code>fields.list</code> le liste avec <code>calculated: true</code> et <code>requests.create</code> le refuse dans{' '}
  <code>prefill</code>
  et <code>context</code>. Vous pouvez en revanche le relire : il arrive dans <code>answers</code> sous son nom, comme{' '}
  <code>answers.total</code> par exemple. Renommer un champ calculé publié renomme sa clé, avec le même avertissement de publication que
  n'importe quel autre champ.
</p>

<h2 id="option-keys">Clés d'option : les choix à l'intérieur d'une question</h2>

<p>
  Les parties d'une question qu'une réponse nomme reçoivent aussi des clés. Chaque option d'une question radio, liste déroulante, case à
  cocher, choix d'image ou classement, et chaque ligne et colonne d'une matrice, a une <strong>clé d'option</strong> : dérivée de son
  libellé de la même façon qu'une clé de champ est dérivée d'un titre, modifiable, et figée à la publication. Une réponse se lit donc comme
  un nom des deux côtés :
</p>

```
{ "plan": "pro", "interests": ["billing", "api"], "satisfaction": { "delivery_speed": "very_good" } }
```

<p>
  Un workflow bifurque sur <code>answers.plan == "pro"</code> quelle que soit la langue dans laquelle le répondant a répondu, et une demande
  préremplit un choix avec <code>{'{ "plan": "pro" }'}</code>. Les clés sont listées par <code>fields.list</code> sous <code>options</code>{' '}
  de chaque champ, ou sous <code>rows</code> et <code>columns</code> d'une matrice, et modifiées dans le <a href="#where">tableau Clés</a>{' '}
  ou sur la puce de l'option. Les options de chaque question forment leur propre espace de noms, donc deux questions peuvent toutes deux
  avoir une option <code>yes</code>, et une ligne et une colonne de matrice peuvent partager une clé. Deux options d'une même question qui
  dériveraient la même clé sont distinguées avec <code>_2</code>, comme les champs.
</p>

<p>
  La <a href="/fr/requests/decisions-and-approvals">question de décision</a> est un bouton radio ordinaire dont les trois options portent
  les clés <code>approve</code>, <code>decline</code> et <code>changes</code> ; c'est ce qui fait du <code>outcome</code> d'une demande un
  ensemble fermé.
</p>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Créer une demande](/fr/requests/creating-requests) — Mettez ces clés au travail.
  - [Référence des webhooks](/fr/developers/webhooks-reference) — Comment les clés de champ façonnent chaque payload d'événement.
</div>
