--- mod/scorm/aicc.php Fri Aug 10 20:58:09 2007 1.21 +++ mod/scorm/aicc.php Tue Feb 24 12:08:56 2009 @@ -1,24 +1,36 @@ $value) + { + $tempkey = strtolower($key); + $_POST[$tempkey] = $value; + } + $command = required_param('command', PARAM_ALPHA); $sessionid = required_param('session_id', PARAM_ALPHANUM); $aiccdata = optional_param('aicc_data', '', PARAM_RAW); require_login(); - + if (!empty($command) && confirm_sesskey($sessionid)) { $command = strtolower($command); - + if (isset($SESSION->scorm_scoid)) { $scoid = $SESSION->scorm_scoid; } else { error('Invalid script call'); } $mode = 'normal'; if (isset($SESSION->scorm_mode)) { $mode = $SESSION->scorm_mode; } $status = 'Not Initialized'; if (isset($SESSION->scorm_status)) { @@ -38,128 +50,127 @@ error('Invalid script call'); } if ($scorm = get_record('scorm','id',$sco->scorm)) { switch ($command) { case 'getparam': if ($status == 'Not Initialized') { $SESSION->scorm_status = 'Running'; $status = 'Running'; } if ($status != 'Running') { - echo "error = 101\nerror_text = Terminated\n"; + echo "error=101\r\nerror_text=Terminated\r\n"; } else { if ($usertrack=scorm_get_tracks($scoid,$USER->id,$attempt)) { $userdata = $usertrack; } else { $userdata->status = ''; $userdata->score_raw = ''; } $userdata->student_id = $USER->username; $userdata->student_name = $USER->lastname .', '. $USER->firstname; $userdata->mode = $mode; if ($userdata->mode == 'normal') { $userdata->credit = 'credit'; } else { $userdata->credit = 'no-credit'; - } - + } + if ($sco = scorm_get_sco($scoid)) { $userdata->course_id = $sco->identifier; $userdata->datafromlms = isset($sco->datafromlms)?$sco->datafromlms:''; - $userdata->masteryscore = isset($sco->masteryscore)?$sco->masteryscore:''; - $userdata->maxtimeallowed = isset($sco->maxtimeallowed)?$sco->maxtimeallowed:''; - $userdata->timelimitaction = isset($sco->timelimitaction)?$sco->timelimitaction:''; - - echo "error = 0\nerror_text = Successful\naicc_data=\n"; - echo "[Core]\n"; - echo 'Student_ID = '.$userdata->student_id."\n"; - echo 'Student_Name = '.$userdata->student_name."\n"; + $userdata->mastery_score = isset($sco->mastery_score)?$sco->mastery_score:''; + $userdata->max_time_allowed = isset($sco->max_time_allowed)?$sco->max_time_allowed:''; + $userdata->time_limit_action = isset($sco->time_limit_action)?$sco->time_limit_action:''; + echo "error=0\r\nerror_text=Successful\r\naicc_data="; + echo "[Core]\r\n"; + echo 'Student_ID='.$userdata->student_id."\r\n"; + echo 'Student_Name='.$userdata->student_name."\r\n"; if (isset($userdata->{'cmi.core.lesson_location'})) { - echo 'Lesson_Location = '.$userdata->{'cmi.core.lesson_location'}."\n"; + echo 'Lesson_Location='.$userdata->{'cmi.core.lesson_location'}."\r\n"; } else { - echo 'Lesson_Location = '."\n"; + echo 'Lesson_Location='."\r\n"; } - echo 'Credit = '.$userdata->credit."\n"; + echo 'Credit='.$userdata->credit."\r\n"; 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 = ''; } } } if (isset($userdata->{'cmi.core.lesson_status'})) { - echo 'Lesson_Status = '.$userdata->{'cmi.core.lesson_status'}.$userdata->entry."\n"; + echo 'Lesson_Status='.$userdata->{'cmi.core.lesson_status'}.$userdata->entry."\r\n"; $SESSION->scorm_lessonstatus = $userdata->{'cmi.core.lesson_status'}; } else { - echo 'Lesson_Status = not attempted'.$userdata->entry."\n"; + echo 'Lesson_Status=not attempted'.$userdata->entry."\r\n"; $SESSION->scorm_lessonstatus = 'not attempted'; } if (isset($userdata->{'cmi.core.score.raw'})) { $max = ''; $min = ''; if (isset($userdata->{'cmi.core.score.max'}) && !empty($userdata->{'cmi.core.score.max'})) { $max = ', '.$userdata->{'cmi.core.score.max'}; if (isset($userdata->{'cmi.core.score.min'}) && !empty($userdata->{'cmi.core.score.min'})) { $min = ', '.$userdata->{'cmi.core.score.min'}; } } - echo 'Score = '.$userdata->{'cmi.core.score.raw'}.$max.$min."\n"; + echo 'Score='.$userdata->{'cmi.core.score.raw'}.$max.$min."\r\n"; } else { - echo 'Score = '."\n"; + echo 'Score='."\r\n"; } if (isset($userdata->{'cmi.core.total_time'})) { - echo 'Time = '.$userdata->{'cmi.core.total_time'}."\n"; + echo 'Time='.$userdata->{'cmi.core.total_time'}."\r\n"; } else { - echo 'Time = '.'00:00:00'."\n"; + echo 'Time='.'00:00:00'."\r\n"; } - echo 'Lesson_Mode = '.$userdata->mode."\n"; + echo 'Lesson_Mode='.$userdata->mode."\r\n"; if (isset($userdata->{'cmi.suspend_data'})) { - echo "[Core_Lesson]\n".$userdata->{'cmi.suspend_data'}."\n"; + echo "[Core_Lesson]\r\n".rawurldecode($userdata->{'cmi.suspend_data'})."\r\n"; } else { - echo "[Core_Lesson]\n"."\n"; + echo "[Core_Lesson]\r\n"; } - echo "[Core_Vendor]\n".$userdata->datafromlms."\n"; - echo "[Evaluation]\nCourse_ID = {".$userdata->course_id."}\n"; - echo "[Student_Data]\n"; - echo 'Mastery_Score = '.$userdata->masteryscore."\n"; - echo 'Max_Time_Allowed = '.$userdata->maxtimeallowed."\n"; - echo 'Time_Limit_Action = '.$userdata->timelimitaction."\n"; + echo "[Core_Vendor]\r\n".$userdata->datafromlms."\r\n"; + echo "[Evaluation]\r\nCourse_ID={".$userdata->course_id."}\r\n"; + echo "[Student_Data]\r\n"; + echo 'Mastery_Score='.$userdata->mastery_score."\r\n"; + echo 'Max_Time_Allowed='.$userdata->max_time_allowed."\r\n"; + echo 'Time_Limit_Action='.$userdata->time_limit_action."\r\n"; } else { error('Sco not found'); } } break; case 'putparam': if ($status == 'Running') { if (! $cm = get_coursemodule_from_instance("scorm", $scorm->id, $scorm->course)) { - echo "error = 1\nerror_text = Unknown\n"; // No one must see this error message if not hacked + echo "error=1\r\nerror_text=Unknown\r\n"; // No one must see this error message if not hacked } if (!empty($aiccdata) && has_capability('mod/scorm:savetrack', get_context_instance(CONTEXT_MODULE, $cm->id))) { $initlessonstatus = 'not attempted'; $lessonstatus = 'not attempted'; if (isset($SESSION->scorm_lessonstatus)) { $initlessonstatus = $SESSION->scorm_lessonstatus; } $score = ''; $datamodel['lesson_location'] = 'cmi.core.lesson_location'; $datamodel['lesson_status'] = 'cmi.core.lesson_status'; $datamodel['score'] = 'cmi.core.score.raw'; $datamodel['time'] = 'cmi.core.session_time'; $datamodel['[core_lesson]'] = 'cmi.suspend_data'; $datamodel['[comments]'] = 'cmi.comments'; - $datarows = explode("\n",$aiccdata); + $datarows = explode("\r\n",$aiccdata); reset($datarows); while ((list(,$datarow) = each($datarows)) !== false) { if (($equal = strpos($datarow, '=')) !== false) { $element = strtolower(trim(substr($datarow,0,$equal))); $value = trim(substr($datarow,$equal+1)); if (isset($datamodel[$element])) { $element = $datamodel[$element]; switch ($element) { case 'cmi.core.lesson_location': $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value); break; @@ -191,166 +202,175 @@ if (count($values) > 1) { $value = trim(strtolower($values[1])); if (isset($exites[$value])) { $value = $exites[$value]; } } if (empty($value) || isset($exites[$value])) { $subelement = 'cmi.core.exit'; $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $subelement, $value); } $value = trim(strtolower($values[0])); + + //Martin Holden 24-2-2009 + //Just check the first characters from the left $value[0] + $value = $value[0]; + if (isset($statuses[$value]) && ($mode == 'normal')) { $value = $statuses[$value]; $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value); } $lessonstatus = $value; break; case 'cmi.core.score.raw': $values = explode(',',$value); if ((count($values) > 1) && ($values[1] >= $values[0]) && is_numeric($values[1])) { $subelement = 'cmi.core.score.max'; $value = trim($values[1]); $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $subelement, $value); if ((count($values) == 3) && ($values[2] <= $values[0]) && is_numeric($values[2])) { $subelement = 'cmi.core.score.min'; $value = trim($values[2]); $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $subelement, $value); } } - + $value = ''; if (is_numeric($values[0])) { $value = trim($values[0]); $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value); } $score = $value; break; case 'cmi.core.session_time': $SESSION->scorm_session_time = $value; break; } } } else { if (isset($datamodel[strtolower(trim($datarow))])) { $element = $datamodel[strtolower(trim($datarow))]; $value = ''; while ((($datarow = current($datarows)) !== false) && (substr($datarow,0,1) != '[')) { - $value .= $datarow; + $value .= $datarow."\r\n"; next($datarows); } + $value = rawurlencode(stripslashes($value)); $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value); } - } + } } if (($mode == 'browse') && ($initlessonstatus == 'not attempted')){ $lessonstatus = 'browsed'; $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', 'browsed'); } if ($mode == 'normal') { if ($lessonstatus == 'completed') { - if (!empty($sco->masteryscore) && !empty($score) && ($score >= $sco->masteryscore)) { - $lessonstatus = 'passed'; - } else { - $lessonstatus = 'failed'; - } - $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', $lessonstatus); + if ($sco = scorm_get_sco($scoid)) { + if (!empty($sco->mastery_score) && !empty($score) && ($score >= $sco->mastery_score)) { + $lessonstatus = 'passed'; + } else { + $lessonstatus = 'failed'; + } + $id = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, 'cmi.core.lesson_status', $lessonstatus); + } } - } + } } - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; case 'putcomments': if ($status == 'Running') { - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; case 'putinteractions': if ($status == 'Running') { - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; case 'putobjectives': if ($status == 'Running') { - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; case 'putpath': if ($status == 'Running') { - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; case 'putperformance': if ($status == 'Running') { - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; case 'exitau': if ($status == 'Running') { if (isset($SESSION->scorm_session_time) && ($SESSION->scorm_session_time != '')) { if ($track = get_record_select('scorm_scoes_track',"userid='$USER->id' AND scormid='$scorm->id' AND scoid='$sco->id' AND element='cmi.core.total_time'")) { - // Add session_time to total_time + // Add session_time to total_time $value = scorm_add_time($track->value, $SESSION->scorm_session_time); $track->value = $value; $track->timemodified = time(); update_record('scorm_scoes_track',$track); $id = $track->id; } else { $track = new object(); $track->userid = $USER->id; $track->scormid = $scorm->id; $track->scoid = $sco->id; $track->element = 'cmi.core.total_time'; $track->value = $SESSION->scorm_session_time; $track->timemodified = time(); $id = insert_record('scorm_scoes_track',$track); } + + include_once('lib.php'); scorm_update_grades($scorm, $USER->id); } - $SESSION->scorm_status = 'Terminated'; $SESSION->scorm_session_time = ''; - echo "error = 0\nerror_text = Successful\n"; + echo "error=0\r\nerror_text=Successful\r\n"; } else if ($status == 'Terminated') { - echo "error = 1\nerror_text = Terminated\n"; + echo "error=1\r\nerror_text=Terminated\r\n"; } else { - echo "error = 1\nerror_text = Not Initialized\n"; + echo "error=1\r\nerror_text=Not Initialized\r\n"; } break; default: - echo "error = 1\nerror_text = Invalid Command\n"; + echo "error=1\r\nerror_text=Invalid Command\r\n"; break; } } } else { if (empty($command)) { - echo "error = 1\nerror_text = Invalid Command\n"; + echo "error=1\r\nerror_text=Invalid Command\r\n"; } else { - echo "error = 3\nerror_text = Invalid Session ID\n"; + echo "error=3\r\nerror_text=Invalid Session ID\r\n"; } } ?> --- mod/scorm/datamodels/aicc.js.php Wed Aug 06 23:52:27 2008 1.1.22.3 +++ mod/scorm/datamodels/aicc.js.php Tue Feb 24 11:32:52 2009 @@ -83,25 +83,25 @@ 'cmi.objectives.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.objectives.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.objectives.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.objectives.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_data._children':{'defaultvalue':student_data_children, 'mod':'r', 'writeerror':'402'}, 'cmi.student_data.attempt_number':{'defaultvalue':'{'cmi.student_data.attempt_number'})?$userdata->{'cmi.student_data.attempt_number'}:'' ?>', 'mod':'r', 'writeerror':'402'}, 'cmi.student_data.tries.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_data.tries.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_data.tries.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_data.tries.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_data.tries.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'}, - 'cmi.student_data.mastery_score':{'defaultvalue':'masteryscore)?$userdata->masteryscore:'' ?>', 'mod':'r', 'writeerror':'403'}, - 'cmi.student_data.max_time_allowed':{'defaultvalue':'maxtimeallowed)?$userdata->maxtimeallowed:'' ?>', 'mod':'r', 'writeerror':'403'}, - 'cmi.student_data.time_limit_action':{'defaultvalue':'timelimitaction)?$userdata->timelimitaction:'' ?>', 'mod':'r', 'writeerror':'403'}, + 'cmi.student_data.mastery_score':{'defaultvalue':'mastery_score)?$userdata->mastery_score:'' ?>', 'mod':'r', 'writeerror':'403'}, + 'cmi.student_data.max_time_allowed':{'defaultvalue':'max_time_allowed)?$userdata->max_time_allowed:'' ?>', 'mod':'r', 'writeerror':'403'}, + 'cmi.student_data.time_limit_action':{'defaultvalue':'time_limit_action)?$userdata->time_limit_action:'' ?>', 'mod':'r', 'writeerror':'403'}, 'cmi.student_data.tries_during_lesson':{'defaultvalue':'{'cmi.student_data.tries_during_lesson'})?$userdata->{'cmi.student_data.tries_during_lesson'}:'' ?>', 'mod':'r', 'writeerror':'402'}, 'cmi.student_preference._children':{'defaultvalue':student_preference_children, 'mod':'r', 'writeerror':'402'}, 'cmi.student_preference.audio':{'defaultvalue':'0', 'format':CMISInteger, 'range':audio_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_preference.language':{'defaultvalue':'', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_preference.speed':{'defaultvalue':'0', 'format':CMISInteger, 'range':speed_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.student_preference.text':{'defaultvalue':'0', 'format':CMISInteger, 'range':text_range, 'mod':'rw', 'writeerror':'405'}, 'cmi.interactions._children':{'defaultvalue':interactions_children, 'mod':'r', 'writeerror':'402'}, 'cmi.interactions._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 'cmi.interactions.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 'cmi.interactions.n.objectives._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 'cmi.interactions.n.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'},