Loại câu hỏi động
Loại câu hỏi động cho phép widget và loại câu hỏi của trường được xác định lúc chạy dựa trên phản hồi API hoặc giá trị tính toán.
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:
| type | name | label | appearance | calculation |
|---|---|---|---|---|
| calculate | field_config | callapi | callapi('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:
| type | name | label | appearance |
|---|---|---|---|
| text | inspection_result | Kết quả kiểm tra | callapi-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:
| type | name | label | appearance | calculation |
|---|---|---|---|---|
| select_one inspection_type | insp_type | Loại kiểm tra | ||
| calculate | checklist_config | callapi | callapi('POST', 'https://api.example.com/checklist', 1, 2, 0, '$.items', 10000, 0, '', '', '{"type": "##insp_type##"}') | |
| text | item_1 | Mục 1 | callapi-verify(dynamicParams) | |
| text | item_2 | Mục 2 | callapi-verify(dynamicParams) | |
| text | item_3 | Mục 3 | callapi-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
- 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.
- Đả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.
- 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
textthuần với note tốt hơn widget bị hỏng. - Đặ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 đó.
- 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.