/** * Retrieves user tracking and SCO data and default SCORM values * * @param int $scormid the scorm id * @param int $attempt the attempt number * @return array warnings and the scoes data * @throws moodle_exception * @since Moodle 3.0 */ public static function get_scorm_user_data($scormid, $attempt) { global $CFG, $DB; $params = self::validate_parameters(self::get_scorm_user_data_parameters(), array('scormid' => $scormid, 'attempt' => $attempt)); $data = array(); $warnings = array(); $scorm = $DB->get_record('scorm', array('id' => $params['scormid']), '*', MUST_EXIST); $cm = get_coursemodule_from_instance('scorm', $scorm->id); $context = context_module::instance($cm->id); self::validate_context($context); scorm_require_available($scorm, true, $context); $scorm->version = strtolower(clean_param($scorm->version, PARAM_SAFEDIR)); if (!file_exists($CFG->dirroot . '/mod/scorm/datamodels/' . $scorm->version . 'lib.php')) { $scorm->version = 'scorm_12'; } require_once $CFG->dirroot . '/mod/scorm/datamodels/' . $scorm->version . 'lib.php'; if ($scoes = scorm_get_scoes($scorm->id)) { $def = new stdClass(); $user = new stdClass(); foreach ($scoes as $sco) { $def->{$sco->id} = new stdClass(); $user->{$sco->id} = new stdClass(); // We force mode normal, this can be override by the client at any time. $def->{$sco->id} = get_scorm_default($user->{$sco->id}, $scorm, $sco->id, $params['attempt'], 'normal'); $userdata = array(); $defaultdata = array(); foreach ((array) $user->{$sco->id} as $key => $val) { $userdata[] = array('element' => $key, 'value' => $val); } foreach ($def->{$sco->id} as $key => $val) { $defaultdata[] = array('element' => $key, 'value' => $val); } $data[] = array('scoid' => $sco->id, 'userdata' => $userdata, 'defaultdata' => $defaultdata); } } $result = array(); $result['data'] = $data; $result['warnings'] = $warnings; return $result; }
require_once $CFG->dirroot . '/mod/scorm/locallib.php'; // Set some vars to use as default values. $userdata = new stdClass(); $def = new stdClass(); $cmiobj = new stdClass(); $cmiint = new stdClass(); if (!isset($currentorg)) { $currentorg = ''; } if ($scoes = $DB->get_records('scorm_scoes', array('scorm' => $scorm->id), 'sortorder, id')) { // Drop keys so that it is a simple array. $scoes = array_values($scoes); foreach ($scoes as $sco) { $def->{$sco->id} = new stdClass(); $userdata->{$sco->id} = new stdClass(); $def->{$sco->id} = get_scorm_default($userdata->{$sco->id}, $scorm, $sco->id, $attempt, $mode); // Reconstitute objectives. $cmiobj->{$sco->id} = scorm_reconstitute_array_element($scorm->version, $userdata->{$sco->id}, 'cmi.objectives', array('score')); $cmiint->{$sco->id} = scorm_reconstitute_array_element($scorm->version, $userdata->{$sco->id}, 'cmi.interactions', array('objectives', 'correct_responses')); } } // If SCORM 1.2 standard mode is disabled allow higher datamodel limits. if (intval(get_config("scorm", "scorm12standard"))) { $cmistring256 = '^[\\u0000-\\uFFFF]{0,255}$'; $cmistring4096 = '^[\\u0000-\\uFFFF]{0,4096}$'; } else { $cmistring256 = '^[\\u0000-\\uFFFF]{0,64000}$'; $cmistring4096 = $cmistring256; } $scorm->autocommit = $scorm->autocommit === "1" ? true : false; $scorm->masteryoverride = $scorm->masteryoverride === "1" ? true : false;