如何基于Pipwerks SCORM API记录学员测验答案至SabaCloud
针对SCORM 1.2 + SabaCloud记录测验答案的实现方案
你用的SCORM 1.2版本没有专门的测验答案存储字段,官方推荐用cmi.core.suspend_data字段来存储自定义结构化数据(比如测验答案),SabaCloud完全支持这个字段的读写。结合你现有的Pipwerks代码,按以下步骤实现:
1. 收集并序列化测验答案
在Vue组件里先写一个函数,把用户的测验答案转成JSON字符串(方便存储和后续解析):
// 假设你的测验答案存在Vue的data中,比如quizAnswers是键为题目ID、值为用户选项的对象 function getQuizAnswersJson() { const quizAnswers = this.quizAnswers; // 替换成你实际的答案存储变量 return JSON.stringify(quizAnswers); }
2. 修改现有SCORM代码,添加存储逻辑
方式一:在现有函数中扩展
如果你的现有函数是统一处理SCORM参数设置的,可以直接扩展逻辑,处理suspend_data的存储:
var API = scorm.API.getHandle(), errorCode = 0; if (API) { switch (scorm.version) { case "1.2": success = makeBoolean(API.LMSSetValue(parameter, value)); break; case "2004": success = makeBoolean(API.SetValue(parameter, value)); break; } if (success) { if (parameter === "cmi.core.lesson_status" || parameter === "cmi.completion_status") { scorm.data.completionStatus = value; } // 新增:处理测验答案存储 if (parameter === "cmi.core.suspend_data") { scorm.data.suspendData = value; // 把答案存在本地缓存,方便后续读取 // 手动触发LMS提交,确保数据写入SabaCloud if (scorm.version === "1.2") { API.LMSCommit(""); } } } else { errorCode = debug.getCode(); trace(traceMsgPrefix + "failed. \nError code: " + errorCode + ". \nError info: " + debug.getInfo(errorCode)); } } else { trace(traceMsgPrefix + "failed: API is null."); }
方式二:单独封装存储函数
更清晰的做法是单独写一个函数存储测验答案,避免和原有逻辑耦合:
function saveQuizAnswers(answers) { const API = scorm.API.getHandle(); if (!API) { trace("SCORM API not found, can't save quiz answers"); return false; } const answersJson = JSON.stringify(answers); let success = false; if (scorm.version === "1.2") { success = makeBoolean(API.LMSSetValue("cmi.core.suspend_data", answersJson)); } if (success) { scorm.data.suspendData = answersJson; API.LMSCommit(""); // 强制提交到LMS trace("Quiz answers saved successfully"); return true; } else { const errorCode = debug.getCode(); trace(`Failed to save quiz answers. Error code: ${errorCode}, Info: ${debug.getInfo(errorCode)}`); return false; } } // 在Vue提交测验时调用: // this.saveQuizAnswers(this.quizAnswers);
3. 读取已保存的测验答案(可选)
如果需要用户重新进入课程时加载之前的答案,写一个读取函数:
function loadSavedQuizAnswers() { const API = scorm.API.getHandle(); if (!API) { trace("SCORM API not found, can't load quiz answers"); return null; } let answersJson = API.LMSGetValue("cmi.core.suspend_data"); // 处理空值或无效JSON的情况 if (!answersJson || answersJson === "undefined") { return null; } try { const answers = JSON.parse(answersJson); scorm.data.suspendData = answersJson; return answers; } catch (e) { trace(`Failed to parse saved quiz answers: ${e.message}`); return null; } } // 在Vue组件初始化时调用: // const savedAnswers = this.loadSavedQuizAnswers(); // if (savedAnswers) { // this.quizAnswers = savedAnswers; // }
注意事项
- 长度限制:SCORM 1.2的
suspend_data最大长度为4096字符,若测验答案较多,建议优化数据结构(比如用短键名)避免超出限制。 - 提交时机:用户提交测验后立即调用保存函数,并通过
LMSCommit触发数据写入,部分LMS不会自动保存,需手动触发。 - SabaCloud兼容性:SabaCloud对SCORM 1.2的
suspend_data支持良好,无需额外配置,按标准API调用即可。
内容的提问来源于stack exchange,提问作者SlayerCat
相关产品推荐
相关产品推荐

