ExpressionScript examples/zh

= 结构 =

本文的第一部分将介绍可以使用哪些表达式以及在何处查找/添加表达式. 第二部分提供了有关如何使用表达式的示例.

=表达式的类别=

LimeSurvey使用表达式用于以下目的：
 * 相关性
 * 验证
 * 文本输出
 * 答案存储

相关性
目的：隐藏问题组/问题

相关性控制是显示还是隐藏问题组或问题. 如果表达式的结果为“真”（即1），则将显示该元素. 否则（如果表达式的结果为“假”（即0）），则元素将被隐藏.

验证
目的：验证问题/子问题/答案的输入/操作

验证控制受访者对问题或行动的输入是否有效. 如果表达式的结果为“true”（即1），则“good”类将应用于元素和验证消息. 否则，如果表达式的结果是“假”（即0）），则“错误”类将被用于元素和验证消息. 您可以在template.css中为这些类声明样式.

文本输出
目的：（做点什么）并写一些文本

表达式可用于写出一些文本. 例如，你可以测试或计算某些内容，并根据测试或计算的结果指定输出. 它还可用于插入使用表达式之前使用的问题的问题文本、答案、问题类型等. 文本输出可以在显示文本的任何地方使用，并且可以返回各种结果.

答案存储
目的：（做点什么）（写一些文本）并在数据库中存储一些东西

方程式问题类型 可用于在数据库中存储内容. 你可以使用方程式执行某些操作，显示方程式问题（类似于文本显示）并将表达式的结果存储在数据库中. 它将答案存储在响应表中. 然后，结果可以在统计功能中使用，也可以导入到LimeSurvey导出功能提供的格式之一.

=表达式的例子=

使用隐藏的方程式问题自动填充答案
问题： 想象一下你有两个问题Q1和Q2. Q1询问受访者的年龄. Q2将受访者分为三组：年龄低于20岁，年龄为20岁，年龄大于20. 因此，Q2应使用值“1”，“2”，“3”，这对应于以上条件. 此外，我们不应忘记使Q2不可见（问题不会显示在调查中，但值将通过响应表中的“后台进程”）.

使用公式问题类型填写数据库： Q2=if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
 * 首先，创建一个问题，将代码Q1作为数字输入问题.
 * 然后用代码Q2创建另一个问题作为方程问题.
 * 在Q2的“显示设置”选项卡章节中：
 * 将“始终隐藏此问题”字段设置为“开”
 * 在“公式”字段中输入表达式：

使用占位符创建摘要页面
本教程演示了如何在调查结束时创建概述，通过Expression Manager placeholders列出所有问题和答案. 它还说明了如何限制这样的概述仅回答问题.

我们的示例可以从这里下载：[[Media:Limesurvey_Expression_Manager_Placeholder_Demo_Survey.lss|调查占位符调查示例]].

这里使用的问题类型：

1. 单选题/单文/数字问题
 * 列表（下拉）
 * 列表（单选）[L]
 * 是/否[Y]
 * 长自由文本[T]
 * 短自由文本[S]
 * 数值输入[N]
 * 方程式[*]

2. 子问题的问题'''
 * 多选题短文本[Q]
 * 多选题[M]
 * 阵列[F]
 * 阵列（是/否/不确定）[C]
 * 阵列（10分选择）[B]

3. 有2个尺度的问题
 * 阵列双尺度[1]

4 . X和Y的问题缩放
 * 阵列（数字）[:]

5. 掩码问题
 * 文本显示[X]

在这个简单的例子中，我们的概述将是一个简单的列表：

- 问题文本：用户的答案

单选题/单文本/数字问题
对于所有这些问题类型，Limesurvey将存储一个响应：


 * 列表（下拉）
 * 列表（单选）
 * 带评论的列表
 * 5分选择
 * 是/否
 * 短自由文本
 * 长自由文本
 * 超长自由文本
 * 数字输入
 * 等式
 * 日期
 * 性别

假设问题的问题代码是q1，我们可以使用以下内容引用问题文本和答案：

- {q1.question}: {q1.shown}

例：

- 你多大了？：25

如果要检查是否已回答该问题，可以在输出周围放置IF语句：

{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}

这个“翻译”为：IF 代码q1的问题不为空，输出“ - ” AND 问题文本 AND “：” AND 答案文本（join函数将元素作为新字符串连接）； ELSE：不输出任何内容（“ “表示空字符串）.

子问题
对于所有这些问题类型，LimeSurvey使用子问题：


 * 多选题短文本
 * 多选题
 * 有评论的多选题
 * 阵列
 * 阵列（5分选择）
 * 阵列（10分选择）
 * 阵列（是/ 否 / 不确定）
 * 阵列（增加，不变，减少）
 * 按列阵列

假设问题的问题代码是q2并且子问题编号为SQ001，SQ002（由LimeSurvey完成的自动编号），我们可以使用以下内容引用问题文本和答案：

- {q2_SQ001.question}: {q2_SQ001.shown}

- {q2_SQ002.question}: {q2_SQ002.shown}

对于多选题，现在显示勾选的子项的文本，但为每个选定的选项显示Y是有意义的：

- {q2_SQ001.question}: {q2_SQ001}

- {q2_SQ002.question}: {q2_SQ002}

...

请注意，目前无法输出带子问题问题的文本，请参阅this feature request.

示例1（假设问题类型是多选题）
- 你知道这些汽车品牌吗？

-- Mercedes: Y

-- Audi: N

-- Volvo: Y

-- Mercedes: Y

{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }

-- Audi: N

{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }

如果只想输出选中的项目，可以在输出周围放置一个IF语句并检查复选框值：

示例2（假设问题类型是阵列（10点选择））
-- Audi: 9

如果您只想输出评级项目，可以在输出周围放置一个IF语句，并使用以下方法检查当前子问题是否得到了解答：

{if(!is_empty(q3_SQ001),join("- ",q3_SQ001.question,": ",q3_SQ001.shown),"")}

有两个尺度的问题
假设正在使用以下代码：
 * 问题代码：q4
 * 子问题代码：SQ001，SQ002，......
 * 答案代码比值1：A1，A2，......
 * 答案代码比值2：B1，B2，......

让我们输出两个比例和前两个子问题的结果：

Question with two scales
Let's assume that the following codes are being used:
 * Question code: q4
 * Subquestion codes: SQ001, SQ002, ...
 * Answer codes scale 1: A1, A2, ...
 * Answer codes scale 2: B1, B2, ...

Let's output the results for both scales and the first two subquestions:

- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}

- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}

To output the subquestion text, you need to add the scale ID to the placeholder (though the texts are the same for both scales). So instead of {q4_SQ001.question} we have to use {q4_SQ001_0.question} or {q4_SQ001_1.question}.

如果要仅使用至少一个答案导出/显示子问题的结果，请对每个子问题使用以下语法：

{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}

X和Y尺度的问题
这适用于所有矩阵问题，它们允许每个单元格的答案（不仅仅是前面所示的每一行）：
 * 阵列文本
 * 阵列编号

使用的假设代码：
 * 问题代码：q5
 * 子代码：SQ001，SQ002，...
 * 答案代码：A1，A2，...

要引用某列的某个子查询的结果，您需要使用QuestionCode. '_' . SubQuestionCode. '_' . AnswerCode. 参考第三个子问题和第二列的答案的示例：q5_SQ003_A2.

让我们输出前两个子项的第1-3列的结果：

- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}

- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}

由于对于这些问题类型，每个单元格（X轴和Y轴的组合）等于一个答案选项，因此需要对每个单元格进行现有数据的测试. 例：

{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}

使用表达式管理器进行评估
下面是另一个关于如何将表达式管理器与 阵列类型问题和评估结合使用的示例： 

假设你有2个数组问题，并且希望将计算数据的结果保存到数据库中. 它实际上很简单，你需要创建并测试数组并提交虚拟响应以查看它是否有效并在完成的页面中提供结果.

实现细节：
 * 添加类型方程的问题
 * 添加以下行，假设Q1是您的数组问题代码，而Q2是第二个：
 * {sum(Q1_SQ001.value,Q2_SQ001.value)}

请注意，SQ001是任何子问题的默认代码. 如果更改了子代码，请相应调整上面的等式.

在数组中使用em_validation_q
你可以使用问题验证方程来控制任何条件的阵列.

实现细节：
 * 为第一个数组：单选数组
 * 问题代码是ARRAY
 * 子问题代码是SQ01，SQ02，SQ03和SQ04
 * 更新整个问题验证方程并放入 !is_empty(ARRAY_SQ01)和!is_empty(ARRAY_SQ03)
 * 为第二个数组：文本数组
 * 问题代码是ARRAYTEXT
 * Y轴代码的子问题是SY01，SY02，SY03和SY04
 * 更新整个问题验证方程和放置 count(self.sq_SY01 >= 1)和count(self.sq_SY03 >= 3)