# Veldsleutels

De stabiele namen die automatiseringen gebruiken om je velden aan te spreken — waar ze vandaan komen, en hoe je ze stabiel houdt.

## Veldsleutels

Een veldsleutel is de naam voor ontwikkelaars van één veld in één formulier — company_name, contacts. Zo vult een automatisering een veld vooraf in, vergrendelt het, of leest het antwoord terug, en de sleutel overleeft hernoemen en dupliceren.

<h2 id="why">Waarom ze bestaan</h2>

<p>
  Zonder veldsleutels moet een automatisering je vragen aanspreken via interne id's die voor niemand iets betekenen — en een webhookpayload
  komt daar vol mee binnen. Met veldsleutels lezen beide kanten hetzelfde:
</p>

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

<p>
  Veldsleutels worden op twee plaatsen gebruikt: <code>prefill</code>, <code>context</code> en <code>readonly</code> bij het aanmaken van
  een aanvraag; en de kaarten <code>answers</code> en <code>display</code> in elke callback en elke webhook-payload.
</p>

<h2 id="where">Waar je ze vindt</h2>

<p>
  Elke sleutel die het formulier publiceert, staat op één plek: de tabel <strong>Sleutels</strong> — elk veld, en onder een keuzevraag elke
  optie, onder een matrix elke rij en kolom. De tabel eindigt met een voorbeeld van het <code>answers</code>-object dat je callback zal
  bevatten, met jouw sleutels erin.
</p>

<p>
  De hintregel van elke optie — de grijze regel onder de optie die je bewerkt — eindigt met zijn sleutel als chip. Klik op de chip om de
  sleutel direct te bewerken, druk op Enter of Escape als je klaar bent. Bij een matrix toont de chip voor de rij of kolom waarvan je het
  label bewerkt. Een chip kleurt amber wanneer het formulier gepubliceerd is en de sleutel die je typt de sleutel zou verplaatsen die
  automatiseringen al gebruiken.
</p>

<p>
  Dezelfde tabel verschijnt alleen-lezen waar je een integratie aansluit: onder de veldkoppeling van de webhook, en onder de
  aanvraagfragmenten in de kaart Aanvragen van het deelvenster. Je kunt ook alle sleutels tegelijk uitlezen met <code>fields.list</code>.
</p>

<h2 id="derivation">Hoe een sleutel wordt afgeleid</h2>

<p>
  Je hoeft niets in te stellen. Totdat je hem bewerkt, wordt een sleutel afgeleid van de titel van de vraag: accenten worden opgevouwen en
  letters als ø, æ en ß worden o, ae en ss, alles wordt kleine letters, elke reeks tekens die geen letter of cijfer is wordt één underscore,
  voorloop- en volgunderscores vervallen, en het resultaat wordt afgekapt op 64 tekens.
</p>

<p>
  Een titel die alleen in een niet-Latijns schrift is geschreven, zoals Arabisch, Hebreeuws, Cyrillisch, Grieks, Chinees of Japans, heeft
  niets om op te vouwen. Zijn sleutel is daarom <code>field_</code> plus zijn positie, en die van een optie is <code>option_</code> plus
  haar positie. Zodra ze zijn gepubliceerd, zijn deze sleutels even stabiel als elke andere, maar ze zeggen niets over de vraag. Leest een
  automatisering de antwoorden, stel dan zelf een leesbare sleutel in de tabel Sleutels in.
</p>

<p>
  Als twee velden met dezelfde sleutel zouden eindigen, verbreekt Formstep de gelijkstand in documentvolgorde door <code>_2</code>,{' '}
  <code>_3</code>, enzovoort toe te voegen. Een sleutel die je zelf hebt ingesteld wint altijd zijn claim, en de afgeleide sleutel wijkt.
</p>

<h2 id="setting">Je eigen sleutel instellen</h2>

<p>
  Typ een naam in het invoerveld Veldsleutel om de afgeleide sleutel te overschrijven. Het invoerveld leegmaken gaat terug naar de afgeleide
  sleutel. Toegestane tekens zijn letters, cijfers, <code>_</code>, <code>.</code> en <code>-</code>, tot 64 tekens — al het andere wordt
  geweigerd met <em>"Gebruik alleen letters, cijfers en _ . - (max 64 tekens)."</em> Spaties worden tijdens het typen omgezet in
  underscores, dus "contact name" wordt <code>contact_name</code>.
</p>

<p>
  Sleutels zijn hoofdlettergevoelig en moeten uniek zijn binnen één formulier. Hergebruik van een sleutel die al door een andere vraag,
  herhaalgroep, verborgen veld of berekend veld wordt gebruikt, wordt geweigerd met <em>"Een ander veld gebruikt deze sleutel al."</em>
</p>

<h2 id="freeze">Sleutels bevriezen bij de eerste publicatie</h2>

> ⚠️ **Een gepubliceerde sleutel hernoemen breekt automatiseringen**
> <p>
>     Bij een gepubliceerd formulier waarschuwt het invoerveld Veldsleutel dat het formulier gepubliceerd is en dat automatiseringen die de
>     huidige sleutel gebruiken zullen breken. Niets houdt je tegen, maar elke workflow die deze sleutel vooraf invult of uitleest, stopt met
>     matchen zodra je de wijziging publiceert. Werk de automatisering in dezelfde sessie bij. Publiceren{' '}
>     <a href="#removed-keys">waarschuwt je nogmaals</a> voordat de wijziging live gaat.
>   </p>

<p>
  De eerste keer dat je publiceert, wordt de sleutel van elk veld vastgelegd in die gepubliceerde versie. Elke latere publicatie draagt
  dezelfde sleutels over, wat betekent:
</p>

<ul>
  <li>
    <strong>Hernoemen verplaatst nooit een sleutel.</strong> Hernoem "Company name" naar "Legal entity name" en de sleutel blijft{' '}
    <code>company_name</code>. Je automatiseringen blijven werken; alleen de tekst op de pagina verandert.
  </li>
  <li>
    <strong>Het type van een vraag wijzigen verplaatst nooit een sleutel.</strong> Een tekstvraag omzetten naar een keuzelijst behoudt de
    sleutel — al verandert daarmee wel de waardevorm die je automatisering moet versturen.
  </li>
  <li>
    <strong>Een vraag verplaatsen verplaatst zijn sleutel nooit.</strong> Positie is alleen relevant voor de positionele terugval bij een
    veld zonder bruikbare titel.
  </li>
  <li>
    <strong>Een blok dupliceren geeft de kopie een nieuwe sleutel.</strong> Een zelf ingestelde sleutel wordt gekopieerd en herzien naar de
    volgende vrije <code>_2</code>; afgeleide sleutels worden uniek gemaakt bij publicatie.
  </li>
  <li>
    <strong>Formulieren gebouwd voordat veldsleutels bestonden</strong> krijgen hun sleutels bij hun volgende publicatie.
  </li>
</ul>

<p>
  Publiceren is ook het moment waarop sleutelbotsingen worden opgemerkt, en beide stoppen het publiceren in plaats van een veld stilzwijgend
  te hernoemen:
</p>

<ul>
  <li>
    Twee velden die één sleutel claimen — <em>Veldsleutel "…" wordt door meer dan één veld gebruikt.</em>
  </li>
  <li>
    Een sleutel die je op één veld hebt getypt terwijl een ander veld die al publiceerde —{' '}
    <em>
      Veldsleutel "…" is al gepubliceerd op "…". Die aan "…" geven zou de sleutel van dat veld hernoemen naar "…_2" en automatiseringen die
      "…" gebruiken breken.
    </em>{' '}
    Maak de sleutel op een van de twee vrij en publiceer opnieuw.
  </li>
</ul>

<p>
  Beide verschijnen naast de knop Publiceren, samen met elke andere pre-flight-bevinding — zie{' '}
  <a href="/nl/building-forms/publish-checks">Publicatiecontroles</a>.
</p>

<h2 id="removed-keys">Wanneer een gepubliceerde sleutel op het punt staat te verdwijnen</h2>

<p>
  Een sleutel hoort bij het veld waarop hij is gepubliceerd, niet bij de titel ervan. Er zijn dus twee manieren om er ongewild een kwijt te
  raken: een andere sleutel typen op een gepubliceerd veld, of{' '}
  <strong>een vraag verwijderen en er een nieuwe voor in de plaats zetten</strong>. De nieuwe vraag is een nieuw veld — het krijgt een verse
  sleutel, afgeleid van zijn eigen titel, en de oude sleutel is verdwenen.
</p>

<p>
  Aan de kant van Formstep gaat daarbij niets mis. De webhook vuurt nog steeds af en de callback komt nog steeds binnen, alleen zonder dat
  antwoord, en <code>requests.create</code> begint de oude sleutel te weigeren met <code>UNKNOWN_FIELD_KEY</code>. Daarom controleert
  publiceren dit vooraf. Wanneer een sleutel die de live versie publiceert, in de volgende versie niet meer zou bestaan, tonen het
  publicatievenster en de publicatie-indicator naast de knop Publiceren een waarschuwing:
</p>

```
Veldsleutel "company_name" bestaat na deze publicatie niet meer. Integraties en aanvragen die deze gebruiken, ontvangen dat antwoord niet meer. Een nieuw veld "Company" wordt gepubliceerd als "company". Zet de veldsleutel op "company_name" om ze te laten werken.
```

<ul>
  <li>
    <strong>Om je automatiseringen te laten werken</strong> open je de tabel <strong>Sleutels</strong>, zoek je het veld dat de waarschuwing
    noemt, en typ je de oude sleutel. De waarschuwing verdwijnt en de sleutel gaat verder alsof er niets is gebeurd.
  </li>
  <li>
    <strong>Als je het veld met opzet hebt verwijderd</strong>, publiceer dan gewoon — het is een waarschuwing, geen fout — en werk de
    automatiseringen bij die de sleutel lezen.
  </li>
  <li>
    De waarschuwing noemt een veld alleen als de keuze duidelijk is: het veld waarvan je de sleutel hebt herschreven, of het enige nieuwe
    veld dat staat waar één verwijderd veld stond. Anders noemt hij alleen de sleutel.
  </li>
  <li>
    Een herhaalgroep verwijderen geeft een waarschuwing voor de sleutel van de groep en voor de sleutel van elk veld erbinnen. Publiceren
    via de MCP-server's <code>form_publish</code> geeft dezelfde meldingen terug in <code>warnings</code>.
  </li>
  <li>
    Optie-, rij- en kolomsleutels krijgen dezelfde behandeling: een optie verwijderen of zijn sleutel herschrijven op een gepubliceerd
    formulier laat publiceren waarschuwen met <em>Optiesleutel "pro" van "Plan" bestaat na deze publicatie niet meer</em>, waarbij de
    sleutel wordt genoemd waaronder de optie nu publiceert als hij nog bestaat. Het publicatievenster somt elke sleutelwijziging op, op
    beide niveaus, onder <strong>Sleutels die deze publicatie wijzigt</strong>.
  </li>
</ul>

<h2 id="groups">Herhaalgroepen en verborgen velden</h2>

<p>
  Een herhaalgroep heeft een eigen sleutel, en elk veld erbinnen ook. Automatiseringen spreken de groep als geheel aan en nesten de leden:
</p>

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

<p>
  Een veld binnen een groep is alleen bereikbaar via zijn groep — er is hier geen <code>name</code> op het hoogste niveau, alleen{' '}
  <code>contacts[0].name</code>. Hernoem de sleutel van de groep en de hele array verplaatst mee; hernoem de sleutel van één lid en alleen
  die naam binnen elk object verandert.
</p>

<p>
  De parameternaam van een <a href="/nl/building-forms/hidden-fields">verborgen veld</a> is zijn veldsleutel. Dat is de sleutel die je in{' '}
  <code>context</code> zet bij het aanmaken van een aanvraag, en dezelfde naam die je in een URL-parameter op een openbare link zou
  gebruiken.
</p>

<p>
  De naam van een <a href="/nl/building-forms/calculated-fields">berekend veld</a> is zijn veldsleutel, en het deelt de ene verzameling
  sleutels van het formulier met al het andere. Het is alleen-lezen: het formulier berekent zelf de waarde, dus je kunt er nooit een
  versturen — <code>fields.list</code> vermeldt het met <code>calculated: true</code> en <code>requests.create</code> weigert het in{' '}
  <code>prefill</code> en <code>context</code>. Je leest het wel terug: het komt binnen in <code>answers</code> onder zijn naam (
  <code>answers.total</code>). Een gepubliceerd berekend veld hernoemen hernoemt zijn sleutel, met dezelfde publicatiewaarschuwing als elk
  ander veld.
</p>

<h2 id="option-keys">Optiesleutels: de keuzes binnen een vraag</h2>

<p>
  De onderdelen van een vraag die een antwoord benoemt, krijgen ook sleutels. Elke optie van een radio-, select-, checkbox-,
  afbeeldingskeuze- of ranking-vraag, en elke rij en kolom van een matrix, heeft een <strong>optiesleutel</strong>: afgeleid van zijn label
  op dezelfde manier als een veldsleutel wordt afgeleid van een titel, bewerkbaar, en bevroren bij publicatie. Zo leest een antwoord als een
  naam aan beide kanten:
</p>

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

<p>
  Een workflow vertakt op <code>answers.plan == "pro"</code>, ongeacht in welke taal de respondent antwoordde, en een aanvraag vult een
  keuze vooraf in met <code>{'{ "plan": "pro" }'}</code>. De sleutels worden opgesomd door <code>fields.list</code> onder de{' '}
  <code>options</code> van elk veld, of de <code>rows</code> en <code>columns</code> van een matrix, en bewerkt in de{' '}
  <a href="#where">Sleuteltabel</a> of op de chip van de optie. De opties van elke vraag vormen hun eigen naamruimte, dus twee vragen mogen
  allebei een <code>yes</code> hebben, en een rij en kolom van een matrix mogen dezelfde sleutel delen. Twee opties van één vraag die
  dezelfde sleutel zouden afleiden, worden uit elkaar gehouden met <code>_2</code>, net als velden.
</p>

<p>
  De <a href="/nl/requests/decisions-and-approvals">beslissingsvraag</a> is een gewone radio waarvan de drie opties de sleutels{' '}
  <code>approve</code>, <code>decline</code> en <code>changes</code> dragen; dat is wat de <code>outcome</code> van een aanvraag een
  gesloten verzameling maakt.
</p>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Een aanvraag maken](/nl/requests/creating-requests) — Zet die sleutels aan het werk.
  - [Webhook-referentie](/nl/developers/webhooks-reference) — Hoe veldsleutels elke event-payload vormgeven.
</div>
