تتيح ميزة نوع السؤال الديناميكي تحديد أداة إدخال الحقل وسلوك التحقق منه في وقت التشغيل وليس في وقت تصميم النموذج. هذا امتداد متقدم لـ rtSurvey يُستخدم عندما يعتمد نوع البيانات المراد جمعها على تكوين من جانب الخادم، أو استجابة API، أو قيمة حقل سابقة.

حالة استخدام شائعة هي قائمة تحقق تفتيشية قابلة للتكوين حيث يحدد الخادم الحقول المطلوبة ونوعها (نص، عدد صحيح، تحديد، إلخ) والخيارات المتاحة — دون إعادة بناء النموذج لكل تكوين.


كيف يعمل

يستخدم الحقل المُحدَّد كنوع سؤال ديناميكي callapi() لجلب تكوينه من API. تُحدد استجابة API:

  • نوع الإدخال المراد تصييره (نص، عدد صحيح، select_one، إلخ)
  • الخيارات المتاحة (لأنواع التحديد)
  • قواعد التحقق

يُشار داخلياً إلى الحقل بـ specialFeature: isDynamicQuestionType، مما يُخبر محرك النموذج باستخدام استجابة API لبناء الأداة بدلاً من تعريف النموذج الثابت.


الإعداد

الخطوة 1: جلب تكوين الحقل

استخدم حقل calculate مع callapi() لاسترداد التكوين الديناميكي:

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

الخطوة 2: الإشارة إلى التكوين في الحقل الديناميكي

يستخدم الحقل الديناميكي callapi-verify() في appearance أو constraint للربط بالتكوين المجلوب:

typenamelabelappearance
textinspection_resultInspection resultcallapi-verify(dynamicParams)

يقرأ محرك النموذج field_config ويحدد ديناميكياً ما إذا كان يجب تصيير inspection_result كحقل text أو integer أو select_one.


تنسيق استجابة API

يجب أن تُعيد API كائن JSON يصف تكوين الحقل. استجابة نموذجية:

  {
  "config": {
    "type": "select_one",
    "choices": [
      {"value": "pass", "label": "Pass"},
      {"value": "fail", "label": "Fail"},
      {"value": "na", "label": "N/A"}
    ],
    "required": true,
    "constraint": ". != ''"
  }
}
  

مثال: نموذج تفتيش قابل للتكوين

نموذج تفتيش حيث يتم جلب بنود قائمة التحقق وأنواع إجاباتها من خادم بناءً على فئة التفتيش:

typenamelabelappearancecalculation
select_one inspection_typeinsp_typeType of inspection
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)

يُعيد الخادم نوع الأداة الصحيح والتسمية والخيارات والتحقق لكل بند بناءً على insp_type.


أفضل الممارسات

  1. استخدم أنواع الأسئلة الديناميكية فقط عندما تتغير بنية الحقل فعلاً في وقت التشغيل — للنماذج الثابتة، استخدم أنواع الأسئلة القياسية.
  2. تأكد من أن API للتكوين تستجيب بسرعة (أقل من ثانيتين) وهي متاحة على شبكة الميدان.
  3. حدد دائماً خياراً احتياطياً معقولاً في النموذج لحالة عدم إمكانية الوصول إلى API — حقل text عادي مع ملاحظة أفضل من أداة معطلة.
  4. قم بإصدار مخطط استجابة API — التغييرات في تنسيق الاستجابة ستؤثر على جميع النماذج النشطة التي تستخدم تلك النقطة الطرفية.
  5. اختبر كل مجموعة من أنواع الحقول التي قد تُعيدها API قبل النشر.

القيود

  • تتطلب أنواع الأسئلة الديناميكية اتصالاً بالشبكة لجلب التكوين.
  • يعتمد النطاق الكامل لأنواع الأدوات المتاحة ديناميكياً على إصدار عميل rtSurvey — اختبر الإصدار المستهدف.
  • هذا امتداد متقدم لـ rtSurvey ليس له مكافئ في مواصفة XLSForm القياسية.
  • أخطاء التصحيح أصعب تتبعاً لأن تعريف الحقل يعيش جزئياً في النموذج وجزئياً في استجابة API.
هل كانت هذه الصفحة مفيدة؟