sam-it/ls-interfaces

Limesurvey 实体接口:调查、组、问题、答案

v0.5.0 2016-06-03 08:36 UTC

This package is auto-updated.

Last update: 2024-09-08 06:37:12 UTC


README

Limesurvey 实体接口:调查、组、问题、答案

从 Limesurvey 问题、子问题和答案量表中抽象出来的方法是以下这种方式。

LimeSurvey 抽象。

--草案

  • 每个问题都有若干维度(目前限制为:{0, 1, 2})。
  • 单一选择或文本问题有0个维度,它有1个数据点。
  • 具有1个维度的问题有n个数据点,其中n是第一维度中(子)问题的数量。
  • 具有2个维度的问题有n * m个数据点,其中n是第一维度中的问题数量,m是第二维度中的问题数量。
  • 每个数据点要么有一个固定的答案集(Limesurvey 强加额外限制,即对于每个问题,这个固定集对所有子问题都是相同的)。

示例

    public function int getDimensions();
    
    /**
     * Returns the subquestions for the specified dimension. 
     **/
    public function QuestionInterface[] getQuestions(int $i);

如果 getDimensions() 对于一个问题返回2,那么从 getQuestions() 返回的所有问题都将有1个维度。(把它想象成部分函数应用)

    if ($question->getDimensions() == 2) {
    
        foreach($question->getQuestions(0) as $i => $subQuestion) {
            assert($subQuestion->getDimensions() == 1);
            
            foreach($subQuestion->getQuestions(0) as $j => $subSubQuestion) {
                assert($subSubQuestion->getDimensions() == 0);
                assert(
                    $subSubQuestion->getId() 
                    == $question->getQuestions(1)[j]->getQuestions(0)[$i]->getId()
                    == $question->getQuestions($i, $j)->getId()
                );
                
            }
        }
    }

直观地说,在大多数情况下,你可以将维度0视为Y轴,将维度1视为X轴。你吃了多少?

  • 请注意,与实际中的 LimeSurvey 不同,这些接口可以支持每个数据点的不同答案选项。

这些接口要求实现者即使 LimeSurvey 可能没有相应的查询,也要实现问题对象

在这个例子中(在LS中),量表1有答案选项1、2和3,量表2有选项是、否和可能。这些接口没有答案量表的概念。相反,只有0个维度的问题可以有答案选项。此外,我们的接口要求这以具有2个维度的形式暴露,每个维度有2个问题。请注意,这个例子中的量表1和量表2必须作为问题暴露。

用法

这些接口的目的是允许开发人员在不担心 LimeSurvey 内部结构的情况下编写程序。实现者可以,例如,创建一个客户端,使用LS2.x中可用的JSON-RPC API(https://github.com/SAM-IT/ls2-jsonrpc-client)。另一种选择是创建一个 LimeSurvey 插件,将所需的数据作为JSON暴露(这可能会更高效,因为需要的往返次数更少)。

当 LimeSurvey 内部结构发生变化时,不需要适应依赖代码,唯一需要适应的是这些接口的实现。

注意

一些随机笔记,将移至适当的接口

  • QuestionInterface::getId() 必须在 LimeSurvey 安装中是唯一的,这也适用于“虚拟”对象,如量表问题。