From 6a6709ec51dadce38371d81149fa806bc421ffa0 Mon Sep 17 00:00:00 2001 From: Nobelium Date: Sat, 9 Aug 2014 21:57:03 +0000 Subject: [PATCH] MDL-37401 mod_scorm : autocommit for scorm --- mod/scorm/datamodels/aicc.js | 13 ++++++++++--- mod/scorm/datamodels/aicc.php | 4 ++-- mod/scorm/datamodels/scorm_12.js | 13 ++++++++++--- mod/scorm/datamodels/scorm_12.php | 2 +- mod/scorm/datamodels/scorm_13.js | 14 ++++++++++---- mod/scorm/datamodels/scorm_13.php | 3 +-- mod/scorm/db/install.xml | 3 ++- mod/scorm/db/upgrade.php | 15 +++++++++++++++ mod/scorm/lang/en/scorm.php | 3 +++ mod/scorm/mod_form.php | 5 +++++ mod/scorm/settings.php | 3 +++ mod/scorm/version.php | 2 +- 12 files changed, 63 insertions(+), 17 deletions(-) mode change 100644 => 100755 mod/scorm/db/install.xml diff --git a/mod/scorm/datamodels/aicc.js b/mod/scorm/datamodels/aicc.js index 27362c34920..b2b4970e8e0 100644 --- a/mod/scorm/datamodels/aicc.js +++ b/mod/scorm/datamodels/aicc.js @@ -16,7 +16,7 @@ // // SCORM 1.2 API Implementation // -function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid) { +function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid, autocommit) { var prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a="+scormid+"&scoid="+scoid+"&attempt="+attempt+"&mode="+viewmode+"¤torg="+currentorg+"&sesskey="+sesskey; var datamodelurl = cfgwwwroot + "/mod/scorm/datamodel.php"; @@ -336,6 +336,9 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi } //Store data if (errorCode == "0") { + if (autocommit && !(AICCapi.timeout)) { + AICCapi.timeout = Y.later(60000, API, 'LMSCommit', [""], false); + } if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range')) != "undefined") { range = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range'); ranges = range.split('#'); @@ -376,6 +379,10 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi } function LMSCommit (param) { + if (AICCapi.timeout) { + AICCapi.timeout.cancel(); + AICCapi.timeout = null; + } errorCode = "0"; if (param == "") { if (Initialized) { @@ -544,6 +551,6 @@ function AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, vi M.scorm_api = {}; -M.scorm_api.init = function(Y, def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid) { - window.API = new AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid); +M.scorm_api.init = function(Y, def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid, autocommit) { + window.API = new AICCapi(def, cmiobj, scormauto, cfgwwwroot, scormid, scoid, attempt, viewmode, currentorg, sesskey, cmid, autocommit); } diff --git a/mod/scorm/datamodels/aicc.php b/mod/scorm/datamodels/aicc.php index 9e89734166f..950bf6ea31b 100644 --- a/mod/scorm/datamodels/aicc.php +++ b/mod/scorm/datamodels/aicc.php @@ -62,5 +62,5 @@ if ($scoes = $DB->get_records('scorm_scoes', array('scorm' => $scorm->id), 'sort } -$PAGE->requires->js_init_call('M.scorm_api.init', array($def, $cmiobj, $scorm->auto, $CFG->wwwroot, $scorm->id, $scoid, $attempt, - $mode, $currentorg, sesskey(), $id)); +$PAGE->requires->js_init_call('M.scorm_api.init', array($def, $cmiobj, $scorm->auto, $CFG->wwwroot, $scorm->id, $scoid, + $attempt, $mode, $currentorg, sesskey(), $id, $scorm->autocommit)); diff --git a/mod/scorm/datamodels/scorm_12.js b/mod/scorm/datamodels/scorm_12.js index a7a37b43643..e9fdfc24f21 100644 --- a/mod/scorm/datamodels/scorm_12.js +++ b/mod/scorm/datamodels/scorm_12.js @@ -16,7 +16,7 @@ // // SCORM 1.2 API Implementation // -function SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg) { +function SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit) { var prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a="+scormid+"&scoid="+scoid+"&attempt="+attempt+"&mode="+viewmode+"¤torg="+currentorg+"&sesskey="+sesskey; var datamodelurl = cfgwwwroot + "/mod/scorm/datamodel.php"; @@ -353,6 +353,9 @@ function SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebu } //Store data if (errorCode == "0") { + if (autocommit && !(SCORMapi1_2.timeout)) { + SCORMapi1_2.timeout = Y.later(60000, API, 'LMSCommit', [""], false); + } if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range')) != "undefined") { range = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range'); ranges = range.split('#'); @@ -402,6 +405,10 @@ function SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebu } function LMSCommit (param) { + if (SCORMapi1_2.timeout) { + SCORMapi1_2.timeout.cancel(); + SCORMapi1_2.timeout = null; + } errorCode = "0"; if (param == "") { if (Initialized) { @@ -653,6 +660,6 @@ function SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebu M.scorm_api = {}; -M.scorm_api.init = function(Y, def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg) { - window.API = new SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg); +M.scorm_api.init = function(Y, def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit) { + window.API = new SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit); } diff --git a/mod/scorm/datamodels/scorm_12.php b/mod/scorm/datamodels/scorm_12.php index 0d129cce90e..5cceedcce1d 100644 --- a/mod/scorm/datamodels/scorm_12.php +++ b/mod/scorm/datamodels/scorm_12.php @@ -53,7 +53,7 @@ if (intval(get_config("scorm", "scorm12standard"))) { $PAGE->requires->js_init_call('M.scorm_api.init', array($def, $cmiobj, $cmiint, $cmistring256, $cmistring4096, scorm_debugging($scorm), $scorm->auto, $scorm->id, $CFG->wwwroot, - sesskey(), $scoid, $attempt, $mode, $id, $currentorg)); + sesskey(), $scoid, $attempt, $mode, $id, $currentorg, $scorm->autocommit)); // pull in the debugging utilities if (scorm_debugging($scorm)) { diff --git a/mod/scorm/datamodels/scorm_13.js b/mod/scorm/datamodels/scorm_13.js index 4dfd1cb5be5..68fd5c63641 100644 --- a/mod/scorm/datamodels/scorm_13.js +++ b/mod/scorm/datamodels/scorm_13.js @@ -19,7 +19,7 @@ // // SCORM 1.3 API Implementation // -function SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg) { +function SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit) { var prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a="+scormid+"&scoid="+scoid+"&attempt="+attempt+"&mode="+viewmode+"¤torg="+currentorg+"&sesskey="+sesskey; var datamodelurl = cfgwwwroot + "/mod/scorm/datamodel.php"; @@ -744,7 +744,9 @@ function SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scorm } //Store data if (errorCode == "0") { - + if (autocommit && !(SCORMapi1_3.timeout)) { + SCORMapi1_3.timeout = Y.later(60000, API_1484_11, 'Commit', [""], false); + } if ((typeof eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range')) != "undefined") { range = eval('datamodel["'+scoid+'"]["'+elementmodel+'"].range'); ranges = range.split('#'); @@ -912,6 +914,10 @@ function SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scorm function Commit (param) { + if (SCORMapi1_3.timeout) { + SCORMapi1_3.timeout.cancel(); + SCORMapi1_3.timeout = null; + } errorCode = "0"; if (param == "") { if ((Initialized) && (!Terminated)) { @@ -1244,6 +1250,6 @@ function SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scorm M.scorm_api = {}; -M.scorm_api.init = function(Y, def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg) { - window.API_1484_11 = new SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg); +M.scorm_api.init = function(Y, def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit) { + window.API_1484_11 = new SCORMapi1_3(def, cmiobj, cmiint, cmicommentsuser, cmicommentslms, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit); } diff --git a/mod/scorm/datamodels/scorm_13.php b/mod/scorm/datamodels/scorm_13.php index 8b534dc1a89..e437cde4aa7 100644 --- a/mod/scorm/datamodels/scorm_13.php +++ b/mod/scorm/datamodels/scorm_13.php @@ -47,10 +47,9 @@ if ($scoes = $DB->get_records('scorm_scoes', array('scorm' => $scorm->id), 'sort } } - $PAGE->requires->js_init_call('M.scorm_api.init', array($def, $cmiobj, $cmiint, $cmicommentsuser, $cmicommentslms, scorm_debugging($scorm), $scorm->auto, $scorm->id, $CFG->wwwroot, - sesskey(), $scoid, $attempt, $mode, $id, $currentorg)); + sesskey(), $scoid, $attempt, $mode, $id, $currentorg, $scorm->autocommit)); // Pull in the debugging utilities. diff --git a/mod/scorm/db/install.xml b/mod/scorm/db/install.xml old mode 100644 new mode 100755 index 09551f7c7b2..e77d22a8779 --- a/mod/scorm/db/install.xml +++ b/mod/scorm/db/install.xml @@ -1,5 +1,5 @@ - @@ -45,6 +45,7 @@ + diff --git a/mod/scorm/db/upgrade.php b/mod/scorm/db/upgrade.php index 2beabb78e85..133a6184661 100644 --- a/mod/scorm/db/upgrade.php +++ b/mod/scorm/db/upgrade.php @@ -279,6 +279,21 @@ function xmldb_scorm_upgrade($oldversion) { // Moodle v2.7.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2014072500) { + + // Define field autocommit to be added to scorm. + $table = new xmldb_table('scorm'); + $field = new xmldb_field('autocommit', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'displayactivityname'); + + // Conditionally launch add field autocommit. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Scorm savepoint reached. + upgrade_mod_savepoint(true, 2014072500, 'scorm'); + } + return true; } diff --git a/mod/scorm/lang/en/scorm.php b/mod/scorm/lang/en/scorm.php index ca6b997efd9..e202966c1aa 100644 --- a/mod/scorm/lang/en/scorm.php +++ b/mod/scorm/lang/en/scorm.php @@ -55,6 +55,9 @@ $string['attemptsx'] = '{$a} attempts'; $string['attemptsmanagement'] = 'Attempts management'; $string['attempt1'] = '1 attempt'; $string['attr_error'] = 'Bad value for attribute ({$a->attr}) in tag {$a->tag}.'; +$string['autocommit'] = 'Auto-commit'; +$string['autocommit_help'] = 'If enabled, SCORM data is automaticaly saved to the database. Useful for SCORM objects which do not save their data regularly.'; +$string['autocommitdesc'] = 'Automatically save SCORM data if the SCORM package does not save it.'; $string['autocontinue'] = 'Auto-continue'; $string['autocontinue_help'] = 'If enabled, subsequent learning objects are launched automatically, otherwise the Continue button must be used.'; $string['autocontinuedesc'] = 'If enabled, subsequent learning objects are launched automatically, otherwise the Continue button must be used.'; diff --git a/mod/scorm/mod_form.php b/mod/scorm/mod_form.php index 57f67764bca..9fbf92eb983 100644 --- a/mod/scorm/mod_form.php +++ b/mod/scorm/mod_form.php @@ -256,6 +256,11 @@ class mod_scorm_mod_form extends moodleform_mod { $mform->addHelpButton('auto', 'autocontinue', 'scorm'); $mform->setDefault('auto', $cfgscorm->auto); + // Autocommit. + $mform->addElement('selectyesno', 'autocommit', get_string('autocommit', 'scorm')); + $mform->addHelpButton('autocommit', 'autocommit', 'scorm'); + $mform->setDefault('autocommit', $cfgscorm->autocommit); + // Hidden Settings. $mform->addElement('hidden', 'datadir', null); $mform->setType('datadir', PARAM_RAW); diff --git a/mod/scorm/settings.php b/mod/scorm/settings.php index ab78be15afc..2c4472389c1 100644 --- a/mod/scorm/settings.php +++ b/mod/scorm/settings.php @@ -111,6 +111,9 @@ if ($ADMIN->fulltree) { $settings->add(new admin_setting_configselect('scorm/forcenewattempt', get_string('forcenewattempt', 'scorm'), get_string('forcenewattemptdesc', 'scorm'), 0, $yesno)); + $settings->add(new admin_setting_configselect('scorm/autocommit', + get_string('autocommit', 'scorm'), get_string('autocommitdesc', 'scorm'), 0, $yesno)); + $settings->add(new admin_setting_configselect('scorm/lastattemptlock', get_string('lastattemptlock', 'scorm'), get_string('lastattemptlockdesc', 'scorm'), 0, $yesno)); diff --git a/mod/scorm/version.php b/mod/scorm/version.php index f622af2f44b..206092ccdc2 100644 --- a/mod/scorm/version.php +++ b/mod/scorm/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2014071500; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2014072500; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2014050800; // Requires this Moodle version. $plugin->component = 'mod_scorm'; // Full name of the plugin (used for diagnostics). $plugin->cron = 300;