Trình quản lý biểu thức
From LimeSurvey Manual
Hướng dẫn bắt đầu nhanh
Tổng quan
Khi tùy chỉnh khảo sát của mình, bạn thường cần một cách để chỉ định những điều sau:
- Điều hướng/Phân nhánh - để câu trả lời của chủ đề thay đổi thứ tự đặt câu hỏi
- Tailoring/ Piping - cách diễn đạt câu hỏi (chẳng hạn như đề cập đến các câu trả lời trước đó hoặc cách chia các câu dựa trên số lượng hoặc giới tính của chủ đề của bạn) hoặc cách tạo báo cáo tùy chỉnh (như điểm đánh giá hoặc lời khuyên phù hợp).
- Xác thực - đảm bảo rằng các câu trả lời vượt qua các tiêu chí nhất định, như giá trị tối thiểu và tối đa hoặc khớp với mẫu đầu vào
Trình quản lý biểu thức (EM) cung cấp một cách trực quan để chỉ định logic cho từng tính năng đó. Gần như mọi thứ bạn có thể viết dưới dạng phương trình toán học tiêu chuẩn đều là biểu thức hợp lệ, ngay cả khi bạn đang gọi hàm. EM hiện cung cấp quyền truy cập vào 80 chức năng và có thể dễ dàng mở rộng để hỗ trợ nhiều hơn. Nó cũng cho phép bạn truy cập các biến của mình bằng cách sử dụng tên biến mà con người có thể đọc được (chứ không phải tên SGQA).
Các phần sau đây hiển thị những vị trí chính nơi Trình quản lý biểu thức được sử dụng
Mức độ liên quan (Kiểm soát điều hướng/phân nhánh)
Một số khảo sát sử dụng "Goto Logic", chẳng hạn như nếu bạn trả lời Câu hỏi 1 với tùy chọn C thì sẽ chuyển sang Câu hỏi 5. Cách tiếp cận này rất hạn chế vì khó xác thực và dễ bị hỏng khi bạn phải sắp xếp lại các câu hỏi. EM sử dụng phương trình liên quan Boolean để chỉ định tất cả các điều kiện mà theo đó một câu hỏi có thể hợp lệ. Nếu câu hỏi có liên quan thì câu hỏi đó sẽ được hiển thị, nếu không thì câu hỏi đó là Không áp dụng và giá trị NULL được lưu trữ trong cơ sở dữ liệu. Điều này tương tự với những gì có thể được thực hiện thông qua trình soạn thảo Điều kiện, nhưng EM cho phép bạn dễ dàng chỉ định các tiêu chí phức tạp và mạnh mẽ hơn nhiều (và cho phép bạn sử dụng tên biến thay vì đặt tên SGQA).
Hình ảnh này cho thấy một cách để xem lại logic liên quan của một cuộc khảo sát. Nó tính toán chỉ số khối cơ thể. Phương trình liên quan được hiển thị trong dấu ngoặc vuông ngay sau tên biến (có màu xanh lục). Vì vậy, mức độ liên quan của cân nặng, trọng lượng_đơn vị, chiều cao và chiều cao_đơn vị đều bằng 1, nghĩa là những câu hỏi đó luôn được đặt ra. Tuy nhiên, mức độ liên quan của BMI là {!is_empty(height) và !is_empty(weight)}, nghĩa là BMI sẽ chỉ được tính nếu đối tượng nhập giá trị cho cả chiều cao và cân nặng (do đó tránh nguy cơ chia cho 0 lỗi). Ngoài ra, câu hỏi Báo cáo chỉ được hiển thị nếu đối tượng trả lời cả bốn câu hỏi chính (chiều cao, đơn vị chiều cao, cân nặng, đơn vị cân nặng).
Mức độ liên quan được hiển thị và có thể chỉnh sửa ở những nơi sau:
Xem/Chỉnh sửa Mức độ liên quan ở cấp độ câu hỏi
Phương trình này tính toán Chỉ số khối cơ thể (BMI). Người ta chỉ hỏi liệu người đó có nhập chiều cao và cân nặng của họ lần đầu tiên hay không.
Đây là màn hình chỉnh sửa câu hỏi BMI.
Lưu ý rằng bạn không sử dụng dấu ngoặc nhọn khi nhập Phương trình liên quan.
Xem / Chỉnh sửa Mức độ liên quan ở cấp độ nhóm
Đây là một cuộc khảo sát điều tra dân số mẫu. Trang đầu tiên hỏi có bao nhiêu người sống cùng bạn và lưu số liệu đó vào biến "cohabs". Trang này chỉ được hiển thị nếu bạn có nhiều hơn một người sống chung (vì vậy nó được hiển thị cho người thứ hai sống chung với bạn) và cũng chỉ hiển thị nếu bạn chỉ định Người thứ nhất có liên quan như thế nào với bạn (p1_rel).
Như bạn có thể thấy, nhóm cũng có các tiêu chí về mức độ phù hợp ở cấp độ câu hỏi, sao cho mỗi câu hỏi chỉ xuất hiện khi bạn đã trả lời câu hỏi trước đó (ví dụ: {!is_empty(p1_sex)}). EM kết hợp mức độ phù hợp của Nhóm và Cấp độ câu hỏi cho bạn. Các câu hỏi trong một nhóm chỉ được hỏi nếu toàn bộ nhóm có liên quan. Sau đó, chỉ một số câu hỏi trong nhóm có liên quan mới được hỏi.
Đây là màn hình để chỉnh sửa mức độ liên quan ở cấp độ nhóm cho câu hỏi đó:
Lưu ý rằng bạn không sử dụng dấu ngoặc nhọn khi nhập Phương trình liên quan.
May/Đường ống
EM cho phép bạn dễ dàng thực hiện việc điều chỉnh các câu hỏi có điều kiện đơn giản và phức tạp. Đôi khi bạn chỉ cần thay thế đơn giản, chẳng hạn như nói, "Bạn nói rằng bạn đã mua [ Sản phẩm]. Bạn thích điều gì nhất ở nó?". Đôi khi bạn cần sự thay thế có điều kiện như " [ Ông bà.] [ LastName], bạn có sẵn lòng hoàn thành bản khảo sát của chúng tôi không?". Trong trường hợp này, bạn muốn sử dụng Ông hoặc Bà dựa trên giới tính của người đó. Những lúc khác, bạn thậm chí còn cần sự thay thế phức tạp hơn (chẳng hạn như dựa trên một phép tính toán học) .EM hỗ trợ từng loại đường may/đường ống này.
Phương trình có điều kiện
Ví dụ về Chỉ số khối cơ thể cho thấy khả năng tính toán chỉ số BMI của một người, ngay cả khi cho phép họ nhập chiều cao và cân nặng theo đơn vị hệ mét hoặc phi hệ mét.
Ở đây Weight_kg là {if(weight_units == 'kg', trọng lượng, trọng lượng * .453592)}. Hàm if() này có nghĩa là nếu đối tượng nhập trọng lượng bằng kilôgam thì hãy sử dụng giá trị đó, nếu không thì nhân giá trị đã nhập (tính bằng pound) với 0,453592 để chuyển đổi thành kilôgam. Biến Height_m sử dụng cách tiếp cận tương tự để tính chiều cao của một người theo mét, ngay cả khi người đó nhập chiều cao của mình theo inch.
BMI tính công thức cân nặng là {weight_kg / (height_m * Height_m)}.
Cuối cùng, báo cáo điều chỉnh thông điệp có điều kiện cho phù hợp với chủ đề, cho anh ta biết những gì anh ta đã nhập. ("Bạn nói bạn cao 2 mét và nặng 70 kg.")
Mặc dù không được hiển thị rõ ràng trong hình ảnh trên, nhưng Weight_status sử dụng các câu lệnh if() lồng nhau để phân loại một người từ thiếu cân đến béo phì nghiêm trọng. Bạn có thể xem phương trình của nó trong Show Logic View
Từ cửa sổ chỉnh sửa cho câu hỏi này, bạn có thể thấy hai điều:
- Tailoring phải bao quanh các biểu thức bằng Niềng răng xoăn
- Biểu thức có thể trải dài trên nhiều dòng nếu, như trong trường hợp này, bạn muốn làm cho nó dễ đọc hơn logic điều kiện lồng nhau.
Câu hỏi, câu trả lời và báo cáo phù hợp
Ví dụ này hiển thị báo cáo BMI.
Đây là cửa sổ chỉnh sửa cho cùng một câu hỏi.
Như bạn có thể thấy, mọi thứ trong dấu ngoặc nhọn đều được coi là một biểu thức, do đó được đánh dấu theo cú pháp (mã màu) trong hình ảnh trước đó. Nếu bạn mắc bất kỳ lỗi chính tả nào (chẳng hạn như tên hoặc hàm sai chính tả hoặc không xác định), EM sẽ hiển thị lỗi, chẳng hạn như lỗi này, cho thấy rằng Height_unit là tên biến không xác định (thực tế là Height_units) và rnd() là một hàm không xác định (tên hàm thích hợp là round()). Trong cả hai trường hợp, các lỗi đều được bao quanh bởi một hộp màu đỏ để giúp bạn dễ dàng phát hiện và sửa chúng hơn.
Bạn cũng có thể thấy rằng bạn có thể nhanh chóng tạo các báo cáo phức tạp, chẳng hạn như bảng giá trị đã nhập hoặc lời khuyên phù hợp.
Hãy nhớ rằng tất cả các thao tác chỉnh sửa phải bao quanh các biểu thức bằng Niềng răng xoăn để LimeSurvey biết phần nào của câu hỏi là văn bản tự do và phần nào cần được phân tích cú pháp thông qua Trình quản lý biểu thức.
Xác thực
EM kiểm soát cách hoạt động của hầu hết các tùy chọn câu hỏi nâng cao. Các khía cạnh kiểm soát này như số lượng câu trả lời tối thiểu/tối đa; giá trị riêng lẻ tối thiểu/tối đa; giá trị tổng tối thiểu/tối đa; và kiểm tra xem các giá trị đã nhập có khớp với các mẫu chuỗi đã chỉ định hay không. Bạn tiếp tục nhập các tùy chọn câu hỏi nâng cao đó như bình thường. Tuy nhiên, hiện tại, bất kỳ giá trị nào trong một trong các trường đó đều được coi là một biểu thức, do đó bạn có thể có tiêu chí tối thiểu/tối đa với các mối quan hệ điều kiện phức tạp với các câu hỏi khác.
Trong tất cả các trường hợp này, vì tùy chọn câu hỏi nâng cao luôn được coi là một biểu thức nên bạn không sử dụng dấu ngoặc nhọn khi chỉ định nó.
Trang Khảo sát mẫu hiển thị nhiều ví dụ hoạt động về cách sử dụng biểu thức để xác thực.
Giới thiệu
LimeSurvey sử dụng mô-đun Trình quản lý biểu thức (EM) mới, cho phép LimeSurvey hỗ trợ phân nhánh, đánh giá, xác thực và điều chỉnh phức tạp hơn. Nó sẽ thay thế cách LimeSurvey quản lý các Thay thế, Điều kiện và Đánh giá ở mặt sau. Nó cũng sẽ tăng tốc độ xử lý đáng kể vì nó loại bỏ hầu hết các lần đọc cơ sở dữ liệu trong thời gian chạy. EM được phát triển bởi Tiến sĩ Thomas White (TMSWhite).
Trang wiki này là tài liệu tham khảo chính xác về cú pháp và chức năng của Trình quản lý Biểu thức.
Định nghĩa chính
- Biểu thức: Bất cứ thứ gì được bao quanh bởi dấu ngoặc nhọn
- Miễn là không có khoảng trắng ngay sau dấu ngoặc nhọn mở hoặc trước dấu ngoặc nhọn đóng
- Nội dung của Biểu thức được EM đánh giá, do đó chúng có thể chứa các công thức toán học, hàm và xử lý chuỗi và ngày phức tạp.
- Tailoring: Đôi khi được gọi là "đường ống", đây là quá trình văn bản sửa đổi có điều kiện
- Bạn có quyền truy cập vào tất cả 'trường thay thế', dữ liệu người tham gia và dữ liệu phản hồi.
- Bạn cũng có quyền truy cập dễ dàng hơn vào các câu hỏi, câu trả lời và thuộc tính của chúng.
- Phương trình 'Mức độ liên quan': Một thuộc tính câu hỏi mới kiểm soát khả năng hiển thị của câu hỏi
- Nếu có một phương trình liên quan thì câu hỏi chỉ được hiển thị nếu mức độ liên quan được đánh giá là đúng.
- Bên trong, tất cả array_filter và array_filter_exclude các lệnh trở nên phù hợp ở cấp độ câu hỏi phụ
- Equation Loại câu hỏi: Một loại câu hỏi mới lưu các phép tính hoặc báo cáo vào cơ sở dữ liệu
- Nó giống như một câu hỏi Boilerplate, nhưng nội dung của nó được lưu vào cơ sở dữ liệu ngay cả khi bạn đặt "Luôn ẩn câu hỏi này"
- Mã câu hỏi: Đây là tên biến ưa thích cho EM
- Đây có thể là tên mô tả cho biết mục đích của câu hỏi , giúp đọc logic phức tạp dễ dàng hơn
- Mã câu hỏi hợp lệ KHÔNG được bắt đầu bằng một số, vì vậy khi sử dụng mã câu hỏi để đánh số câu hỏi của bạn, bạn chỉ cần sử dụng "q1" hoặc "q1a" hoặc "g1q2".! N!#*Đây là tên hiện trở thành tên biến nếu bạn xuất dữ liệu sang SPSS hoặc R, vì vậy nếu bạn thực hiện phân tích thống kê, có thể bạn đã đặt tên biến này là duy nhất.
Tôi có phải sử dụng EM không?
Câu trả lời ngắn gọn là Không (nhưng cũng có).
EM hoàn toàn tương thích ngược với các khảo sát hiện có. Vì vậy, nếu bạn hài lòng khi sử dụng Điều kiện và Đánh giá theo kiểu mà LimeSurvey đã sử dụng trong các phiên bản <= 1.91+, bạn có thể tiếp tục làm như vậy.
Tuy nhiên, EM thay thế hoàn toàn cách LimeSurvey xử lý nội bộ các Điều kiện. Mặc dù bạn vẫn có thể sử dụng Trình chỉnh sửa điều kiện để tạo và quản lý các điều kiện, nhưng LimeSurvey 1.92 sẽ chuyển đổi những điều kiện đó thành Phương trình liên quan tương đương. Là một phần của quá trình nâng cấp, LimeSurvey 1.92 sẽ tự động chuyển đổi tất cả các Điều kiện hiện có thành Phương trình Mức độ liên quan.
Điều này sẽ mang lại cho bạn những điều tốt nhất của cả hai thế giới - bạn có thể tiếp tục sử dụng LimeSurvey như bạn đã quen, nhưng sẽ thấy Phương trình mức độ liên quan tương đương để bạn có thể di chuyển dần dần sang Phương trình mức độ liên quan bất cứ khi nào bạn thấy phù hợp.
Tôi có thể kết hợp việc sử dụng Điều kiện và Mức độ liên quan không?
Đúng. Bạn có thể sử dụng trình chỉnh sửa Điều kiện cho một số câu hỏi và trình chỉnh sửa Mức độ liên quan cho các câu hỏi khác. Các điều kiện được tự động chuyển đổi thành Mức độ liên quan khi bạn lưu câu hỏi.
Lưu ý, chúng tôi giả định rằng nếu bạn đang sử dụng trình chỉnh sửa Điều kiện thì bạn muốn các Điều kiện đó ghi đè bất kỳ phương trình Mức độ liên quan nào được nhập theo cách thủ công. Vì vậy, nếu bạn đã có Điều kiện và muốn chỉnh sửa Mức độ liên quan theo cách thủ công, trước tiên hãy xóa Điều kiện cho câu hỏi đó. Cụ thể, sao chép phương trình mức độ liên quan đã tạo vào trình soạn thảo văn bản, sử dụng menu Điều kiện để xóa tất cả các điều kiện cho câu hỏi đó (thao tác này cũng sẽ xóa mức độ liên quan), sau đó chỉnh sửa câu hỏi và dán lại phương trình mức độ liên quan đã tạo từ trình soạn thảo văn bản vào trường liên quan cho câu hỏi đó (và lưu câu hỏi). Nếu có đủ nhu cầu xóa các điều kiện mà không xóa phương trình liên quan đã tạo, chúng tôi có thể thêm quy trình chuyển đổi hàng loạt.
Tôi nên chọn như thế nào giữa Điều kiện và Mức độ liên quan?
Dưới đây là danh sách ưu và nhược điểm của từng phong cách:
Style | Ưu điểm | Nhược điểm |
---|---|---|
Điều kiện | 1. GUI đẹp để tạo điều kiện đơn giản 2. GUI được nhóm hỗ trợ ghi chép đầy đủ và hiểu rõ |
1. Chỉ hỗ trợ các so sánh đơn giản và không điều kiện AND/OR tốt 2. Điều kiện xếp tầng hoạt động thất thường 3. Chậm - cần nhiều cơ sở dữ liệu, do đó có thể làm chậm các cuộc khảo sát dài 4. Một số vấn đề được báo cáo với điều kiện tải lại 5. GUI không mở rộng tốt khi có hàng chục, hàng trăm hoặc hàng nghìn câu hỏi 6. Có thể chậm chuyển đổi các khảo sát trên giấy vì phải sử dụng tên SGQA 7. Thường cần một lập trình viên để tùy chỉnh mã logic cần thiết cho việc phân nhánh phức tạp |
Relevance | 1. Hỗ trợ logic rất phức tạp, bao gồm hơn 80 hàm và toán tử/chuỗi 2. Hỗ trợ hoàn hảo cho logic xếp tầng 3. Nhanh chóng - không cần gọi thêm cơ sở dữ liệu, do đó hỗ trợ hơn 1000 câu hỏi khảo sát 4. Không có vấn đề gì khi tải lại logic vì không yêu cầu mã SGQA 5. Đánh dấu cú pháp theo tỷ lệ cho hơn 1000 khảo sát câu hỏi 6. Sử dụng dễ dàng và nhanh chóng cho các nhóm muốn tin học hóa các cuộc điều tra trên giấy hiện có. 7. Dễ dàng hỗ trợ các cuộc phỏng vấn bán cấu trúc và khảo sát dịch tễ học mà không cần người lập trình |
1. Không có GUI cho các điều kiện đơn giản - thay vào đó hãy sử dụng tính năng đánh dấu cú pháp 2. Mới nên nhóm hỗ trợ chưa thành thạo EM. |
Điểm mấu chốt là nếu bạn hài lòng với cách hoạt động của LimeSurvey 1.91+ thì không có lý do gì để thay đổi việc bạn làm.
Một số lợi ích khác của việc sử dụng EM là gì?
Dưới đây là một số lý do khác khiến bạn có thể muốn sử dụng EM.
- Calculations - bạn có thể tạo bất kỳ phép tính nào bạn có thể nghĩ ra:
- Bạn có quyền truy cập vào tất cả các toán tử và hàm toán học phổ biến
- Bạn có quyền truy cập vào hơn 70 hàm toán học, ngày tháng và xử lý chuỗi
- Các nhà phát triển khá dễ dàng thêm các hàm mới nếu người dùng cần chúng
- Lưu trữ các phép tính vào cơ sở dữ liệu
- Bây giờ bạn có thể tính toán các phép tính đơn giản và phức tạp và/hoặc thang điểm VÀ lưu trữ chúng trong cơ sở dữ liệu mà không cần JavaScript.
- Bạn sử dụng loại câu hỏi Phương trình để thực hiện việc này.
- Assessments
- Bây giờ bạn có thể tạo các đánh giá hoặc thang điểm từ bất kỳ loại câu hỏi nào, không chỉ tập hợp con từng được hỗ trợ
- Bạn có thể sử dụng Tailoring để hiển thị số điểm đang chạy hoặc tổng điểm đánh giá ở bất cứ đâu cần thiết - ngay cả trên cùng một trang
- Bạn có nhiều quyền kiểm soát hơn trên các báo cáo được tạo dựa trên các điểm đánh giá đó
- Bạn có thể lưu trữ điểm đánh giá trong cơ sở dữ liệu mà không cần JavaScript
- Bạn có thể ẩn điểm đánh giá mà không cần JavaScript hoặc CSS
- Trường thay thế
- *Thay vì sử dụng {INSERTANS:SGQA}, bạn chỉ có thể sử dụng Mã câu hỏi - điều này giúp dễ đọc và xác thực hơn.
- Điều này cũng tránh được nhu cầu chỉnh sửa câu hỏi thông thường để thay đổi mã SGQA để mọi thứ hoạt động bình thường .
- Tailoring - bạn có thể hiển thị văn bản có điều kiện dựa trên các giá trị khác
- Sử dụng tiêu đề thích hợp cho một chủ đề, như (ví dụ "Xin chào [ Mr./Mrs.] Smith")
- Xuất ra các câu đúng ngữ pháp dựa trên số ít/số nhiều: (ví dụ: "Bạn có 1 con" so với "Bạn có 2 con")
- Chia động từ một cách thích hợp và từ chối các danh từ dựa trên giới tính và số nhiều của chủ đề.
- Thuộc tính biến mới - bạn có thể truy cập thông tin sau để thực hiện điều chỉnh của mình:
- (không có hậu tố) - bí danh cho qcode.code
- . mã - mã câu trả lời được chọn cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu đó không phải là câu hỏi được mã hóa
- .NAOK - giống như .code, nhưng có thể là một phần của phép tính hoặc danh sách ngay cả khi không liên quan
- .value - giá trị đánh giá cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu đó không phải là câu hỏi được mã hóa -- có sẵn là các đánh giá được bật cho khảo sát, nếu không thì luôn luôn zero
- .valueNAOK - giống như .value, nhưng có thể là một phần của phép tính hoặc danh sách ngay cả khi không liên quan
- .shown - câu trả lời được hiển thị cho người dùng (đây là những gì {INSERTANS:xxx} thực hiện )
- .qid - ID câu hỏi
- .gid - ID nhóm
- .sgqa - giá trị SGQA cho câu hỏi
- .jsName - tên biến javascript chính xác cho câu hỏi, bất kể được xác định trên trang này hay trang khác
- .qseq - chuỗi câu hỏi (bắt đầu từ 0)
- .gseq - chuỗi nhóm (bắt đầu từ 0)
- . bắt buộc - liệu câu hỏi có bắt buộc không (Y/N)
- .question - nội dung của câu hỏi
- .relevance - phương trình liên quan cho câu hỏi
- .grevance - phương trình liên quan cho nhóm
- .relevanceStatus - câu hỏi hiện có liên quan hay không (boolean (có thể khác nhau trong PHP và JS))
- .type - loại câu hỏi (mã một ký tự)!N !#Thay đổi động trên trang
- Tất cả mức độ liên quan, tính toán và điều chỉnh hoạt động linh hoạt trên một trang - vì vậy các thay đổi về giá trị sẽ cập nhật trang ngay lập tức
- Vì vậy, bạn có câu hỏi tự động xuất hiện/biến mất dựa trên việc liệu chúng có liên quan
- Các câu hỏi cũng được điều chỉnh linh hoạt dựa trên các câu trả lời trên trang, do đó bạn có thể xem tổng số đang chạy, các câu được điều chỉnh và báo cáo tùy chỉnh.
- Màn hình nhập dữ liệu mới
- Ngoài việc sử dụng hệ thống nhập dữ liệu hiện tại, bạn chỉ cần sử dụng Survey-All-In-One.
- Điều này hỗ trợ tính liên quan và điều chỉnh trên trang, vì vậy nhân viên nhập dữ liệu có thể nhanh chóng duyệt qua và họ sẽ chỉ phải nhập các câu trả lời có liên quan
- Điều này có thể rất quan trọng nếu người nhập dữ liệu của bạn cần xem quá trình điều chỉnh, cũng rất linh hoạt.
- Loại bỏ nhu cầu về hầu hết JavaScript tùy chỉnh
- EM dễ dàng hỗ trợ các phép tính phức tạp, tính điểm , điều chỉnh và logic có điều kiện.
- Một số thứ vẫn sẽ cần JavaScript (như bố cục tùy chỉnh và ẩn các thành phần phụ câu hỏi có điều kiện), nhưng JavaScript của bạn có thể sử dụng các hàm EM để bạn có thể truy cập các câu hỏi bằng Qcode của chúng thay vì SGQA và truy cập bất kỳ thuộc tính câu hỏi nào được liệt kê ở trên.
Một số tính năng mới hữu ích khác được EM kích hoạt là gì?
Bất kể bạn tiếp tục sử dụng Trình chỉnh sửa điều kiện hay soạn phương trình liên quan theo cách thủ công, bạn sẽ nhận được những lợi ích bổ sung sau:
- Bạn có thể tạo tiêu chí xác thực phức tạp hơn
- Tất cả thuộc tính câu hỏi nâng cao (như max_answers, min_num_value_n, max_num_value) có thể sử dụng Biểu thức. Vì vậy, tiêu chí tối thiểu/tối đa của bạn có thể được điều chỉnh dễ dàng dựa trên các phản hồi trước đó, ngay cả khi chúng nằm trên cùng một trang.
- EM cũng xử lý tất cả xác thực dựa trên biểu thức chính quy, do đó bạn có thể kết hợp mạnh mẽ preg và phương trình- dựa trên thuộc tính câu hỏi.
- Easy Sắp xếp lại (hoặc xóa) các Câu hỏi và Nhóm
- Trước phiên bản 1.92, bạn không thể sắp xếp lại các câu hỏi hoặc nhóm nếu LimeSurvey cho rằng việc sắp xếp lại như vậy có thể bị hỏng điều kiện mà chúng được sử dụng. Tương tự, bạn không thể xóa câu hỏi nếu có bất kỳ câu hỏi nào khác phụ thuộc vào chúng.
- Với tính năng tô sáng cú pháp của EM, thật dễ dàng để xem và xác thực xem bạn có cố gắng sử dụng câu hỏi trước khi chúng được khai báo hay không. Vì vậy, giờ đây chúng tôi cho phép bạn sắp xếp lại hoặc xóa các câu hỏi và nhóm bất cứ khi nào bạn muốn. EM sẽ cập nhật tất cả phần tô sáng cú pháp để hiển thị cho bạn các lỗi tiềm ẩn.
- Chế độ xem các câu hỏi sắp xếp lại đã được cải tiến để trợ giúp việc xem xét đó. Giờ đây, nó hiển thị phương trình liên quan và sự điều chỉnh của câu hỏi, vì vậy bạn có thể xem ngay liệu có bất kỳ biến nào chuyển sang màu hồng hay không (nghĩa là chúng được sử dụng trước khi được khai báo)
- Chỉ mục Điều hướng Câu hỏi/Nhóm luôn có sẵn và chính xác
- Trước phiên bản 1.92, những chỉ mục này không có sẵn nếu có các điều kiện phức tạp
- Với EM, chúng tôi có thể đảm bảo rằng chúng chính xác.
- Chủ đề thậm chí có thể quay lại câu hỏi trước đó, thay đổi câu trả lời , sau đó nhảy về phía trước (hoặc gửi)
- Khi nhảy về phía trước, EM sẽ xác thực lại tất cả các câu hỏi/nhóm can thiệp.
- Nếu bất kỳ câu hỏi nào không liên quan, chúng sẽ bị NULLed trong cơ sở dữ liệu để dữ liệu của bạn nhất quán nội bộ
- Nếu bất kỳ câu hỏi nào trở nên có liên quan hoặc mới không đạt yêu cầu bắt buộc hoặc quy tắc xác thực, EM sẽ dừng trên trang đó và buộc người dùng phải trả lời những câu hỏi đó trước khi chuyển đến đích cuối cùng.
#Tự động chuyển đổi các điều kiện thành mức độ phù hợp
- Khi bạn nâng cấp cơ sở dữ liệu của mình, tất cả các khảo sát hiện có có các điều kiện sẽ có các phương trình liên quan được tạo cho chúng
- Bất cứ khi nào bạn nhập một khảo sát, các phương trình liên quan sẽ được tạo khi cần
- Bất cứ khi nào bạn thêm, xóa hoặc sửa đổi các điều kiện, EM sẽ tạo ra phương trình liên quan thích hợp.
- Đánh dấu cú pháp thuận tiện
- Khi EM hiển thị phương trình liên quan, nó sẽ hiển thị Qcode, ngay cả khi bạn đã nhập mã SGQA, vì chúng tôi cho rằng mã này sẽ dễ đọc hơn.
- Tất cả các biến đều được mã hóa màu để cho biết chúng được khai báo trước hay sau câu hỏi hiện tại (hoặc trước hay sau nhóm hiện tại). Điều này cho phép bạn nhanh chóng phát hiện và khắc phục các trường hợp trong đó bạn cố gắng sử dụng các biến cho mức độ liên quan (bao gồm array_filter), điều chỉnh hoặc phương trình xác thực trước khi khai báo chúng.
- Ngoài ra, nếu bạn di chuột qua biến được mã hóa màu , bạn sẽ thấy siêu dữ liệu quan trọng nhất về câu hỏi đó. Điều này bao gồm Chuỗi nhóm #, Chuỗi câu hỏi #, Qcode, Văn bản của câu hỏi và tất cả các lựa chọn trả lời có sẵn (nếu đó là loại câu hỏi có các lựa chọn trả lời được liệt kê).
- Danh sách các lựa chọn câu trả lời sử dụng cú pháp này : 'answers':{key:val, ... }.
- key có cú pháp 'scale~code' trong đó scale là thang đo câu trả lời (ví dụ: đối với tỷ lệ kép) và code là mã câu trả lời.
- val có cú pháp 'value~shown' trong đó value là giá trị đánh giá (nếu sử dụng đánh giá, nếu không thì mã)(ví dụ Qcode.value) và được hiển thị là giá trị hiển thị mà đối tượng nhìn thấy (ví dụ Qcode.shown)
- This có nghĩa là nhiều khảo sát có thể sử dụng phép tính mà không cần chế độ đánh giá. Nếu bạn có các tùy chọn câu trả lời được liệt kê là duy nhất, không thập phân và không âm, bạn chỉ cần thực hiện các phép tính trên các giá trị Qcode.code.
- Easy xem xét toàn bộ logic và nội dung khảo sát
- Có tính năng Hiển thị logic khảo sát mới cho phép bạn xem mọi thứ về khảo sát (hoặc nhóm hoặc câu hỏi) trên một trang.
- Nó hiển thị chi tiết cấp độ Nhóm, Câu hỏi, Câu hỏi phụ và Câu trả lời cho phạm vi đã chọn (khảo sát so với nhóm so với câu hỏi)
- Nó cũng hiển thị mức độ liên quan, mức độ liên quan ở cấp độ câu hỏi phụ (đối với array_filter và array_filter_exclude) và phương trình xác thực được tạo (đối với preg và bất kỳ quy tắc xác thực nào như tổng tối thiểu/tối đa/số lượng value) và tất cả các thuộc tính câu hỏi không trống.
- Mọi thứ đều được đánh dấu theo cú pháp để bạn có thể thấy các lỗi cú pháp tiềm ẩn (như dấu ngoặc đơn không cân bằng hoặc việc sử dụng các biến trước khi chúng được khai báo)
- Cú pháp- việc tô sáng hỗ trợ điều hướng và chỉnh sửa nhanh chóng bản khảo sát.
- Nếu bạn nhấp vào tên biến, nó sẽ mở ra một cửa sổ (hoặc tab) trình duyệt hiển thị cho bạn câu hỏi đó và cho phép bạn chỉnh sửa nó.
- Nếu bạn nhấp vào tên nhóm, nó sẽ mở ra một cửa sổ (hoặc tab) trình duyệt hiển thị chế độ xem sắp xếp lại nhóm để bạn có thể dễ dàng di chuyển các câu hỏi xung quanh.
- Tất cả các thuộc tính câu hỏi cũng được đánh dấu cú pháp. Điều này cho phép bạn đặt và xem các biểu thức trong các tùy chọn câu hỏi nâng cao (chẳng hạn như tính số/tổng giá trị tối đa/tối thiểu trên một biểu thức)
- Tác giả EM đã sử dụng chế độ xem tương tự (sạch hơn một chút) để cho phép các nhà dịch tễ học và tổ chức cộng tác của mình Hội đồng xét duyệt xác nhận và ủy quyền các cuộc khảo sát với hàng nghìn câu hỏi trong các cuộc phỏng vấn có cấu trúc phù hợp và phân nhánh cao
Bắt đầu
Cách tốt nhất để bắt đầu với EM là:
- Cài đặt phiên bản ổn định mới nhất từ http://www.limesurvey.org/en/download
- Nhập và khám phá khảo sát mẫu .
- Khám phá các trường hợp sử dụng và Cách thực hiện và ví dụ từng bước.
- Khám phá tài liệu EM (trang này)! N!*Kiểm tra bộ kiểm tra EM tích hợp
- Từ bất kỳ khảo sát nào, trong phần công cụ, hãy chọn tùy chọn EM
- Các hàm có sẵn liệt kê hơn 70 hàm và cú pháp
- Kiểm tra đơn vị của Cô lập Biểu thức
- hiển thị các ví dụ về cách sử dụng tất cả các hàm và toán tử EM cũng như các kết quả PHP và JavaScript
- lưu ý rằng có một số hàm tạo ra các kết quả khác nhau trong các phiên bản PHP và JavaScript, vì vậy trang này cho phép bạn lập kế hoạch logic EM của bạn cho phù hợp.
Trình quản lý biểu thức mở rộng/thay thế chức năng gì? (Khảo sát vôi <= 1,91+)
Điều kiện => Mức độ liên quan
Các điều kiện kiểm soát những câu hỏi nào được hiển thị. Cú pháp chung là Giá trị toán tử SGQA, như 111X2X3 == "Y". Các điều kiện có thể được AND hoặc OR cùng nhau, nhưng việc trộn AND và OR rất khó. Bản thân các điều kiện được lưu trữ trong một bảng riêng biệt và phần lớn mã của LimeSurvey được dành để quản lý các Điều kiện. Do khả năng truy cập cơ sở dữ liệu rộng rãi, việc xử lý số lượng lớn các điều kiện có thể gây ra các vấn đề về hiệu suất đáng chú ý. Hơn nữa, một khi bạn đã gán các điều kiện cho câu hỏi hoặc nhóm, bạn thường không được phép sắp xếp lại hoặc xóa chúng.
Đánh giá => Phương trình và May đo vi mô
Đánh giá cho phép người dùng tạo thang điểm từ một tập hợp các câu hỏi. Tuy nhiên, chúng không thể thay đổi linh hoạt trên trang hiện tại và giá trị của chúng không được lưu vào cơ sở dữ liệu.
Thay thế => May vi mô
Người dùng có thể điều chỉnh một số tin nhắn và câu hỏi dựa trên các phản hồi trước đó. Ví dụ: câu hỏi có thể là {TOKEN:FIRSTNAME}, bạn đã nói rằng {INSERTANS:111X3X4} là môn thể thao yêu thích của bạn. Tuy nhiên, không thể thực hiện việc điều chỉnh có điều kiện (chẳng hạn như nói "Mr." hoặc "Mrs." tùy thuộc vào giới tính của người đó) hoặc chia động từ hoặc danh từ từ chối mà không có JavaScript ưa thích. Các tác giả có thể thực hiện các cuộc khảo sát dường như điều chỉnh các câu hỏi, nhưng nó yêu cầu các câu hỏi riêng biệt cho từng hoán vị và các điều kiện phức tạp để quyết định câu hỏi nào sẽ hiển thị.
Xác thực
Câu hỏi có thể được xác thực bằng Biểu thức thông thường hoặc giá trị tối thiểu/tối đa hoặc để phản hồi SGQA đóng vai trò là giá trị tối thiểu hoặc tối đa. Tuy nhiên, việc xác thực không thể dựa trên tính toán của các biến khác nếu không có JavaScript ưa thích.
Phương trình
Các phương trình không được hỗ trợ nếu không có JavaScript ưa thích.
Loại câu hỏi phương trình
Không thể lưu các phương trình vào cơ sở dữ liệu (ví dụ: điểm cuối cùng của bài đánh giá) nếu không có JavaScript ưa thích.
Trình quản lý biểu thức sẽ thay thế/mở rộng chức năng đó như thế nào?
Trình quản lý biểu thức là một mô-đun cốt lõi mới trong LimeSurvey giúp việc hỗ trợ loại chức năng phức tạp thường yêu cầu JavaScript tùy chỉnh trở nên dễ dàng hơn nhiều. Nó cũng đang thay thế cách LimeSurvey hiện quản lý Điều kiện và Đánh giá.
Thuật ngữ mới khi đề cập đến Trình quản lý biểu thức (EM)
EM "nghĩ" về chức năng của nó theo các thuật ngữ sau:
- Phân nhánh dựa trên mức độ liên quan - nếu một câu hỏi có liên quan thì hãy hỏi nó, nếu không thì không (ví dụ: làm cho nó ẩn đi và đánh dấu nó dưới dạng NULL trong cơ sở dữ liệu). Có một trường Mức độ liên quan mới cho tất cả các loại Câu hỏi và cho từng Nhóm (vì vậy bạn có thể áp dụng một bộ điều kiện cho toàn bộ nhóm mà không cần phải sao chép cùng một điều kiện cho mỗi câu hỏi và/hoặc kết hợp các điều kiện ở cấp độ câu hỏi và nhóm. logic).
- Tailoring - Khi bạn biết những câu hỏi nào nên được hỏi, việc điều chỉnh (đôi khi được gọi là piping) sẽ chỉ định cách đặt câu hỏi. Điều này cho phép bạn không chỉ hỗ trợ cách thay thế đơn giản (như {TOKEN:FIRSTNAME}) mà còn hỗ trợ cách chia động từ và biến cách của danh từ dựa trên giới tính hoặc số lượng chủ ngữ của bạn. Nó cũng cho phép bạn thay đổi thông điệp bạn gửi đến một chủ đề dựa trên việc họ có trả lời (hoặc cách họ trả lời) các câu hỏi khác hay không.
- Equations - EM thêm một loại câu hỏi mới gọi là Phương trình để lưu kết quả của một biểu thức. Các kết quả phương trình này được tính toán và ghi vào cơ sở dữ liệu, ngay cả khi bạn ẩn chúng trên trang. Do đó, chúng rất hữu ích cho các phép tính điểm ẩn, điều hướng dựa trên các phương trình, đánh giá và báo cáo phức tạp cần được tạo và dễ dàng có sẵn trong cơ sở dữ liệu.
Mức độ liên quan và mức độ liên quan theo tầng
Giờ đây, mọi loại câu hỏi đều có tùy chọn Mức độ liên quan để kiểm soát xem câu hỏi có được hiển thị hay không. EM xử lý từng Phương trình liên quan theo thứ tự chúng sẽ xuất hiện trong khảo sát. Nếu biểu thức đúng (hoặc bị thiếu - để hỗ trợ các khảo sát cũ), câu hỏi sẽ được hiển thị. Nếu nó không liên quan thì câu hỏi sẽ bị ẩn và giá trị sẽ là NULL trong cơ sở dữ liệu. Nếu không có câu hỏi nào liên quan trong một nhóm, toàn bộ nhóm sẽ bị bỏ qua.
Hơn nữa, nếu bất kỳ biến nào trong biểu thức không liên quan thì biểu thức đó luôn đánh giá là sai. Điều này cho phép Xếp tầng mức độ liên quan để bạn không phải viết các phương trình Mức độ liên quan quá dài cho mỗi câu hỏi.
Giả sử bạn có 5 câu hỏi Q1-Q5 và bạn chỉ muốn hiển thị Q2 nếu Q1 đã được trả lời và Q3 nếu Q2 đã được trả lời, v.v. Các phương trình liên quan có thể là:
Mã câu hỏi | Mức độ liên quan | Câu hỏi |
---|---|---|
Q1 | 1 | Tên bạn là gì? |
Q2 | Q1 | {Q1}, bạn bao nhiêu tuổi? |
Q3 | Q2 | Vậy bạn {Q2} tuổi. Bạn đã kết hôn chưa? |
Q4 | Q3 == "Y" | {Q1}, bạn đã kết hôn được bao lâu rồi? |
Q5 | Q4 | Bạn có bao nhiêu đứa con, {Q1}? |
Tính toán mức độ liên quan cũng hoạt động trong JavaScript - vì vậy bạn có thể đặt tất cả các câu hỏi trên vào một trang và nó vẫn hoạt động như mong đợi. Trên thực tế, EM thay thế hoàn toàn cách EM xử lý các định dạng Khảo sát so với Nhóm so với Câu hỏi tại một thời điểm. Giờ đây tất cả đều sử dụng cùng một công cụ điều hướng nên hoạt động giống hệt nhau bất kể kiểu khảo sát nào.
Miễn là bạn ở trên cùng một trang, mọi dữ liệu bạn đã nhập sẽ vẫn ở đó, chỉ bị ẩn. Vì vậy, nếu bạn nhập một số thông tin, sau đó chọn một tùy chọn khiến chúng không liên quan, sau đó làm cho chúng có liên quan trở lại, câu trả lời của bạn sẽ vẫn có sẵn. Tuy nhiên, ngay khi bạn chuyển sang một trang khác, tất cả các phản hồi không liên quan sẽ bị mất tính toàn vẹn của tập dữ liệu.
Mức độ liên quan ở cấp độ nhóm
Trình quản lý biểu thức cũng hỗ trợ mức độ liên quan ở cấp độ nhóm. Điều này làm cho việc thực hiện vòng lặp dễ dàng hơn. Giả sử bạn muốn thu thập thông tin về tối đa 10 thực thể (như sản phẩm hoặc người trong một hộ gia đình), trước tiên bạn xác định có bao nhiêu thực thể cần theo dõi (chẳng hạn như bằng cách hỏi có bao nhiêu người sống trong một hộ gia đình hoặc yêu cầu mọi người kiểm tra những sản phẩm họ thích từ một danh sách dài). Sau khi biết có bao nhiêu thực thể cần theo dõi, bạn có thể sử dụng mức độ liên quan ở cấp Nhóm như {count >= 1}, {count >=2}, ... {count >= 10} cho mỗi nhóm trong số 10 nhóm theo dõi- lên câu hỏi. Trong mỗi nhóm, bạn có thể có logic điều kiện ở cấp độ câu hỏi (ví dụ: các câu hỏi tiếp theo dành riêng cho giới tính hoặc độ tuổi cho từng chủ đề). Câu hỏi và các phương trình liên quan ở cấp độ nhóm được AND cùng nhau để xác định phương trình nào sẽ được hiển thị.
May / Đường ống
Mọi thứ trong dấu ngoặc nhọn hiện được coi là Biểu thức (với một ngoại lệ được mô tả bên dưới). Các biểu thức có quyền truy cập vào tất cả LimeReplacementFields, tất cả các biến (thông qua một số bí danh), tất cả các toán tử phương trình điển hình (toán học, logic và so sánh) và hàng tá hàm (thậm chí còn hoạt động linh hoạt ở phía máy khách).
Bằng cách sử dụng các phương trình này, bạn có thể thực hiện những việc như:
- Có điều kiện hiển thị các thông báo phù hợp cho người trả lời dựa trên các phản hồi trước đó
- Tạo Đánh giá và hiển thị kết quả Đánh giá (hoặc phân nhánh có điều kiện hoặc hiển thị thông báo) dựa trên các kết quả đó, tất cả mà không cần sử dụng chính mô-đun Đánh giá
- Liên hợp động từ và danh từ từ chối trong câu hỏi, câu trả lời và báo cáo.
- Hiển thị tóm tắt các câu trả lời trước trang "Hiển thị câu trả lời của bạn" ở cuối cuộc khảo sát
Phương trình
Có một loại câu hỏi mới gọi là Phương trình. Nó giống như các câu hỏi soạn sẵn, ngoại trừ việc nó lưu trữ giá trị của những gì được hiển thị trong cơ sở dữ liệu. Vì vậy, nếu văn bản Câu hỏi Phương trình chứa phép tính Đánh giá, giá trị đó sẽ được lưu trữ trong cơ sở dữ liệu dưới dạng một biến có thể được hiển thị trong số liệu thống kê công khai hoặc riêng tư.
Điều này giải quyết một yêu cầu chung về lưu trữ điểm Đánh giá trong cơ sở dữ liệu
Cú pháp
Bất cứ điều gì có trong dấu ngoặc nhọn hiện được coi là Biểu thức (với một ngoại lệ: không được có khoảng trắng ở đầu hoặc cuối - điều này là cần thiết để đảm bảo Trình quản lý biểu thức không cố xử lý JavaScript được nhúng).
Lưu ý, các biểu thức có thể trải dài trên nhiều dòng, miễn là không có khoảng trắng sau dấu ngoặc nhọn mở hoặc trước dấu ngoặc nhọn đóng. Điều này đặc biệt hữu ích cho các câu lệnh if() lồng nhau như thế này:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Rất mềm',
if(PFTotals >= -3 && PFTotals <= -2,
'Soft',
if(PFTotals == -1,
'Hơi mềm',
if(PFTotals == 0,
'Trung bình',! N! if(PFTotals == 1,
'Hơi khó',
if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
'Rất khó',
''
)
)
)
)
)
)
)
)}
- Tất cả các toán tử tiêu chuẩn (ví dụ +,-,*,/,!)
- Tất cả các toán tử so sánh tiêu chuẩn (ví dụ <,<=,==,!=,>,>=, cộng với các giá trị tương đương sau: lt,le,eq,ne,gt,ge)
- Dấu ngoặc đơn (để bạn có thể nhóm các biểu thức con)
- Các toán tử có điều kiện (ví dụ &&,| | và các giá trị tương đương này: and,or)
- Các chuỗi trích dẫn đơn và kép (mỗi chuỗi có thể nhúng các chuỗi với loại trích dẫn khác)
- Toán tử dấu phẩy (vì vậy có thể có danh sách các biểu thức và chỉ trả về kết quả cuối cùng)
- Toán tử gán (=)
- Các biến được xác định trước (để tham khảo các câu hỏi, thuộc tính câu hỏi và câu trả lời) - ví dụ: tất cả các mã SGQA
- Các hàm được xác định trước (đã có hơn 70 và rất dễ dàng để thêm nhiều hơn)
Toán tử
Cú pháp EM tuân theo mức độ ưu tiên của toán tử thông thường:
Level | Operator(s) | Description |
---|---|---|
1 | () | dấu ngoặc đơn để nhóm hoặc gọi các hàm |
2 | ! - + | toán tử một ngôi: không, phủ định, một ngôi-cộng |
3 | * / | lần, chia |
4 | + - | cộng , trừ |
5 | < <= > >= lt le gt ge | so sánh tương đối |
6 | == != eq ne | so sánh đẳng thức |
7 | và | logic AND |
8 | hoặc | logic OR |
9 | = | chuyển nhượng toán tử |
10 | , | toán tử dấu phẩy |
Cảnh báo với toán tử dấu cộng (+)
Để nhất quán giữa JavaScript và PHP, toán tử cộng (+) sẽ thực hiện phép cộng nếu cả hai toán hạng đều là số, nhưng thực hiện phép nối nếu cả hai phần đều là chuỗi không phải số. Tuy nhiên, chúng tôi khuyên bạn nên sử dụng hàm join() để nối và hàm sum() để cộng, vì điều đó làm cho ý định của bạn rõ ràng hơn và tránh các kết quả không mong muốn nếu bạn đang mong đợi các chuỗi nhưng thay vào đó lại nhận được các số (hoặc ngược lại ngược lại).
Cảnh báo không khớp giữa số và chuỗi và so sánh chữ cái
Khi bạn muốn so sánh giá trị với so sánh tương đối hoặc bằng nhau, hãy chú ý đến kiểu không khớp. Giá trị do người dùng nhập hoặc mã câu trả lời đã chọn có thể được sử dụng làm số nếu nó rõ ràng là một số.
Nếu bạn bao quanh một trong các giá trị bằng "
nó sẽ buộc so sánh dưới dạng văn bản (so sánh theo bảng chữ cái). Nếu bạn muốn so sánh bằng số, không bao giờ đặt số trong dấu ngoặc kép, "
.
Ví dụ: Q0.NAOK > "50"
là đúng nếu Q0.NAOK là câu hỏi số có giá trị là 9. Điều này là do toán tử >
sẽ cho rằng nó so sánh theo thứ tự bảng chữ cái chứ không phải số.
Để chắc chắn so sánh giá trị số nguyên, bạn có thể sử dụng intval(Q0.NAOK) > 50
, chỉ cần nhớ nếu Q0.NAOK không phải là số (trống hoặc chuỗi), thì intval(Q0. NAOK) === 0. Để so sánh giá trị chuỗi ("A" < "B"), hãy sử dụng strcmp trực tiếp: strcmp(Q0.NAOK,"B")
hoặc strcmp(Q0.NAOK,"A5")
.
Chú ý khi sử dụng Toán tử gán (=)
Lưu ý, bạn nên tránh sử dụng toán tử gán trừ khi thực sự cần thiết vì chúng có thể gây ra tác dụng phụ không mong muốn. Ví dụ: nếu bạn thay đổi giá trị của câu trả lời trước đó, mức độ liên quan xếp tầng và logic xác thực giữa câu hỏi đó và câu hỏi hiện tại sẽ không được tính lại, do đó, bạn có thể nhận được dữ liệu không nhất quán nội bộ (ví dụ: các câu hỏi vẫn được trả lời nhưng phải có bị NULL hoặc các câu hỏi bị bỏ qua nhưng lẽ ra phải được trả lời). Nói chung, nếu bạn muốn gán giá trị cho một biến, bạn nên tạo loại câu hỏi Phương trình và sử dụng biểu thức để đặt giá trị cho biến đó. Tuy nhiên, hiếm khi mọi người thực sự cần toán tử này, vì vậy chúng tôi đã cung cấp nó.
Để cảnh báo bạn về toán tử này, nó được hiển thị bằng phông chữ màu đỏ trong các phương trình cú pháp (để bạn không nhầm lẫn nó với "==")
Sử dụng Toán tử Bài tập
Các lý do chính khiến bạn có thể muốn sử dụng bài tập là:
- Bạn cần đặt giá trị mặc định cho câu hỏi không chấp nhận giá trị mặc định thông qua phương trình (chẳng hạn như radio danh sách, trong đó giao diện người dùng cho phép bạn chọn một trong các tùy chọn trả lời nhưng không cho phép bạn nhập phương trình). Tuy nhiên, hãy cẩn thận, vì LimeSurvey sẽ không thể xác thực rằng phương trình của bạn tạo ra một trong những câu trả lời được phép cho câu hỏi đó.
- Bạn cần buộc phải thay đổi câu trả lời cho câu hỏi trước dựa trên câu trả lời sau
- Bạn cần hạn ngạch phức tạp: sử dụng một lựa chọn ẩn duy nhất cho hạn ngạch và đặt nó bằng phép gán
- v.v...
Bạn có thể sử dụng tất cả hệ thống quản lý biểu thức cho mục đích này.
Một số ví dụ:
- Đặt câu trả lời cho một câu hỏi văn bản ngắn bằng chữ thường :
{QCODE=strtolower(QCODE.NAOK)}
- Đặt câu trả lời mặc định cho loại câu hỏi mảng khi bắt đầu khảo sát :
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
- Đặt câu trả lời mặc định cho loại câu hỏi văn bản mảng khi bắt đầu khảo sát:
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}
- Đặt câu trả lời với điều kiện :
{QCODE=if(YesNo="Y","A1","")}
Bảo mật XSS
Khi bật XSS, không thể sử dụng một số hệ thống quản lý biểu thức:
- bắt đầu một thẻ HTML trong biểu thức nhưng kết thúc bằng một biểu thức khác
- sử dụng một biểu thức phức tạp trong URL.
Ví dụ và cách giải quyết
{if( 1 ,"","")}information{if( 1 ,"","")}
bị hỏng do bảo mật XSS, tại đây bạn có thể sử dụng{if(1,"
<strong>information</strong>","information")}
<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
information","information")}{if(1,"
<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
Truy cập vào các biến
Trình quản lý biểu thức cung cấp quyền truy cập chỉ đọc vào bất kỳ biến nào chúng ta có thể cần. Để tương thích ngược, nó cung cấp quyền truy cập vào:
- TOKEN:xxx - giá trị của TOKEN (ví dụ: TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Chỉ dành cho khảo sát KHÔNG ẩn danh).
- INSERTANS:SGQA - giá trị hiển thị của câu trả lời (ví dụ: "Có"). Đối với Trình quản lý biểu thức, việc sử dụng {QCODE.shown}.
- Tất cả {XXX} được sử dụng bởi các mẫu cũng tương tự như vậy.
- Trong văn bản câu hỏi, bạn có thể sử dụng {QID} được thay thế bởi id câu hỏi và {SGQ} được thay thế bằng SGQA của câu hỏi
Ngoài ra, Trình quản lý Biểu thức cho phép bạn tham chiếu đến các biến theo Mã Câu hỏi (cột 'tiêu đề' trong bảng câu hỏi trong cơ sở dữ liệu). Đây cũng là nhãn biến được sử dụng khi bạn xuất dữ liệu của mình sang SPSS, R hoặc SAS. Ví dụ: nếu bạn có thắc mắc về tên, tuổi và giới tính, bạn có thể gọi các biến đó là name, age và giới tính thay vì 12345X13X22, 12345X13X23' ' và 12345X13X24. Điều này giúp mọi người dễ dàng đọc và xác thực tính logic của các phương trình hơn, đồng thời giúp bạn có thể xáo trộn các câu hỏi xung quanh mà không cần phải theo dõi số nhóm hoặc số câu hỏi.
Quan trọng: Chỉ an toàn khi đề cập đến các biến xuất hiện ở các trang hoặc câu hỏi trước đó.
Hơn nữa, Trình quản lý biểu thức cho phép bạn truy cập nhiều thuộc tính của Câu hỏi:
Cú pháp | Ý nghĩa | Ví dụ | Kết quả ví dụ | ||||
---|---|---|---|---|---|---|---|
Qcode | bí danh cho Qcode.code | {implode(',',name,gender )} | 'Tom','M' | ||||
Qcode.code | mã câu trả lời đã chọn cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu nó không phải là câu hỏi được mã hóa | {implode(',',name.code,gender.code)} | 'Tom','M' | ||||
Qcode.NAOK | giống như Qcode - xem thảo luận về NAOK | {gender.NAOK} | 'M' | ||||
Qcode.value | giá trị đánh giá cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu không một câu hỏi được mã hóa | {gender.value} | '1' | ||||
Qcode.valueNAOK | giống như Qcode.value - xem thảo luận về NAOK | {gender.valueNAOK} | '1 ' | ||||
Qcode.shown | giá trị hiển thị cho câu hỏi | {implode(',',name.shown,gender.shown)} | - | Qcode.question | nội dung câu hỏi | {gender.question} | 'Giới tính của bạn là gì?' |
Qcode.mandatory | cho dù câu hỏi là gì là bắt buộc (Y/N) | {gender.mandatory} | 'N' | ||||
Qcode.qid | số câu hỏi nội bộ (không phải số thứ tự) | {gender.qid} | 337 | ||||
Qcode.type | loại câu hỏi | {gender.type} | 'G' | ||||
Qcode.jsName | tên javascript chính xác cho câu hỏi, bất kể được khai báo trên hay ngoài trang này | {gender.jsName} | 'java1827X3X337' | ||||
Qcode.gid | số nhóm nội bộ (không phải số tuần tự) | {gender.gid} | 3 | ||||
Qcode.qseq | số thứ tự của câu hỏi, bắt đầu từ 0 | {gender.qseq} | 5 | ||||
Qcode.gseq | số thứ tự của nhóm, bắt đầu từ 0 | {gender.gseq} | 1 | ||||
Qcode.relevanceStatus | liệu câu hỏi hiện có liên quan hay không (0 hoặc 1 ) | {gender.relevanceStatus} | 1 | ||||
Qcode.relevance | phương trình mức độ liên quan ở cấp độ câu hỏi | {gender.relevance} | '!is_empty(name)' | ||||
Qcode.grelevance | phương trình mức độ liên quan ở cấp độ nhóm | {gender.grelevance} | 'num_children >= 5' | ||||
Qcode.sgqa | giá trị SGQA cho câu hỏi này | {gender.sgqa} | '1827X3X337' |
Vấn đề về trình soạn thảo HTML
Nếu bạn sử dụng trình soạn thảo HTML, một số ký tự sẽ được thay thế bằng các thực thể HTML.
- & by &
- < by <
- > by >
Nếu bạn sử dụng trình soạn thảo HTML, bạn cần sử dụng :
- và cho &
- lt cho <
- le for <=
- gt for >
- dành cho >=
Đặt tên biến Qcode
Dưới đây là chi tiết về cách tạo Qcode (và truy cập một số thuộc tính) theo loại câu hỏi. Nói chung, Qcodes được xây dựng như sau:
Mã câu hỏi. '_' . ID câu hỏi phụ. '_' . Id tỷ lệ
Đối với comment và other, mã câu hỏi là questionCode_comment và questionCode_other
Type | Mô tả | Mã | SubQs | Tùy chọn trả lời | Thang đo | Mã trả lời | Câu trả lời được hiển thị | Mức độ liên quan |
---|---|---|---|---|---|---|---|---|
5 | 5 Nút Radio Lựa chọn Điểm | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
B | Mảng (Lựa chọn 10 điểm) Nút radio | Q2 | |1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | ||
A | Mảng (Lựa chọn 5 điểm) Nút radio | Q3 | |1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | ||
1 | Mảng (Nhãn linh hoạt) Tỷ lệ kép | Q4 | sq1-sq5 | 0 :a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
H | Array (Linh hoạt) - Định dạng cột | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
F | Mảng (Linh hoạt) - Định dạng hàng | Q6 | |1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | ||
E | Mảng (Tăng/Tương/Giảm) Nút Radio | Q7 | 1- 7 | Tôi,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
: | Mảng (Đa Flexi) 1 đến 10 | Q8 | ls1,todo ,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
; | Văn bản mảng (Đa Flexi) | Q9 | hp,st,sw | Thứ 1, thứ 2, thứ 3 | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
C | Mảng (Có/Không chắc chắn/Không) Nút radio | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
X | Câu hỏi soạn sẵn | Q11 | {Q11.shown} | |||||
D | Ngày | Q12 | {Q12} | {Q12.shown} | ||||
* | Phương trình | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
~124~ | Tải tệp lên (ghi lại số lượng tệp đã tải lên) | Q14 | {Q14} | {Q14>0} | ||||
G | Danh sách thả xuống về giới tính | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
U | Văn bản miễn phí khổng lồ | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
I | Câu hỏi ngôn ngữ | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
! | Danh sách - Thả xuống | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
L | Danh sách thả xuống/Danh sách nút radio | Q19 | AZ | {Q19} | {Q19.shown} | {Q19=='X'} | ||
O | Danh sách có trình đơn thả xuống nhận xét/Danh sách nút radio + vùng văn bản | Q20 | AF | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
T | Văn bản dài miễn phí | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
M | Hộp kiểm tra nhiều lựa chọn | Q22 | | | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
P | Hộp kiểm trắc nghiệm có nhận xét + Văn bản | Q23 | AF | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
K | Câu hỏi nhiều số | Q24 | self,mẹ,bố | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
Q | Nhiều văn bản ngắn | Q25 | AF | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
N | Loại câu hỏi số | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
R | Phong cách xếp hạng | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
S | Văn bản ngắn miễn phí | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
Y | Có/Không nút radio | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Các biến 'cái này', 'bản thân' và 'cái kia' dành riêng
Thông thường, bạn muốn đánh giá tất cả các phần của một câu hỏi, chẳng hạn như đếm xem có bao nhiêu câu hỏi phụ đã được trả lời hoặc tính tổng điểm. Đôi khi, bạn chỉ muốn xử lý một số hàng hoặc cột nhất định của câu hỏi (chẳng hạn như lấy tổng hàng hoặc cột và lưu trữ chúng trong cơ sở dữ liệu). Các biến dành riêng này làm cho quá trình đó tương đối dễ dàng.
Biến 'this' chỉ được sử dụng trong các tùy chọn câu hỏi nâng cao "Phương trình xác thực toàn bộ câu hỏi" và "Phương trình xác thực câu hỏi phụ". Nó mở rộng đến tên biến của từng ô trong các câu hỏi đó. Vì vậy, nếu bạn muốn đảm bảo rằng mỗi mục nhập lớn hơn ba, bạn nên đặt "phương trình xác thực câu hỏi phụ" thành (this > 3).
Biến 'self' và 'that' mạnh hơn và đóng vai trò là macro được mở rộng trước khi xử lý các phương trình. Các lựa chọn cú pháp là:
- self
- self.suffix
- self.sub-selector
- self.sub-selector. hậu tố
hậu tố là bất kỳ hậu tố qcode thông thường nào (ví dụ: NAOK, giá trị, được hiển thị)
bộ chọn phụ là một trong:
- nhận xét - chỉ những câu hỏi phụ là nhận xét (ví dụ: từ nhiều lựa chọn có nhận xét và danh sách có nhận xét)
- nocomments - chỉ những câu hỏi phụ không phải là nhận xét
*sq_X - trong đó X là mã định danh hàng hoặc cột. Chỉ những câu hỏi phụ phù hợp với mẫu X mới được chọn. Lưu ý rằng việc tìm kiếm được thực hiện trên mã định danh mã hoàn chỉnh, sau đó khớp sq_X và bao gồm các câu hỏi phụ nX, X, Xn (ví dụ: nếu bạn sử dụng sq_1 thì các câu hỏi phụ a1, 1a, 1, 11 hoặc 001 sẽ được bao gồm). Chú ý đến loại câu hỏi thang đo kép trong đó mã câu hỏi phụ là QCODE_SQCODE_1 và QCODE_SQCODE_1 cũng như loại câu hỏi xếp hạng trong đó mã câu hỏi phụ là QCODE_1,QCODE_2 ....
- nosq_X - trong đó X là mã định danh hàng hoặc cột. Chỉ những câu hỏi phụ không khớp với mẫu X mới được chọn. Lưu ý việc tìm kiếm được thực hiện trên mã định danh hoàn chỉnh, sau đó khớp nosq_X và không bao gồm các câu hỏi phụ nX, X, Xn
Ví dụ:
- Có phần nào của câu hỏi được trả lời không? {count(self.NAOK)>0}
- Điểm đánh giá cho câu hỏi này là bao nhiêu? {tổng(self.value)}
Bạn cũng có thể sử dụng những thông số này để lấy tổng số hàng và cột. Giả sử bạn có một dãy số với các hàng AE và cột 1-5.
- Tổng cuối cùng là bao nhiêu? {sum(self.NAOK)}
- Tổng hàng B là bao nhiêu? {sum(self.sq_B.NAOK)}
- Tổng số cột 3 là bao nhiêu? {tổng(self.sq_3.NAOK)}
Biến 'that' giống như biến 'self' nhưng cho phép bạn tham khảo các câu hỏi khác. Cú pháp của nó là:
- that.qname
- that.qname.suffix
- that.qname.sub-selector' '
- that.qname.bộ chọn phụ.hậu tố
qname là tên câu hỏi không có bất kỳ phần mở rộng câu hỏi phụ nào. Vì vậy, giả sử bạn tạo một câu hỏi 'q1', đó là qname
Ví dụ:
- Có phần nào của câu hỏi q1 được trả lời không? {count(that.q1.NAOK)>0}
- Điểm đánh giá cho quý 2 là bao nhiêu? {sum(that.q2.NAOK)}
- Tổng cộng của q3 là bao nhiêu? {sum(that.q3.NAOK)}
- Tổng hàng C trong q4 là bao nhiêu? {sum(that.q4.sq_C.NAOK)}
- Tổng cột 2 trong q4 là bao nhiêu? {tổng(that.q4.sq_2.NAOK)}
Các biến 'self' và 'that' có thể được sử dụng theo bất kỳ mức độ liên quan, xác thực hoặc điều chỉnh nào.
Một lưu ý là khi bạn sử dụng tính năng Hiển thị tệp logic, nó sẽ hiển thị cho bạn giá trị mở rộng của 'self' và 'that'. Điều này cho phép bạn xem phương trình thực tế sẽ được tạo để bạn (và Trình quản lý biểu thức) có thể xác thực rằng các biến tồn tại. Điều này có vẻ khó hiểu vì bạn có thể thấy các phương trình khá dài. Tuy nhiên, nếu bạn chỉnh sửa câu hỏi, bạn sẽ thấy phương trình ban đầu sử dụng 'self' và/hoặc 'that'
Cũng lưu ý rằng bạn không nên sử dụng các biến này nếu (a) bạn muốn đặt tên rõ ràng cho từng biến được sử dụng trong phương trình hoặc (b) sử dụng các biến không có câu hỏi phụ (ví dụ: câu hỏi trả lời đơn). Trong những trường hợp đó, việc thêm 'that' vào tiền tố một biến là quá mức cần thiết và bạn có nguy cơ nhận được kết quả không mong muốn.
Cách sử dụng NAOK
NAOK --> "Không áp dụng" (NA) được rồi (OK)
Sử dụng NAOK, có nghĩa là tất cả hoặc một số biến không liên quan (ví dụ: "Không áp dụng được" (NA) là được (OK)).
Khi bạn đặt một số biến từ câu hỏi vào bất kỳ phương trình nào: nếu câu hỏi này (hoặc câu hỏi phụ) bị ẩn theo điều kiện: điều này sẽ vô hiệu hóa tất cả phương trình.
Ví dụ: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) luôn cho một chuỗi trống nếu một câu hỏi con của Q1 bị lọc. Để đếm số lượng câu hỏi con được kiểm tra trong câu hỏi đó có thể được tính (Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Nếu câu hỏi phụ bị ẩn: Trình quản lý biểu thức trả về một chuỗi trống.
Không có NAOK: nếu một câu hỏi hoặc một câu hỏi phụ bị ẩn: Trình quản lý biểu thức luôn trả về một chuỗi trống, tương tự để trả về sai.
.shown luôn sử dụng hệ thống NAOK (chuỗi trống nếu bị ẩn) nhưng nếu bạn cần mã của câu trả lời: bạn nên thêm .NAOK sau mã câu hỏi. Ngoại trừ nếu bạn cần nó và biết bạn làm gì.
Một ví dụ và thông tin khác được cung cấp tại Ghi đè các điều kiện xếp tầng
Truy cập vào chức năng
Trình quản lý Biểu thức cung cấp quyền truy cập vào các hàm toán học, chuỗi và do người dùng xác định, như được hiển thị bên dưới. Nó có PHP và JavaScript tương đương cho các hàm này để chúng hoạt động giống hệt nhau ở phía máy chủ (PHP) và phía máy khách (JavaScript). Thật dễ dàng để thêm các chức năng mới.
Chức năng được triển khai
Các chức năng sau hiện có sẵn:
Function | Meaning | Syntax |
---|---|---|
abs | Absolute value | number abs(number) |
acos | Arc cosine | number acos(number) |
addslashes | Quote string with slashes | string addslashes(string) |
asin | Arc sine | number asin(number) |
atan | Arc tangent | number atan(number) |
atan2 | Arc tangent of two variables | number atan2(number, number) |
ceil | Round fractions up | number ceil(number) |
checkdate | Returns true(1) if it is a valid date in gregorian calendar | bool checkdate(month,day,year) |
convert_value | Convert a numerical value using a inputTable and outputTable of numerical values | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
cos | Cosine | number cos(number) |
count | count the number of answered (non-blank) questions in the list | number count(arg1, arg12, ..., argN) |
countif | Count the number of answered questions in the list equal to the first argument | number countif(matches, arg1, arg2, ... argN) |
countifop | Count the number of answered questions in the list which pass the criteria (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
date | Format a local date/time | string date(format [, timestamp=time()]) |
exp | Calculates the exponent of e | number exp(number) |
fixnum | Display numbers with comma as radix separator, if needed | string fixnum(number) |
floor | Round fractions down | number floor(number) |
gmdate | Format a GMT date/time | string gmdate(format [, timestamp=time()]) |
html_entity_decode | Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8) | string html_entity_decode(string) |
htmlentities | Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8) | string htmlentities(string) |
expr_mgr_htmlspecialchars | Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8) | string htmlspecialchars(string) |
expr_mgr_htmlspecialchars_decode | Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8) | string htmlspecialchars_decode(string) |
idate | Format a local time/date as integer | string idate(string [, timestamp=time()]) |
if (Updated in 3.0.2 ) | Excel-style if(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
implode | Join array elements with a string | string implode(glue,arg1,arg2,...,argN) |
intval | Get the integer value of a variable | int intval(number [, base=10]) |
is_empty | Determine whether a variable is considered to be empty | bool is_empty(var) |
is_float | Finds whether the type of a variable is float | bool is_float(var) |
is_int | Find whether the type of a variable is integer | bool is_int(var) |
is_nan | Finds whether a value is not a number | bool is_nan(var) |
is_null | Finds whether a variable is NULL | bool is_null(var) |
is_numeric | Finds whether a variable is a number or a numeric string | bool is_numeric(var) |
is_string | Find whether the type of a variable is string | bool is_string(var) |
join (New in 2.0 build 130129) | Join elements as a new string | join(arg1, arg2, ... argN) |
list | Return comma-separated list of non-blank values | string list(arg1, arg2, ... argN) |
listifop (New in 3.16.1 ) | Return a 'glue'-separated list of the specified question property (retProp) from questions in the list which pass the criteria (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
log | The logarithm of number to base, if given, or the natural logarithm. | number log(number,base=e) |
ltrim | Strip whitespace (or other characters) from the beginning of a string | string ltrim(string [, charlist]) |
max | Find highest value | number max(arg1, arg2, ... argN) |
min | Find lowest value | number min(arg1, arg2, ... argN) |
mktime | Get UNIX timestamp for a date (each of the 6 arguments are optional) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
modulo-function | The modulo function is not supported yet. You can use the floor() function instead | floor(x/y)==(x/y) |
nl2br | Inserts HTML line breaks before all newlines in a string | string nl2br(string) |
number_format | Format a number with grouped thousands | string number_format(number) |
pi | Get value of pi | number pi() |
pow | Exponential expression | number pow(base, exp) |
quoted_printable_decode | Convert a quoted-printable string to an 8 bit string | string quoted_printable_decode(string) |
quoted_printable_encode | Convert a 8 bit string to a quoted-printable string | string quoted_printable_encode(string) |
quotemeta | Quote meta characters | string quotemeta(string) |
rand | Generate a random integer, see this example | int rand() OR int rand(min, max) |
regexMatch | compare a string to a regular expression | bool regexMatch(pattern,input) |
round | Rounds a number to an optional precision | number round(val [, precision]) |
rtrim | Strip whitespace (or other characters) from the end of a string | string rtrim(string [, charlist]) |
sin | Sine | number sin(arg) |
sprintf | Return a formatted string | string sprintf(format, arg1, arg2, ... argN) |
sqrt | Square root | number sqrt(arg) |
stddev | Calculate the Sample Standard Deviation for the list of numbers | number stddev(arg1, arg2, ... argN) |
str_pad | Pad a string to a certain length with another string | string str_pad(input, pad_length [, pad_string]) |
str_repeat | Repeat a string | string str_repeat(input, multiplier) |
str_replace | Replace all occurrences of the search string with the replacement string | string str_replace(search, replace, subject) |
strcasecmp | Binary safe case-insensitive string comparison | int strcasecmp(str1, str2) |
strcmp | Binary safe string comparison | int strcmp(str1, str2) |
strip_tags | Strip HTML and PHP tags from a string | string strip_tags(str, allowable_tags) |
stripos | Find position of first occurrence of a case-insensitive unicode string (starting by 0, return false if not found) | int stripos(haystack, needle [, offset=0]) |
stripslashes | Un-quotes a quoted string | string stripslashes(string) |
stristr | Case-insensitive strstr | string stristr(haystack, needle [, before_needle=false]) |
strlen | Get string length | int strlen(string) |
strpos | Find position of first occurrence of an unicode string (starting by 0, return false if not found) | int strpos(haystack, needle [ offset=0]) |
strrev | Reverse a string | string strrev(string) |
strstr | Find first occurrence of a string | string strstr(haystack, needle[, before_needle=false]) |
strtolower | Make a string lowercase | string strtolower(string) |
strtotime | Parse about any English textual datetime description into a Unix timestamp | int strtotime(string) |
strtoupper | Make a string uppercase | string strtoupper(string) |
substr | Return part of an unicode string | string substr(string, start [, length]) |
sum | Calculate the sum of values in an array | number sum(arg1, arg2, ... argN) |
sumifop | Sum the values of answered questions in the list which pass the criteria (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
tan | Tangent | number tan(arg) |
time | Return current UNIX timestamp | number time() |
trim | Strip whitespace (or other characters) from the beginning and end of a string | string trim(string [, charlist]) |
ucwords | Uppercase the first character of each word in a string | string ucwords(string) |
unique | Returns true if all non-empty responses are unique | boolean unique(arg1, ..., argN) |
Các chức năng đã được lên kế hoạch hoặc đang được xem xét
Các chức năng khác đã được lên kế hoạch (hoặc đang được xem xét) nhưng chưa được triển khai bao gồm: Một số trong số này là để tương thích ngược với một công cụ khảo sát khác.
Cú pháp | Ý nghĩa | Comments | ||||
---|---|---|---|---|---|---|
e() | trả về giá trị của e | |||||
formatDate(X, PAT) | trả về giá trị chuỗi của ngày X được định dạng theo mẫu định dạng dữ liệu Java PAT | |||||
formatNumber(X,PAT) | trả về giá trị chuỗi của số X được định dạng theo số Java mẫu định dạng PAT | |||||
getAnsOption(X) | Core plugin ExpressionAnswerOptions | |||||
getAnsOption(X,Y) | Core plugin ExpressionAnswerOptions | |||||
getRelevance(X) | trả về phương trình liên quan cho câu hỏi X | |||||
getStartTime() | trả về ngày tương ứng với thời gian hệ thống khi cuộc phỏng vấn được bắt đầu | |||||
getType(X) | trả về tên chuỗi của kiểu dữ liệu - ví dụ *NA* if isNA() | |||||
gotoFirst() | chuyển đến nhóm câu hỏi có liên quan đầu tiên - điều này vi phạm quy trình thông thường của hệ thống | |||||
gotoNext() | chuyển sang nhóm câu hỏi tiếp theo câu hỏi có liên quan - điều này vi phạm quy trình bình thường của hệ thống | |||||
gotoPrevious() | chuyển đến nhóm câu hỏi liên quan trước đó - điều này vi phạm quy trình bình thường của hệ thống | - | isAsked(X) | trả về true nếu câu trả lời không phải là *NA*, *INVALID* hoặc *UNASKED* | ||
isInvalid(X) | trả về true nếu câu trả lời thuộc loại *INVALID* | |||||
isNA(X) | trả về true nếu câu trả lời thuộc loại *NA* | |||||
isNotUnderstood(X ) | trả về true nếu câu trả lời thuộc loại *HUH* | |||||
isRefused(X) | trả về true nếu câu trả lời thuộc loại *REFUSED* | |||||
is Special(X) | trả về true nếu câu trả lời thuộc loại *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* hoặc *HUH* | |||||
isUnknown(X) | trả về true nếu câu trả lời thuộc loại *UNKNOWN* | |||||
jumpTo(X) | chuyển đến nhóm chứa câu hỏi được đặt tên -- điều này vi phạm quy tắc thông thường luồng của hệ thống | |||||
jumpToFirstUnasked() | chuyển đến câu hỏi chưa được hỏi đầu tiên |
|||||
LastIndexOf(X,Y) | trả về chỉ mục cuối cùng (cơ sở 0) của chuỗi Y trong chuỗi X. Trả về -1 nếu Y không được chứa trong X | |||||
list(X,.. .) | một chuỗi chứa danh sách các giá trị dương được phân tách bằng dấu phẩy với "và" ngăn cách hai giá trị cuối cùng | |||||
mean(X,...) | trả về giá trị trung bình của danh sách của các giá trị | |||||
numAnsOptions(X) | trả về số phương án trả lời mà câu hỏi X có | |||||
orlist(X,...) | một chuỗi chứa danh sách các giá trị dương được phân tách bằng dấu phẩy, với "hoặc" ngăn cách hai giá trị cuối cùng | |||||
parseDate(X,PAT) | trả về giá trị ngày của chuỗi X được phân tích cú pháp bằng ngày Java mẫu định dạng PAT | |||||
parseNumber(X,PAT) | trả về giá trị số của chuỗi X được phân tích cú pháp bằng mẫu định dạng số Java PAT | |||||
showAllResponsesExcept( questionList ,attributeList,attributeTitleList) | questionList = danh sách định danh câu hỏi được phân cách bằng dấu gạch ngang; attributeList = danh sách các thuộc tính được phân cách bằng dấu gạch ngang (như câu hỏi #, tiêu đề, văn bản, loại - để bạn có thể quyết định nội dung sẽ hiển thị); attributeTitleList = danh sách các tiêu đề bảng được phân tách bằng dấu sổ đứng, do đó có thể quốc tế hóa báo cáo. | |||||
showTheyResponses( questionList,attributeList,attributeTitleList) | questionList = danh sách các định danh câu hỏi được phân tách bằng dấu gạch ngang; attributeList = danh sách các thuộc tính được phân cách bằng dấu gạch ngang (như câu hỏi #, tiêu đề, văn bản, loại - để bạn có thể quyết định nội dung sẽ hiển thị); attributeTitleList = danh sách các tiêu đề bảng được phân cách bằng dấu gạch ngang, do đó có thể quốc tế hóa báo cáo. |
Trình quản lý biểu thức biết biến nào là cục bộ
Để xây dựng JavaScript cho trang đúng cách, Trình quản lý biểu thức cần biết biến nào được đặt trên trang và ID JavaScript của chúng là gì (ví dụ: đối với document.getElementById(x)). Nó cũng phải biết những biến nào được đặt trên các trang khác (để có thể đảm bảo rằng những biến cần thiết<input type='hidden' value='x'> các trường có sẵn và có dân cư).
Điều kiện xếp tầng
Nếu bất kỳ biến nào không liên quan thì toàn bộ phương trình sẽ không liên quan (sai). Ví dụ: trong bảng sau, N/A có nghĩa là một trong các biến không liên quan
Operator | Ví dụ | a | b | Kết quả | |||||
---|---|---|---|---|---|---|---|---|---|
+ (đơn nhất) | +a | Không áp dụng | false | ||||||
! | !a | N/A | false | ||||||
== (hoặc eq) | a == b | N/A | 5 | false | |||||
== (hoặc eq) | a == b | N/A | 0 | false | |||||
== (hoặc eq) | a == b | N/A | N/A | false | |||||
!= (hoặc ne) | a != b | N/A | 5 | false | |||||
!= (hoặc ne) | a != b | N/A | N/A | false | |||||
!= (hoặc ne) | a != b | N/A | 0 | false | |||||
> (hoặc gt) | a > b | N/A | 5 | false | |||||
>= (hoặc ge) | a >= b | N/A | 5 | false | |||||
< (hoặc lt) | a < b | N/A | 5 | false | |||||
<= (hoặc le) | a <= b | N/A | 5 | false | |||||
và | a và b | N/A | 5 | false | |||||
và | a và b | N/A | N/A | - | hoặc | a hoặc b | N/A | N/A | false |
hoặc | a hoặc b | N/A | 5 | false | |||||
+ | a + b | N/A | 5 | false | |||||
* | a * b | N/A | 5 | false | |||||
/ | a / b | 5 | N/A | false | |||||
() | (a) | N/A | false | ||||||
(exp) | (a && b) | N/A | 5 | false | |||||
|(b + b) > (a && b) | N/A | 5 | false | ||||||
hàm | tổng(a,b,b) | N/A | 5 | false | |||||
hàm | max(a,b) | N/A | 5 | false | |||||
hàm | min(a,b ) | N/A | 5 | false | |||||
function | implode(', ',a,b,a,b) | N/A | 5 | - | hàm | if(a,a,b) | N/A | 5 | false |
hàm | is_empty(a) | N/ A | false | ||||||
hàm | is_empty(a) | 0 (hoặc để trống) | true | ||||||
hàm | !is_empty(a) | N/A | false |
Ghi đè các điều kiện xếp tầng
Giả sử bạn muốn hiển thị tổng số câu trả lời có liên quan. Bạn có thể thử sử dụng phương trình {sum(q1,q2,q3,...,qN)}. Tuy nhiên, điều này được dịch nội bộ sang LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2') ,LEMval('q3'),...,LEMval('qN'))). Vì vậy, nếu bất kỳ giá trị q1-qN nào không liên quan thì phương trình sẽ luôn trả về sai. Trong trường hợp này, sum() sẽ hiển thị 0 cho đến khi tất cả các câu hỏi được trả lời.
Để giải quyết vấn đề này, mỗi biến có thể có hậu tố ".NAOK" (có nghĩa là Không áp dụng được) được thêm vào nó. Trong những trường hợp như vậy, hành vi sau đây xảy ra. Giả sử bạn có một biến q1.NAOK
- q1 chưa được thêm vào mệnh đề LEManyNA()
- LEMval('q1') sẽ tiếp tục kiểm tra xem phản hồi có phù hợp hay không và sẽ trả về '' nếu không (vì vậy các phản hồi không liên quan riêng lẻ sẽ bị bỏ qua, nhưng chúng sẽ không làm mất hiệu lực toàn bộ biểu thức).
Vì vậy, giải pháp cho bài toán tổng đang chạy là sử dụng phương trình sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Việc sử dụng hậu tố .NAOK cũng cho phép tác giả thiết kế các khảo sát có một số đường dẫn có thể nhưng sau đó hội tụ về các đường dẫn chung. Ví dụ: giả sử các đối tượng trả lời một cuộc khảo sát theo cách nằm ngoài phạm vi phản hồi thông thường. Tác giả có thể cảnh báo đối tượng rằng họ có thể không nhận được kết quả hợp lệ và hỏi họ xem họ có thực sự muốn tiếp tục cuộc khảo sát hay không. Nếu họ nói Có thì các câu hỏi còn lại sẽ được hiển thị. Điều kiện cho "các câu hỏi còn lại" sẽ kiểm tra xem các câu trả lời ban đầu có được trả lời trong phạm vi bình thường hay không HOẶC đối tượng có nói Có với câu hỏi chỉ phù hợp nếu họ trả lời ngoài phạm vi bình thường hay không.
Trình quản lý biểu thức hỗ trợ may vi mô có điều kiện như thế nào?
Đây là một ví dụ về điều chỉnh vi mô (trong đó Loại câu hỏi=='expr' có nghĩa là Phương trình):
Mã câu hỏi | Mức độ liên quan | Loại câu hỏi | Câu hỏi |
---|---|---|---|
tên | 1 | văn bản | Tên bạn là gì? |
age | 1 | text | Bạn bao nhiêu tuổi? |
badage | !is_empty(age) | expr | {(tuổi<16) hoặc (tuổi>80 )} |
agestop | badage | message | Xin lỗi, {name}, bạn quá {if( (age<16),'young',if( (age>80), 'già','trung niên') ) } cho bài kiểm tra này. |
kids | !badage | yesno | Bạn có con không? |
parents | 1 | expr | {!badage && Kids=='Y'} |
numKids | parents | text | Bạn có bao nhiêu đứa con? |
kid1 | parents && numKids >= 1 | text | Con đầu lòng của bạn bao nhiêu tuổi? |
kid2 | parents && numKids >= 2 | text | Bao nhiêu tuổi đứa con thứ hai của bạn? |
kid3 | parents && numKids >= 3 | text | Con thứ ba của bạn bao nhiêu tuổi? |
kid4 | parents && numKids > = 4 | text | Con thứ tư của bạn bao nhiêu tuổi? |
kid5 | parents && numKids >= 5 | text | Con thứ năm của bạn bao nhiêu tuổi? |
sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
report | |yesno | {name}, bạn đã nói rằng bạn {age} và bạn có {numKids}. Tổng số tuổi của {min(numKids,5)} đứa con đầu tiên của bạn là {sumage} |
Tất cả những câu hỏi này có thể nằm trên một trang duy nhất (ví dụ: trong cùng một nhóm) và chỉ những câu hỏi có liên quan mới được hiển thị. Hơn nữa, khi bạn nhập độ tuổi của trẻ, biểu thức sum() trong câu hỏi cuối cùng sẽ tự động cập nhật trên trang.
<html>Trình quản lý biểu thức cung cấp chức năng này bằng cách bao quanh mỗi biểu thức bằng một tên được đặt tên yếu tố. Mỗi khi một giá trị thay đổi, nó sẽ tính toán lại biểu thức sẽ xuất hiện trong đó phần tử và tái tạo màn hình. Bạn có thể có hàng chục, thậm chí hàng trăm biểu thức được tùy chỉnh như vậy trên cùng một trang và trang sẽ hiển thị lại tất cả chúng trong một lần làm mới màn hình.
Ánh xạ của LimeSurvey 1.91+ tới Chức năng Trình quản lý Biểu thức
Tính năng cũ | Tính năng mới | Nhận xét | |||
---|---|---|---|---|---|
Điều kiện | Mức độ liên quan | - | Đánh giá | Phương trình | Mọi điểm đánh giá đều có thể được cấu trúc lại thành Phương trình. Điều này vừa đảm bảo rằng điểm số được ghi vào cơ sở dữ liệu, vừa cho phép bạn xem các thay đổi động đối với giá trị điểm trên trang hiện tại |
Replacements | Trình quản lý biểu thức | Công cụ cốt lõi lấy chuỗi đầu vào và xử lý mọi thứ trong dấu ngoặc nhọn dưới dạng Biểu thức - vì vậy, nó xử lý tất cả các loại thay thế lịch sử. Để tránh làm hỏng JavaScript nhúng, Trình quản lý biểu thức chỉ xử lý nội dung giữa các dấu ngoặc nhọn miễn là (a) không có khoảng trắng ở đầu hoặc cuối trong dấu ngoặc nhọn - ví dụ: {expr} là một biểu thức, nhưng { expr}, {expr }, và { expr } không phải là biểu thức. Hơn nữa, Trình quản lý biểu thức không xử lý nội dung trong các chuỗi riêng của nó (ví dụ: {list('hi','there {dấu ngoặc}')} tạo ra "xin chào {dấu ngoặc}"). Nó cũng bỏ qua các dấu ngoặc nhọn thoát (ví dụ \{đây không phải là một biểu thức\}) | |||
Validation | Trình quản lý biểu thức | Kế hoạch là lấy Thuộc tính câu hỏi tối thiểu/tối đa hiện tại và có Trình quản lý biểu thức xử lý chúng. Bằng cách đó, các giá trị tối thiểu/tối đa có thể là biểu thức |
Đánh dấu cú pháp
Để giúp nhập và xác thực biểu thức, EM cung cấp tính năng tô sáng cú pháp với các tính năng sau:
Các loại và ý nghĩa của việc tô sáng cú pháp
Color | Sample | Ý nghĩa | Chú giải công cụ | Nhận xét |
---|---|---|---|---|
tan nền | Sample | the toàn bộ phương trình | none | Bất kỳ nội dung nào trong dấu ngoặc nhọn được nhận dạng là phương trình (ví dụ: không có khoảng trắng ở đầu hoặc cuối) sẽ được mã hóa màu với nền màu nâu vàng để giúp phân biệt với văn bản xung quanh |
văn bản màu đỏ đậm | Sample | Một lỗi | Một số giải thích về lỗi | Có thể là một biến không xác định hoặc lỗi trong chức năng, .... Khảo sát có thể bị hỏng hoàn toàn, điều này không 'không hiển thị cho người dùng công cộng. |
blue text | Sample | tên hàm | ý nghĩa và cú pháp được phép | tên hàm hoặc những thứ phải là hàm vì chúng được theo sau bởi dấu ngoặc đơn mở, được trình bày bằng văn bản màu xanh đậm. Chú giải công cụ hiển thị ý nghĩa và cú pháp cho phép của hàm. |
grey text | Sample | chuỗi | none | các chuỗi trích dẫn đơn và kép được hiển thị bằng văn bản màu xám |
văn bản màu lục lam | Sample | biến được đặt trên cùng một trang, | [ tên hoặc mã SGQA]: câu hỏi; giá trị; Câu trả lờiDanh sách hiển thị mã cho từng giá trị | Bất kỳ biến nào được đặt trên cùng một trang cho câu hỏi hiện tại đều được hiển thị bằng văn bản màu lục lam, cho thấy biến đó có thể được cập nhật bằng javascript. Chú giải công cụ hiển thị tên của nó (nếu bạn đã sử dụng INSERTANS:xxx) hoặc mã SGQA (nếu bạn đã sử dụng hệ thống đặt tên mới), câu hỏi thực tế và giá trị hiện tại của nó (hoặc để trống nếu không được đặt). Nếu loại câu hỏi mong đợi phản hồi từ một tập hợp giá trị liệt kê, thì việc ánh xạ mã tới các giá trị hiển thị sẽ hiển thị. |
green text | Mẫu | biến được đặt ở trang trước | [ tên hoặc mã SGQA]: câu hỏi; giá trị; câu trả lờiDanh sách hiển thị mã cho từng giá trị | Bất kỳ biến nào được đặt trên trang trước sẽ được hiển thị bằng văn bản màu xanh đậm. Chú giải công cụ hiển thị tên của nó (nếu bạn đã sử dụng INSERTANS:xxx) hoặc mã SGQA (nếu bạn đã sử dụng hệ thống đặt tên mới), câu hỏi thực tế và giá trị hiện tại của nó (hoặc để trống nếu không được đặt). Nếu loại câu hỏi mong đợi phản hồi từ một tập hợp giá trị liệt kê, thì việc ánh xạ mã tới các giá trị hiển thị sẽ hiển thị. |
văn bản màu hồng đậm | Sample | biến được đặt trên trang sau nói chung: trống khi bắt đầu khảo sát, nhưng có thể điền chỉ mục hoặc di chuyển | trước đó [ tên hoặc mã SGQA]: câu hỏi; giá trị; câu trả lờiDanh sách hiển thị mã cho từng giá trị | Bất kỳ biến nào được đặt trên trang tiếp theo sẽ được hiển thị bằng văn bản màu hồng đậm. Chú giải công cụ hiển thị tên của nó (nếu bạn đã sử dụng INSERTANS:xxx) hoặc mã SGQA (nếu bạn đã sử dụng hệ thống đặt tên mới), câu hỏi thực tế và giá trị hiện tại của nó (hoặc để trống nếu không được đặt). Nếu loại câu hỏi mong đợi phản hồi từ một tập hợp giá trị liệt kê, thì việc ánh xạ mã tới các giá trị hiển thị sẽ hiển thị. |
bold tan text | Sample | giá trị thay thế vôi | giá trị | Chuỗi thay thế vôi (như {TOKEN:xxx}, {PRIVACY_MESSAGE}) được hiển thị bằng văn bản màu nâu đậm. |
văn bản màu đỏ | Sample | toán tử gán (=) | thông báo cảnh báo | Nếu bạn sử dụng một trong các toán tử gán (=) thì toán tử đó sẽ được hiển thị bằng văn bản màu đỏ. Điều này nhằm giúp ngăn chặn việc vô tình gán lại các giá trị khi bạn thực sự muốn kiểm tra xem a == b thay vì đặt giá trị của a = b. |
văn bản đen bình thường | Sample | punctuation | none | Tất cả các dấu câu khác trong biểu thức được hiển thị dưới dạng văn bản màu đen bình thường. |
văn bản có hộp màu đỏ | một đường màu đỏ đậm bao quanh lỗi | lỗi cú pháp | mô tả lỗi | Mọi lỗi cú pháp được phát hiện đều được hiển thị bằng cách bao quanh lỗi bằng một hộp màu đỏ. Chú giải công cụ hiển thị lỗi. Các ví dụ bao gồm dấu ngoặc đơn không khớp, sử dụng các hàm không xác định, truyền sai số lượng đối số cho hàm, biểu thức có cấu trúc kém (ví dụ: thiếu toán tử giữa các biến), cố gắng gán giá trị mới cho biến chỉ đọc, cố gắng gán giá trị cho biến không- các biến hoặc sử dụng cú pháp không được hỗ trợ. Lưu ý rằng hệ thống phát hiện lỗi cú pháp chỉ có thể báo cáo một lỗi trong một biểu thức ngay cả khi có nhiều lỗi; tuy nhiên, nếu phát hiện bất kỳ lỗi nào, ít nhất một lỗi sẽ được hiển thị. |