2 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
3 header("Cache-Control: no-cache");
4 header("Pragma: no-cache");
6 require_once('../../config.php');
7 include_once($CFG->dirroot
.'/mod/scorm/lib.php');
8 require_once($CFG->dirroot
.'/mod/scorm/locallib.php');
9 require_once($CFG->dirroot
.'/mod/scorm/datamodels/aicclib.php');
11 foreach ($_POST as $key => $value) {
12 $tempkey = strtolower($key);
13 $_POST[$tempkey] = $value;
16 $command = required_param('command', PARAM_ALPHA
);
17 $sessionid = required_param('session_id', PARAM_ALPHANUM
);
18 $aiccdata = optional_param('aicc_data', '', PARAM_RAW
);
22 if (!empty($command) && confirm_sesskey($sessionid)) {
23 $command = strtolower($command);
25 if (isset($SESSION->scorm_scoid
)) {
26 $scoid = $SESSION->scorm_scoid
;
28 error('Invalid script call');
31 if (isset($SESSION->scorm_mode
)) {
32 $mode = $SESSION->scorm_mode
;
34 $status = 'Not Initialized';
35 if (isset($SESSION->scorm_status
)) {
36 $status = $SESSION->scorm_status
;
38 if (isset($SESSION->scorm_attempt
)) {
39 $attempt = $SESSION->scorm_attempt
;
44 if ($sco = scorm_get_sco($scoid, SCO_ONLY
)) {
45 if (!$scorm = get_record('scorm','id',$sco->scorm
)) {
46 error('Invalid script call');
49 error('Invalid script call');
52 if ($scorm = get_record('scorm','id',$sco->scorm
)) {
55 if ($status == 'Not Initialized') {
56 $SESSION->scorm_status
= 'Running';
59 if ($status != 'Running') {
60 echo "error=101\r\nerror_text=Terminated\r\n";
62 if ($usertrack=scorm_get_tracks($scoid,$USER->id
,$attempt)) {
63 $userdata = $usertrack;
65 $userdata->status
= '';
66 $userdata->score_raw
= '';
68 $userdata->student_id
= $USER->username
;
69 $userdata->student_name
= $USER->lastname
.', '. $USER->firstname
;
70 $userdata->mode
= $mode;
71 if ($userdata->mode
== 'normal') {
72 $userdata->credit
= 'credit';
74 $userdata->credit
= 'no-credit';
77 if ($sco = scorm_get_sco($scoid)) {
78 $userdata->course_id
= $sco->identifier
;
79 $userdata->datafromlms
= isset($sco->datafromlms
)?
$sco->datafromlms
:'';
80 $userdata->mastery_score
= isset($sco->mastery_score
)?
$sco->mastery_score
:'';
81 $userdata->max_time_allowed
= isset($sco->max_time_allowed
)?
$sco->max_time_allowed
:'';
82 $userdata->time_limit_action
= isset($sco->time_limit_action
)?
$sco->time_limit_action
:'';
83 echo "error=0\r\nerror_text=Successful\r\naicc_data=";
85 echo 'Student_ID='.$userdata->student_id
."\r\n";
86 echo 'Student_Name='.$userdata->student_name
."\r\n";
87 if (isset($userdata->{'cmi.core.lesson_location'})) {
88 echo 'Lesson_Location='.$userdata->{'cmi.core.lesson_location'}."\r\n";
90 echo 'Lesson_Location='."\r\n";
92 echo 'Credit='.$userdata->credit
."\r\n";
93 if (isset($userdata->status
)) {
94 if ($userdata->status
== '') {
95 $userdata->entry
= ', ab-initio';
97 if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
98 $userdata->entry
= ', resume';
100 $userdata->entry
= '';
104 if (isset($userdata->{'cmi.core.lesson_status'})) {
105 echo 'Lesson_Status='.$userdata->{'cmi.core.lesson_status'}.$userdata->entry
."\r\n";
106 $SESSION->scorm_lessonstatus
= $userdata->{'cmi.core.lesson_status'};
108 echo 'Lesson_Status=not attempted'.$userdata->entry
."\r\n";
109 $SESSION->scorm_lessonstatus
= 'not attempted';
111 if (isset($userdata->{'cmi.core.score.raw'})) {
114 if (isset($userdata->{'cmi.core.score.max'}) && !empty($userdata->{'cmi.core.score.max'})) {
115 $max = ', '.$userdata->{'cmi.core.score.max'};
116 if (isset($userdata->{'cmi.core.score.min'}) && !empty($userdata->{'cmi.core.score.min'})) {
117 $min = ', '.$userdata->{'cmi.core.score.min'};
120 echo 'Score='.$userdata->{'cmi.core.score.raw'}.$max.$min."\r\n";
122 echo 'Score='."\r\n";
124 if (isset($userdata->{'cmi.core.total_time'})) {
125 echo 'Time='.$userdata->{'cmi.core.total_time'}."\r\n";
127 echo 'Time='.'00:00:00'."\r\n";
129 echo 'Lesson_Mode='.$userdata->mode
."\r\n";
130 if (isset($userdata->{'cmi.suspend_data'})) {
131 echo "[Core_Lesson]\r\n".rawurldecode($userdata->{'cmi.suspend_data'})."\r\n";
133 echo "[Core_Lesson]\r\n";
135 echo "[Core_Vendor]\r\n".$userdata->datafromlms
."\r\n";
136 echo "[Evaluation]\r\nCourse_ID = {".$userdata->course_id
."}\r\n";
137 echo "[Student_Data]\r\n";
138 echo 'Mastery_Score='.$userdata->mastery_score
."\r\n";
139 echo 'Max_Time_Allowed='.$userdata->max_time_allowed
."\r\n";
140 echo 'Time_Limit_Action='.$userdata->time_limit_action
."\r\n";
142 error('Sco not found');
147 if ($status == 'Running') {
148 if (! $cm = get_coursemodule_from_instance("scorm", $scorm->id
, $scorm->course
)) {
149 echo "error=1\r\nerror_text=Unknown\r\n"; // No one must see this error message if not hacked
151 if (!empty($aiccdata) && has_capability('mod/scorm:savetrack', get_context_instance(CONTEXT_MODULE
, $cm->id
))) {
152 $initlessonstatus = 'not attempted';
153 $lessonstatus = 'not attempted';
154 if (isset($SESSION->scorm_lessonstatus
)) {
155 $initlessonstatus = $SESSION->scorm_lessonstatus
;
158 $datamodel['lesson_location'] = 'cmi.core.lesson_location';
159 $datamodel['lesson_status'] = 'cmi.core.lesson_status';
160 $datamodel['score'] = 'cmi.core.score.raw';
161 $datamodel['time'] = 'cmi.core.session_time';
162 $datamodel['[core_lesson]'] = 'cmi.suspend_data';
163 $datamodel['[comments]'] = 'cmi.comments';
164 $datarows = explode("\r\n",$aiccdata);
166 while ((list(,$datarow) = each($datarows)) !== false) {
167 if (($equal = strpos($datarow, '=')) !== false) {
168 $element = strtolower(trim(substr($datarow,0,$equal)));
169 $value = trim(substr($datarow,$equal+
1));
170 if (isset($datamodel[$element])) {
171 $element = $datamodel[$element];
173 case 'cmi.core.lesson_location':
174 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $element, $value);
176 case 'cmi.core.lesson_status':
178 'passed' => 'passed',
179 'completed' => 'completed',
180 'failed' => 'failed',
181 'incomplete' => 'incomplete',
182 'browsed' => 'browsed',
183 'not attempted' => 'not attempted',
189 'n' => 'not attempted'
192 'logout' => 'logout',
193 'time-out' => 'time-out',
194 'suspend' => 'suspend',
199 $values = explode(',',$value);
201 if (count($values) > 1) {
202 $value = trim(strtolower($values[1]));
204 if (isset($exites[$value])) {
205 $value = $exites[$value];
208 if (empty($value) ||
isset($exites[$value])) {
209 $subelement = 'cmi.core.exit';
210 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $subelement, $value);
212 $value = trim(strtolower($values[0]));
214 if (isset($statuses[$value]) && ($mode == 'normal')) {
215 $value = $statuses[$value];
216 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $element, $value);
218 $lessonstatus = $value;
220 case 'cmi.core.score.raw':
221 $values = explode(',',$value);
222 if ((count($values) > 1) && ($values[1] >= $values[0]) && is_numeric($values[1])) {
223 $subelement = 'cmi.core.score.max';
224 $value = trim($values[1]);
225 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $subelement, $value);
226 if ((count($values) == 3) && ($values[2] <= $values[0]) && is_numeric($values[2])) {
227 $subelement = 'cmi.core.score.min';
228 $value = trim($values[2]);
229 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $subelement, $value);
234 if (is_numeric($values[0])) {
235 $value = trim($values[0]);
236 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $element, $value);
240 case 'cmi.core.session_time':
241 $SESSION->scorm_session_time
= $value;
246 if (isset($datamodel[strtolower(trim($datarow))])) {
247 $element = $datamodel[strtolower(trim($datarow))];
249 while ((($datarow = current($datarows)) !== false) && (substr($datarow,0,1) != '[')) {
250 $value .= $datarow."\r\n";
253 $value = rawurlencode(stripslashes($value));
254 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, $element, $value);
258 if (($mode == 'browse') && ($initlessonstatus == 'not attempted')){
259 $lessonstatus = 'browsed';
260 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, 'cmi.core.lesson_status', 'browsed');
262 if ($mode == 'normal') {
264 if ($sco = scorm_get_sco($scoid)) {
265 if (!empty($sco->mastery_score
)) {
266 if (!empty($score)) {
267 if ($score >= $sco->mastery_score
) {
268 $lessonstatus = 'passed';
270 $lessonstatus = 'failed';
274 $id = scorm_insert_track($USER->id
, $scorm->id
, $sco->id
, $attempt, 'cmi.core.lesson_status', $lessonstatus);
278 echo "error=0\r\nerror_text=Successful\r\n";
279 } else if ($status == 'Terminated') {
280 echo "error=1\r\nerror_text=Terminated\r\n";
282 echo "error=1\r\nerror_text=Not Initialized\r\n";
286 if ($status == 'Running') {
287 echo "error=0\r\nerror_text=Successful\r\n";
288 } else if ($status == 'Terminated') {
289 echo "error=1\r\nerror_text=Terminated\r\n";
291 echo "error=1\r\nerror_text=Not Initialized\r\n";
294 case 'putinteractions':
295 if ($status == 'Running') {
296 echo "error=0\r\nerror_text=Successful\r\n";
297 } else if ($status == 'Terminated') {
298 echo "error=1\r\nerror_text=Terminated\r\n";
300 echo "error=1\r\nerror_text=Not Initialized\r\n";
303 case 'putobjectives':
304 if ($status == 'Running') {
305 echo "error=0\r\nerror_text=Successful\r\n";
306 } else if ($status == 'Terminated') {
307 echo "error=1\r\nerror_text=Terminated\r\n";
309 echo "error=1\r\nerror_text=Not Initialized\r\n";
313 if ($status == 'Running') {
314 echo "error=0\r\nerror_text=Successful\r\n";
315 } else if ($status == 'Terminated') {
316 echo "error=1\r\nerror_text=Terminated\r\n";
318 echo "error=1\r\nerror_text=Not Initialized\r\n";
321 case 'putperformance':
322 if ($status == 'Running') {
323 echo "error=0\r\nerror_text=Successful\r\n";
324 } else if ($status == 'Terminated') {
325 echo "error=1\r\nerror_text=Terminated\r\n";
327 echo "error=1\r\nerror_text=Not Initialized\r\n";
331 if ($status == 'Running') {
332 if (isset($SESSION->scorm_session_time
) && ($SESSION->scorm_session_time
!= '')) {
333 if ($track = get_record_select('scorm_scoes_track',"userid='$USER->id' AND scormid='$scorm->id' AND scoid='$sco->id' AND attempt='$attempt' AND element='cmi.core.total_time'")) {
334 // Add session_time to total_time
335 $value = scorm_add_time($track->value
, $SESSION->scorm_session_time
);
336 $track->value
= $value;
337 $track->timemodified
= time();
338 update_record('scorm_scoes_track',$track);
341 $track = new object();
342 $track->userid
= $USER->id
;
343 $track->scormid
= $scorm->id
;
344 $track->scoid
= $sco->id
;
345 $track->element
= 'cmi.core.total_time';
346 $track->value
= $SESSION->scorm_session_time
;
347 $track->attempt
= $attempt;
348 $track->timemodified
= time();
349 $id = insert_record('scorm_scoes_track',$track);
351 scorm_update_grades($scorm, $USER->id
);
353 $SESSION->scorm_status
= 'Terminated';
354 $SESSION->scorm_session_time
= '';
355 echo "error=0\r\nerror_text=Successful\r\n";
356 } else if ($status == 'Terminated') {
357 echo "error=1\r\nerror_text=Terminated\r\n";
359 echo "error=1\r\nerror_text=Not Initialized\r\n";
363 echo "error=1\r\nerror_text=Invalid Command\r\n";
368 if (empty($command)) {
369 echo "error=1\r\nerror_text=Invalid Command\r\n";
371 echo "error=3\r\nerror_text=Invalid Session ID\r\n";