Tính năng Loại câu hỏi động cho phép widget nhập và hành vi xác thực của trường được xác định lúc chạy thay vì lúc thiết kế biểu mẫu. Đây là phần mở rộng nâng cao của rtSurvey được dùng khi loại dữ liệu cần thu thập phụ thuộc vào cấu hình phía server, phản hồi API, hoặc giá trị trường trước đó.

Một trường hợp sử dụng phổ biến là danh sách kiểm tra kiểm tra cấu hình được, nơi server xác định các trường nào là bắt buộc, chúng thuộc loại gì (text, integer, select, v.v.) và các tùy chọn nào có sẵn — mà không cần xây dựng lại biểu mẫu cho mỗi cấu hình.


Cách hoạt động

Trường được đánh dấu là loại câu hỏi động dùng callapi() để lấy cấu hình từ API. Phản hồi API xác định:

  • Loại input cần hiển thị (text, integer, select_one, v.v.)
  • Các lựa chọn có sẵn (với các loại select)
  • Quy tắc xác thực

Trường được đánh dấu bằng specialFeature: isDynamicQuestionType trong nội bộ, điều này báo cho form engine dùng phản hồi API để xây dựng widget thay vì định nghĩa biểu mẫu tĩnh.


Thiết lập

Bước 1: Lấy cấu hình trường

Dùng trường calculate với callapi() để lấy cấu hình động:

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

Bước 2: Tham chiếu cấu hình trong trường động

Trường động dùng callapi-verify() trong appearance hoặc constraint để liên kết với cấu hình đã lấy:

typenamelabelappearance
textinspection_resultKết quả kiểm tracallapi-verify(dynamicParams)

Form engine đọc field_config và tự động xác định xem có nên hiển thị inspection_result là trường text, integer hay select_one.


Định dạng phản hồi API

API phải trả về đối tượng JSON mô tả cấu hình trường. Phản hồi điển hình:

  {
  "config": {
    "type": "select_one",
    "choices": [
      {"value": "pass", "label": "Đạt"},
      {"value": "fail", "label": "Không đạt"},
      {"value": "na", "label": "Không áp dụng"}
    ],
    "required": true,
    "constraint": ". != ''"
  }
}
  

Ví dụ: Biểu mẫu kiểm tra cấu hình được

Biểu mẫu kiểm tra nơi các mục trong danh sách kiểm tra và loại câu trả lời được lấy từ server dựa trên loại kiểm tra:

typenamelabelappearancecalculation
select_one inspection_typeinsp_typeLoại kiểm tra
calculatechecklist_configcallapicallapi('POST', 'https://api.example.com/checklist', 1, 2, 0, '$.items', 10000, 0, '', '', '{"type": "##insp_type##"}')
textitem_1Mục 1callapi-verify(dynamicParams)
textitem_2Mục 2callapi-verify(dynamicParams)
textitem_3Mục 3callapi-verify(dynamicParams)

Server trả về loại widget đúng, nhãn, lựa chọn và xác thực cho mỗi mục dựa trên insp_type.


Thực hành tốt

  1. Chỉ dùng loại câu hỏi động khi cấu trúc trường thực sự thay đổi lúc chạy — với biểu mẫu tĩnh, dùng các loại câu hỏi tiêu chuẩn.
  2. Đảm bảo API cấu hình phản hồi nhanh (dưới 2 giây) và có thể truy cập từ mạng thực địa.
  3. Luôn định nghĩa dự phòng hợp lý trong biểu mẫu cho trường hợp API không thể truy cập — trường text thuần với note tốt hơn widget bị hỏng.
  4. Đặt phiên bản cho schema phản hồi API — thay đổi định dạng phản hồi sẽ ảnh hưởng tất cả biểu mẫu đang hoạt động dùng endpoint đó.
  5. Kiểm tra mọi tổ hợp loại trường mà API có thể trả về trước khi triển khai.

Giới hạn

  • Loại câu hỏi động cần kết nối mạng để lấy cấu hình.
  • Phạm vi đầy đủ của loại widget có sẵn động phụ thuộc vào phiên bản client rtSurvey — hãy kiểm tra phiên bản đích.
  • Đây là phần mở rộng nâng cao của rtSurvey, không có tương đương trong thông số kỹ thuật XLSForm tiêu chuẩn.
  • Lỗi khó theo dõi hơn vì định nghĩa trường nằm một phần trong biểu mẫu và một phần trong phản hồi API.
Trang này có hữu ích không?