MDL-35870 mod_scorm : Removing loaddatamodel.php

This commit is contained in:
Nobelium 2014-07-10 14:17:32 +00:00
parent 7b9036be25
commit 3ad5eeedcf
10 changed files with 198 additions and 183 deletions

View File

@ -14,33 +14,24 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
if (isset($userdata->status)) {
if ($userdata->status == '') {
$userdata->entry = 'ab-initio';
} else {
if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
$userdata->entry = 'resume';
} else {
$userdata->entry = '';
}
}
}
require_once($CFG->dirroot.'/mod/scorm/locallib.php');
$userdata = new stdClass();
$def = get_scorm_default($userdata, $scorm, $scoid, $attempt, $mode);
if (!isset($currentorg)) {
$currentorg = '';
}
$def = get_scorm_default($userdata);
$cmiobj = '';
$current_objective = '';
$currentobj = '';
$count = 0;
$objectives = '';
foreach ($userdata as $element => $value) {
if (substr($element, 0, 14) == 'cmi.objectives') {
$element = preg_replace('/\.(\d+)\./', "_\$1.", $element);
preg_match('/\_(\d+)\./', $element, $matches);
if (count($matches) > 0 && $current_objective != $matches[1]) {
$current_objective = $matches[1];
if (count($matches) > 0 && $currentobj != $matches[1]) {
$currentobj = $matches[1];
$count++;
$end = strpos($element, $matches[1])+strlen($matches[1]);
$subelement = substr($element, 0, $end);
@ -58,4 +49,5 @@ if ($count > 0) {
$cmiobj .= ' cmi.objectives._count = '.$count.";\n";
}
$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));

View File

@ -479,7 +479,54 @@ function scorm_aicc_generate_simple_sco($scorm) {
return $id;
}
function get_scorm_default ($userdata) {
function get_scorm_default (&$userdata, $scorm, $scoid, $attempt, $mode) {
global $USER;
$userdata->student_id = $USER->username;
$userdata->student_name = $USER->lastname .', '. $USER->firstname;
if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) {
foreach ($usertrack as $key => $value) {
$userdata->$key = $value;
}
} else {
$userdata->status = '';
$userdata->score_raw = '';
}
if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) {
foreach ($scodatas as $key => $value) {
$userdata->$key = $value;
}
} else {
print_error('cannotfindsco', 'scorm');
}
if (!$sco = scorm_get_sco($scoid)) {
print_error('cannotfindsco', 'scorm');
}
$userdata->mode = 'normal';
if (!empty($mode)) {
$userdata->mode = $mode;
}
if ($userdata->mode == 'normal') {
$userdata->credit = 'credit';
} else {
$userdata->credit = 'no-credit';
}
if (isset($userdata->status)) {
if ($userdata->status == '') {
$userdata->entry = 'ab-initio';
} else {
if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
$userdata->entry = 'resume';
} else {
$userdata->entry = '';
}
}
}
$def = array();
$def['cmi.core.student_id'] = $userdata->student_id;
$def['cmi.core.student_name'] = $userdata->student_name;

View File

@ -16,17 +16,10 @@
require_once($CFG->dirroot.'/mod/scorm/locallib.php');
if (isset($userdata->status)) {
if ($userdata->status == '') {
$userdata->entry = 'ab-initio';
} else {
if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
$userdata->entry = 'resume';
} else {
$userdata->entry = '';
}
}
}
// Set some vars to use as default values.
$userdata = new stdClass();
$def = get_scorm_default($userdata, $scorm, $scoid, $attempt, $mode);
if (!isset($currentorg)) {
$currentorg = '';
}
@ -40,9 +33,6 @@ if (intval(get_config("scorm", "scorm12standard"))) {
$cmistring4096 = $cmistring256;
}
// Set some vars to use as default values.
$def = get_scorm_default($userdata);
// reconstitute objectives
$cmiobj = scorm_reconstitute_array_element($scorm->version, $userdata, 'cmi.objectives', array('score'));
$cmiint = scorm_reconstitute_array_element($scorm->version, $userdata, 'cmi.interactions', array('objectives', 'correct_responses'));

View File

@ -121,7 +121,54 @@ function scorm_eval_prerequisites($prerequisites, $usertracks) {
return eval('return '.implode($stack).';');
}
function get_scorm_default ($userdata) {
function get_scorm_default (&$userdata, $scorm, $scoid, $attempt, $mode) {
global $USER;
$userdata->student_id = $USER->username;
$userdata->student_name = $USER->lastname .', '. $USER->firstname;
if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) {
foreach ($usertrack as $key => $value) {
$userdata->$key = $value;
}
} else {
$userdata->status = '';
$userdata->score_raw = '';
}
if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) {
foreach ($scodatas as $key => $value) {
$userdata->$key = $value;
}
} else {
print_error('cannotfindsco', 'scorm');
}
if (!$sco = scorm_get_sco($scoid)) {
print_error('cannotfindsco', 'scorm');
}
if (isset($userdata->status)) {
if ($userdata->status == '') {
$userdata->entry = 'ab-initio';
} else {
if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
$userdata->entry = 'resume';
} else {
$userdata->entry = '';
}
}
}
$userdata->mode = 'normal';
if (!empty($mode)) {
$userdata->mode = $mode;
}
if ($userdata->mode == 'normal') {
$userdata->credit = 'credit';
} else {
$userdata->credit = 'no-credit';
}
$def = array();
$def['cmi.core.student_id'] = $userdata->student_id;
$def['cmi.core.student_name'] = $userdata->student_name;

View File

@ -16,23 +16,13 @@
require_once($CFG->dirroot.'/mod/scorm/locallib.php');
if (isset($userdata->status)) {
if (!isset($userdata->{'cmi.exit'}) || (($userdata->{'cmi.exit'} == 'time-out') || ($userdata->{'cmi.exit'} == 'normal'))) {
$userdata->entry = 'ab-initio';
} else {
if (isset($userdata->{'cmi.exit'}) && (($userdata->{'cmi.exit'} == 'suspend') || ($userdata->{'cmi.exit'} == 'logout'))) {
$userdata->entry = 'resume';
} else {
$userdata->entry = '';
}
}
}
$userdata = new stdClass();
$def = get_scorm_default($userdata, $scorm, $scoid, $attempt, $mode);
if (!isset($currentorg)) {
$currentorg = '';
}
$def = get_scorm_default($userdata);
// reconstitute objectives, comments_from_learner and comments_from_lms
$cmiobj = scorm_reconstitute_array_element($scorm->version, $userdata, 'cmi.objectives', array('score'));
$cmiint = scorm_reconstitute_array_element($scorm->version, $userdata, 'cmi.interactions', array('objectives', 'correct_responses'));

View File

@ -1181,7 +1181,72 @@ function scorm_seq_flow ($activity, $direction, $seq, $childrenflag, $userid) {
}
}
function get_scorm_default ($userdata) {
function get_scorm_default (&$userdata, $scorm, $scoid, $attempt, $mode) {
global $DB, $USER;
$userdata->student_id = $USER->username;
$userdata->student_name = $USER->lastname .', '. $USER->firstname;
if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) {
// According to SCORM 2004(RTE V1, 4.2.8), only cmi.exit==suspend should allow previous datamodel elements on re-launch.
if (isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} == 'suspend')) {
foreach ($usertrack as $key => $value) {
$userdata->$key = $value;
}
} else {
$userdata->status = '';
$userdata->score_raw = '';
}
} else {
$userdata->status = '';
$userdata->score_raw = '';
}
if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) {
foreach ($scodatas as $key => $value) {
$userdata->$key = $value;
}
} else {
print_error('cannotfindsco', 'scorm');
}
if (!$sco = scorm_get_sco($scoid)) {
print_error('cannotfindsco', 'scorm');
}
if (isset($userdata->status)) {
if (!isset($userdata->{'cmi.exit'}) || $userdata->{'cmi.exit'} == 'time-out' || $userdata->{'cmi.exit'} == 'normal') {
$userdata->entry = 'ab-initio';
} else {
if (isset($userdata->{'cmi.exit'}) && ($userdata->{'cmi.exit'} == 'suspend' || $userdata->{'cmi.exit'} == 'logout')) {
$userdata->entry = 'resume';
} else {
$userdata->entry = '';
}
}
}
$userdata->mode = 'normal';
if (!empty($mode)) {
$userdata->mode = $mode;
}
if ($userdata->mode == 'normal') {
$userdata->credit = 'credit';
} else {
$userdata->credit = 'no-credit';
}
$objectives = $DB->get_records('scorm_seq_objective', array('scoid' => $scoid));
$index = 0;
foreach ($objectives as $objective) {
if (!empty($objective->minnormalizedmeasure)) {
$userdata->{'cmi.scaled_passing_score'} = $objective->minnormalizedmeasure;
}
if (!empty($objective->objectiveid)) {
$userdata->{'cmi.objectives.N'.$index.'.id'} = $objective->objectiveid;
$index++;
}
}
$def = array();
$def['cmi.learner_id'] = $userdata->student_id;
$def['cmi.learner_name'] = $userdata->student_name;

View File

@ -1,112 +0,0 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This page loads the correct JS file based on package type
*
* @package mod_scorm
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once("../../config.php");
require_once('locallib.php');
$id = optional_param('id', 0, PARAM_INT); // Course Module ID, or
$a = optional_param('a', 0, PARAM_INT); // scorm ID.
$scoid = required_param('scoid', PARAM_INT); // sco ID.
$mode = optional_param('mode', '', PARAM_ALPHA); // navigation mode.
$currentorg = optional_param('currentorg', '', PARAM_RAW); // Selected organization.
$attempt = required_param('attempt', PARAM_INT); // new attempt.
if (!empty($id)) {
$cm = get_coursemodule_from_id('scorm', $id, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$scorm = $DB->get_record('scorm', array('id' => $cm->instance), '*', MUST_EXIST);
} else if (!empty($a)) {
$scorm = $DB->get_record('scorm', array('id' => $a), '*', MUST_EXIST);
$course = $DB->get_record('course', array('id' => $scorm->course), '*', MUST_EXIST);
$cm = get_coursemodule_from_instance('scorm', $scorm->id, $course->id, false, MUST_EXIST);
} else {
print_error('missingparameter');
}
$PAGE->set_url('/mod/scorm/loaddatamodel.php', array('scoid' => $scoid, 'id' => $cm->id));
require_login($course, false, $cm);
$userdata = new stdClass();
if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) {
// According to SCORM 2004 spec(RTE V1, 4.2.8), only cmi.exit==suspend should allow previous datamodel elements on re-launch.
if (!scorm_version_check($scorm->version, SCORM_13) ||
(isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} == 'suspend'))) {
foreach ($usertrack as $key => $value) {
$userdata->$key = addslashes_js($value);
}
} else {
$userdata->status = '';
$userdata->score_raw = '';
}
} else {
$userdata->status = '';
$userdata->score_raw = '';
}
$userdata->student_id = addslashes_js($USER->username);
$userdata->student_name = addslashes_js($USER->lastname .', '. $USER->firstname);
$userdata->mode = 'normal';
if (!empty($mode)) {
$userdata->mode = $mode;
}
if ($userdata->mode == 'normal') {
$userdata->credit = 'credit';
} else {
$userdata->credit = 'no-credit';
}
if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) {
foreach ($scodatas as $key => $value) {
$userdata->$key = addslashes_js($value);
}
} else {
print_error('cannotfindsco', 'scorm');
}
if (!$sco = scorm_get_sco($scoid)) {
print_error('cannotfindsco', 'scorm');
}
if (scorm_version_check($scorm->version, SCORM_13)) {
$objectives = $DB->get_records('scorm_seq_objective', array('scoid' => $scoid));
$index = 0;
foreach ($objectives as $objective) {
if (!empty($objective->minnormalizedmeasure)) {
$userdata->{'cmi.scaled_passing_score'} = $objective->minnormalizedmeasure;
}
if (!empty($objective->objectiveid)) {
$userdata->{'cmi.objectives.N'.$index.'.id'} = $objective->objectiveid;
$index++;
}
}
}
header('Content-Type: text/javascript; charset=UTF-8');
// Set the start time of this SCO.
scorm_insert_track($USER->id, $scorm->id, $scoid, $attempt, 'x.start.time', time());
?>
var errorCode = "0";
function underscore(str) {
str = String(str).replace(/.N/g,".");
return str.replace(/\./g,"__");
}

View File

@ -1033,8 +1033,8 @@ function scorm_reconstitute_array_element($sversion, $userdata, $elementname, $c
preg_match('/\_(\d+)\./', $element, $matches);
}
if (count($matches) > 0 && $current != $matches[1]) {
if ($count_sub > 0) {
$return .= ' '.$element_name.$scormseperator.$current.'.'.$current_subelement.'._count = '.$count_sub.";\n";
if ($countsub > 0) {
$return .= ' '.$elementname.$scormseperator.$current.'.'.$currentsubelement.'._count = '.$countsub.";\n";
}
$current = $matches[1];
$count++;
@ -1061,9 +1061,9 @@ function scorm_reconstitute_array_element($sversion, $userdata, $elementname, $c
}
// Check the sub element type.
if (count($matches) > 0 && $current_subelement != $matches[1]) {
if ($count_sub > 0) {
$return .= ' '.$element_name.$scormseperator.$current.'.'.$current_subelement.'._count = '.$count_sub.";\n";
if (count($matches) > 0 && $currentsubelement != $matches[1]) {
if ($countsub > 0) {
$return .= ' '.$elementname.$scormseperator.$current.'.'.$currentsubelement.'._count = '.$countsub.";\n";
}
$currentsubelement = $matches[1];
$currentsub = '';
@ -1084,11 +1084,11 @@ function scorm_reconstitute_array_element($sversion, $userdata, $elementname, $c
$return .= ' '.$element.' = \''.$value."';\n";
}
if ($count_sub > 0) {
$return .= ' '.$element_name.$scormseperator.$current.'.'.$current_subelement.'._count = '.$count_sub.";\n";
if ($countsub > 0) {
$return .= ' '.$elementname.$scormseperator.$current.'.'.$currentsubelement.'._count = '.$countsub.";\n";
}
if ($count > 0) {
$return .= ' '.$element_name.'._count = '.$count.";\n";
$return .= ' '.$elementname.'._count = '.$count.";\n";
}
return $return;
}

View File

@ -27,6 +27,11 @@ mod_scorm_activate_item = null;
mod_scorm_parse_toc_tree = null;
scorm_layout_widget = null;
function underscore(str) {
str = String(str).replace(/.N/g,".");
return str.replace(/\./g,"__");
}
M.mod_scorm = {};
M.mod_scorm.init = function(Y, nav_display, navposition_left, navposition_top, hide_toc, collapsetocwinsize, toc_title, window_name, launch_sco, scoes_nav) {
@ -139,18 +144,6 @@ M.mod_scorm.init = function(Y, nav_display, navposition_left, navposition_top, h
el_old_api.parentNode.removeChild(el_old_api);
}
if (node.title) {
var el_scorm_api = document.getElementById("external-scormapi");
el_scorm_api.parentNode.removeChild(el_scorm_api);
el_scorm_api = document.createElement('script');
el_scorm_api.setAttribute('id','external-scormapi');
el_scorm_api.setAttribute('type','text/javascript');
var pel_scorm_api = document.getElementById('scormapi-parent');
pel_scorm_api.appendChild(el_scorm_api);
var api_url = M.cfg.wwwroot + '/mod/scorm/loaddatamodel.php?' + node.title;
document.getElementById('external-scormapi').src = api_url;
}
var content = Y.one('#scorm_content');
var obj = document.createElement('iframe');
obj.setAttribute('id', 'scorm_object');

View File

@ -254,10 +254,10 @@ if (!empty($forcejs)) {
echo $OUTPUT->box(get_string("forcejavascriptmessage", "scorm"), "generalbox boxaligncenter forcejavascriptmessage");
}
if (file_exists($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'.js.php')) {
include_once($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'.js.php');
if (file_exists($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'.php')) {
include_once($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'.php');
} else {
include_once($CFG->dirroot.'/mod/scorm/datamodels/scorm_12.js.php');
include_once($CFG->dirroot.'/mod/scorm/datamodels/scorm_12.php');
}
// Add the checknet system to keep checking for a connection.
@ -266,3 +266,6 @@ $PAGE->requires->yui_module('moodle-core-checknet', 'M.core.checknet.init', arra
'message' => array('networkdropped', 'mod_scorm'),
)));
echo $OUTPUT->footer();
// Set the start time of this SCO.
scorm_insert_track($USER->id, $scorm->id, $scoid, $attempt, 'x.start.time', time());