De functie Dynamisch vraagtype stelt de invoerwidget en het validatiegedrag van een veld in staat om bij uitvoering te worden bepaald in plaats van bij het ontwerpen van het formulier. Dit is een geavanceerde rtSurvey-uitbreiding die wordt gebruikt wanneer het type te verzamelen gegevens afhankelijk is van een serverconfiguratie, API-respons of de waarde van een voorafgaand veld.

Een veelgebruikte toepassing is een configureerbare inspectiechecklist waarbij de server definieert welke velden vereist zijn, van welk type ze zijn (text, integer, select, etc.) en welke opties beschikbaar zijn — zonder het formulier opnieuw te bouwen voor elke configuratie.


Hoe het werkt

Een veld dat is gemarkeerd als een dynamisch vraagtype gebruikt callapi() om de configuratie op te halen uit een API. De API-respons definieert:

  • Het te renderen invoertype (text, integer, select_one, etc.)
  • De beschikbare keuzes (voor selectietypen)
  • Validatieregels

Het veld is intern gemarkeerd met specialFeature: isDynamicQuestionType, wat de formuliermotor instrueert de API-respons te gebruiken om de widget te construeren in plaats van de statische formulierformulering.


Installatie

Stap 1: Haal de veldconfiguratie op

Gebruik een calculate-veld met callapi() om de dynamische configuratie op te halen:

typenamelabelappearancecalculation
calculatefield_configcallapicallapi('POST', 'https://api.example.com/field-config', 1, 2, 0, '$.config', 10000, 0, '', '', '{"form_id": "##form_id##", "field_id": "inspection_result"}')

Stap 2: Verwijs naar de configuratie in het dynamische veld

Het dynamische veld gebruikt callapi-verify() in zijn appearance of constraint om te koppelen aan de opgehaalde configuratie:

typenamelabelappearance
textinspection_resultInspectieresultaatcallapi-verify(dynamicParams)

De formuliermotor leest field_config en bepaalt dynamisch of inspection_result moet worden weergegeven als een text-, integer- of select_one-veld.


API-responsformaat

De API moet een JSON-object retourneren dat de veldconfiguratie beschrijft. Een typische respons:

  {
  "config": {
    "type": "select_one",
    "choices": [
      {"value": "pass", "label": "Geslaagd"},
      {"value": "fail", "label": "Niet geslaagd"},
      {"value": "na", "label": "N.v.t."}
    ],
    "required": true,
    "constraint": ". != ''"
  }
}
  

Voorbeeld: Configureerbaar inspectieschema

Een inspectieschema waarbij de checklistitems en hun antwoordtypen worden opgehaald van een server op basis van de inspectiecategorie:

typenamelabelappearancecalculation
select_one inspection_typeinsp_typeType inspectie
calculatechecklist_configcallapicallapi('POST', 'https://api.example.com/checklist', 1, 2, 0, '$.items', 10000, 0, '', '', '{"type": "##insp_type##"}')
textitem_1Item 1callapi-verify(dynamicParams)
textitem_2Item 2callapi-verify(dynamicParams)
textitem_3Item 3callapi-verify(dynamicParams)

De server geeft het juiste widgettype, label, keuzes en validatie terug voor elk item op basis van insp_type.


Aanbevolen werkwijzen

  1. Gebruik dynamische vraagtypen alleen wanneer de veldstructuur daadwerkelijk varieert bij uitvoering — gebruik voor statische formulieren standaard vraagtypen.
  2. Zorg ervoor dat de configuratie-API snel reageert (binnen 2 seconden) en beschikbaar is op het veldnetwerk.
  3. Definieer altijd een zinvolle terugval in het formulier voor het geval de API niet bereikbaar is — een eenvoudig text-veld met een notitie is beter dan een gebroken widget.
  4. Versie uw API-responsschema — wijzigingen in het responsformaat zijn van invloed op alle actieve formulieren die dat endpoint gebruiken.
  5. Test elke combinatie van veldtypen die de API kan retourneren voor implementatie.

Beperkingen

  • Dynamische vraagtypen vereisen netwerkconnectiviteit om de configuratie op te halen.
  • Het volledige bereik van widgettypen dat dynamisch beschikbaar is, is afhankelijk van de rtSurvey-clientversie — test uw doelversie.
  • Dit is een geavanceerde rtSurvey-uitbreiding zonder equivalent in de standaard XLSForm-specificatie.
  • Debugfouten zijn moeilijker te traceren omdat de velddefinitie deels in het formulier en deels in de API-respons staat.
Was deze pagina nuttig?