LimeSurvey RemoteControl2 API - 任何 add_response PHP 示例?

Posted

技术标签:

【中文标题】LimeSurvey RemoteControl2 API - 任何 add_response PHP 示例?【英文标题】:LimeSurvey RemoteControl2 API - Any add_response PHP examples? 【发布时间】:2014-04-16 22:58:36 【问题描述】:

我在第三方服务器(html/JS/CSS/php)上手动设置了一项调查,其中包含一些 LimeSurvey 中不可用的附加功能(即 jQuery Mobile、slicker dseign 等)并进行了设置具有与我在 LimeSurvey 中呈现和编码的实际调查相同的表单元素名称/值对。

我试图通过 JSON-RPC API 远程提交表单的操作如下(在 PHP 中,基于他们的示例,仅检索 add_response 的基本调查数据):

<?php
include "jsonRPCClient.php";
/* using LimeSurvey (LS) RemoteControly API version 2's JSON-RPC method */
define("LS_BASEURL", 'http://'.$host.$path);  // adjust this one to your actual LimeSurvey URL
define("LS_USER", $username);
define("LS_PASSWORD", $password);

//instantiate a new client
$jsonRPC = new jsonRPCClient(LS_BASEURL);

//receive session key
$sessionKey = $jsonRPC->get_session_key(LS_USER, LS_PASSWORD);

//get response data from FORM input values
$response_data = $_POST; 

//submit survey response data
$groups = $jsonRPC->add_response($sessionKey, $survey_id, $response_data);

//release the session key
$jsonRPC->release_session_key($sessionKey);
?>

我希望它会像将我的所有表单输入发布到这个名为“limesurvey.collector.php”的脚本一样简单,并且只需为表单元素赋予相同的名称(并注意不要进一步更改它们,以便它们获得新的分配的名称/代码)。

而且我认为它正在工作,因为正确的调查 ID 显示了新记录,但是没有发送值,这是我在 LimeSurvey 方面看到的: (注意:第一个响应是正确的,直接从调查中手动提交,第二个响应是来自 API 的错误响应,没有设置任何值)

我认为这并不重要,但这是我的 jQuery 在远程 FORM 中执行 POST:

var POST_DATA =  
    java527317X1X11 : q1, 
    "527317X1X11" : q1, 
    java527317X1X12 : q2, 
    "527317X1X12" : q2, 
    java527317X1X13 : q3, 
    "527317X1X13" : q3, 
    java527317X1X14 : q4, 
    "527317X1X14" : q4, 
    java527317X1X15 : q5, 
    "527317X1X15" : q5, 
    java527317X1X16 : q6, 
    "527317X1X16" : q6, 
    java527317X1X17 : q7, 
    "527317X1X17" : q7, 
    java527317X1X18 : q8, 
    "527317X1X18" : q8, 
    java527317X1X19 : q9, 
    "527317X1X19" : q9, 
    java527317X1X110 : q10, 
    "527317X1X110" : q10, 
    java527317X1X111 : q11, 
    "527317X1X111" : q11, 
    java527317X1X112 : q12, 
    "527317X1X112" : q12, 
    java527317X1X113 : q13, 
    "527317X1X113" : q13, 
    java527317X1X114 : q14, 
    "527317X1X114" : q14, 
    java527317X1X115 : q15, 
    "527317X1X115" : q15, 
    java527317X1X116 : q16, 
    "527317X1X116" : q16,       
    java527317X1X38 : gender, 
    "527317X1X38" : gender,             
    java527317X1X39 : yearsWork, 
    "527317X1X39" : yearsWork,          
    java527317X1X40 : specialty, 
    "527317X1X40" : specialty,          
    java527317X1X41 : workHours, 
    "527317X1X41" : workHours, 
    lastgroup : "527317X1", 
    relevance1 : "1", 
    relevance38 : "1", 
    relevance39 : "1", 
    relevance40 : "1", 
    relevance41 : "1", 
    relevanceG0 : "1", 
    movesubmit : "qmovesubmit", 
    thisstep : "1", 
    sid : "527317", 
    start_time : "1397651769", 
    LEMpostKey : "145856491"
  ;

$.ajax(
  url: PROXY_URL+"http://localhost/survey/limesurvey.collector.php",
  type: "POST",
  data: POST_DATA,
  complete: function(xmlHttp) 
    if(xmlHttp.status.toString() == '200')                 
        $("#framediv").css('display':'block');
     else  
        window.open(xmlHttp.getResponseHeader('Location'));
        //DEBUG:  
                    console.log("Status: " + xmlHttp.status);
    
  

使用简单的 jQuery 值访问正确设置了所有 jQuery 值(正如我在控制台日志中看到的那样): $('#fieldname').val()

还有什么可能遗漏的吗? add_response API 调用可能只是一个纯文本 POST 值不够吗?可能我需要将每个响应值手动格式化为 JSON-RPC 样式的单个名称/值对,但如果是这样,每个响应值使用哪个标签? “527317X1X11”或“java527317X1X11”类型之一? 或者,它是不是更像 XML-RPC 的 &lt;param&gt;&lt;value&gt; 列表?

编辑:我确实意识到简单地编辑 LimeSurvey CSS/JS 模板以添加移动调查设计内容可能要容易得多,但是,特别是这个调查(以及其他类似的)我需要完全控制不仅是针对调查的自定义样式,还包括发生的域重定向并进行额外处理,例如还将响应提交到另一个托管单独(非 Lime-Survey)调查数据收集服务的医疗服务器。

更新:(顶部的 PHP 代码不完整,此代码适用于我正在尝试做的事情):

<?php
include "jsonRPCClient.php";
/* using LimeSurvey (LS) RemoteControly API version 2's JSON-RPC method */
define("LS_BASEURL", 'http://'.$host.$path);  // adjust this one to your actual LimeSurvey URL
define("LS_USER", $username);
define("LS_PASSWORD", $password);

//instantiate a new client
$jsonRPC = new jsonRPCClient(LS_BASEURL);

//receive session key
$sessionKey = $jsonRPC->get_session_key(LS_USER, LS_PASSWORD);


//get response data from FORM input values
$response_data = array(); 
foreach ($_POST as $key => $value) 
  $response_data[$key] = $value;
  

//submit survey response data
$groups = $jsonRPC->add_response($sessionKey, $survey_id, $response_data);

//release the session key
$jsonRPC->release_session_key($sessionKey);

?>

【问题讨论】:

在不发表评论的情况下对问题投反对票,这是提高问题质量的绝妙方法! 很高兴知道,谢谢......实现版本控制系统或任何东西。 你真的不应该编辑来修复问题中的代码。同样,这就是答案部分的用途。您可以“接受”(或投票)一个答案(给予帮助的人适当的信用),并发布您自己的答案,其中包含完全固定和工作的代码。将工作代码放在问题中只会增加混乱,因为未来的读者希望问题只包含下面解决的问题。 (我不推荐它,但我想在有限的情况下,可以作为问题的附录编辑少量更正的代码。) 【参考方案1】:

$aResponseData 必须是要在表中设置的答案数组,看看您的示例,对于 Q1_1、Q1_2、q1_3 有相同的 3 个答案,您可以使用

    $response_data = array(
        "527317X1X11" => "3", 
        "527317X1X12" => "2", 
        "527317X1X13" => "3", 
    );

先用这个测试一下。 您可以使用 startdate 设置提交日期的开始日期和 submltdate

【讨论】:

哇,知道它一定是这样简单的......谢谢! (请随时将此问题投票归零,因为我知道此信息将来会派上用场) 你测试了没问题?如果是,也许您的 var POST_DATA 或/和limesurvey.collector.php 脚本有一些更新? YES 当我使用上述更新的传递参数的方法(分解 POST 请求)时效果很好......虽然在这里我猜那种带有“更新”通知的编辑显然不是最好的显示您自己的损坏代码的固定版本的方式。不相关,但如果有其他方法而不是提交您自己的问题的答案,那就太好了

以上是关于LimeSurvey RemoteControl2 API - 任何 add_response PHP 示例?的主要内容,如果未能解决你的问题,请参考以下文章

LimeSurvey 远程控制 - 在 import_survey 中途失败

LimeSurvey:无论如何要使用 get_session_key , JSON-RPC 和 Authwebserver?

尝试发布到 Limesurvey RC API 时出现 Node.js 错误,ECONNREFUSED

是否有可能创建一个像limesurvey这样的调查网站?

LimeSurvey Remote Control API:获取标记为“N/A”的无关响应

Linux下scp的用法