2006-11-29 22:30:54 +00:00
< ? php
2008-07-21 01:31:55 +00:00
//Prevent Caching Headers
header ( " Expires: Mon, 26 Jul 1997 05:00:00 GMT " );
header ( " Cache-Control: no-cache " );
header ( " Pragma: no-cache " );
2006-09-20 19:46:52 +00:00
require_once ( '../../config.php' );
2009-02-26 16:31:23 +00:00
include_once ( 'lib.php' );
2006-09-20 19:46:52 +00:00
require_once ( 'locallib.php' );
2008-07-21 01:31:55 +00:00
require_once ( 'datamodels/aicclib.php' );
2009-12-16 22:14:17 +00:00
foreach ( $_POST as $key => $value ) {
$tempkey = strtolower ( $key );
$_POST [ $tempkey ] = $value ;
}
2009-11-01 15:24:58 +00:00
2006-09-20 19:46:52 +00:00
$command = required_param ( 'command' , PARAM_ALPHA );
$sessionid = required_param ( 'session_id' , PARAM_ALPHANUM );
$aiccdata = optional_param ( 'aicc_data' , '' , PARAM_RAW );
2010-01-16 15:39:56 +00:00
$url = new moodle_url ( '/mod/scorm/aicc.php' , array ( 'command' => $command , 'session_id' => $sessionid ));
2009-09-24 08:28:51 +00:00
if ( $aiccdata !== 0 ) {
$url -> param ( 'aicc_data' , $aiccdata );
}
$PAGE -> set_url ( $url );
2006-09-20 19:46:52 +00:00
require_login ();
2008-07-21 01:31:55 +00:00
2006-09-20 19:46:52 +00:00
if ( ! empty ( $command ) && confirm_sesskey ( $sessionid )) {
$command = strtolower ( $command );
2008-07-21 01:31:55 +00:00
2006-09-20 19:46:52 +00:00
if ( isset ( $SESSION -> scorm_scoid )) {
$scoid = $SESSION -> scorm_scoid ;
} else {
2008-07-21 07:24:14 +00:00
print_error ( 'cannotcallscript' );
2006-09-20 19:46:52 +00:00
}
$mode = 'normal' ;
if ( isset ( $SESSION -> scorm_mode )) {
$mode = $SESSION -> scorm_mode ;
}
$status = 'Not Initialized' ;
if ( isset ( $SESSION -> scorm_status )) {
$status = $SESSION -> scorm_status ;
}
2010-01-11 21:04:39 +00:00
if ( isset ( $SESSION -> scorm_attempt )) {
$attempt = $SESSION -> scorm_attempt ;
2006-09-20 19:46:52 +00:00
} else {
$attempt = 1 ;
}
2006-11-21 16:12:19 +00:00
if ( $sco = scorm_get_sco ( $scoid , SCO_ONLY )) {
2008-07-29 01:01:36 +00:00
if ( ! $scorm = $DB -> get_record ( 'scorm' , 'id' , $sco -> scorm )) {
2008-07-21 07:24:14 +00:00
print_error ( 'cannotcallscript' );
2006-09-20 19:46:52 +00:00
}
} else {
2008-07-21 07:24:14 +00:00
print_error ( 'cannotcallscript' );
2006-09-20 19:46:52 +00:00
}
2008-07-29 01:01:36 +00:00
if ( $scorm = $DB -> get_record ( 'scorm' , 'id' , $sco -> scorm )) {
2006-09-20 19:46:52 +00:00
switch ( $command ) {
case 'getparam' :
if ( $status == 'Not Initialized' ) {
$SESSION -> scorm_status = 'Running' ;
$status = 'Running' ;
}
if ( $status != 'Running' ) {
2009-02-26 16:31:23 +00:00
echo " error=101 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} 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' ;
2008-07-21 01:31:55 +00:00
}
2006-11-21 16:12:19 +00:00
if ( $sco = scorm_get_sco ( $scoid )) {
2006-09-20 19:46:52 +00:00
$userdata -> course_id = $sco -> identifier ;
2006-11-21 16:12:19 +00:00
$userdata -> datafromlms = isset ( $sco -> datafromlms ) ? $sco -> datafromlms : '' ;
2008-07-21 01:31:55 +00:00
$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 : '' ;
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n aicc_data= " ;
echo " [Core] \r \n " ;
echo 'Student_ID=' . $userdata -> student_id . " \r \n " ;
echo 'Student_Name=' . $userdata -> student_name . " \r \n " ;
2006-09-20 19:46:52 +00:00
if ( isset ( $userdata -> { 'cmi.core.lesson_location' })) {
2009-02-26 16:31:23 +00:00
echo 'Lesson_Location=' . $userdata -> { 'cmi.core.lesson_location' } . " \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo 'Lesson_Location=' . " \r \n " ;
2006-09-20 19:46:52 +00:00
}
2009-02-26 16:31:23 +00:00
echo 'Credit=' . $userdata -> credit . " \r \n " ;
2006-09-20 19:46:52 +00:00
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' })) {
2009-02-26 16:31:23 +00:00
echo 'Lesson_Status=' . $userdata -> { 'cmi.core.lesson_status' } . $userdata -> entry . " \r \n " ;
2006-09-20 19:46:52 +00:00
$SESSION -> scorm_lessonstatus = $userdata -> { 'cmi.core.lesson_status' };
} else {
2009-02-26 16:31:23 +00:00
echo 'Lesson_Status=not attempted' . $userdata -> entry . " \r \n " ;
2006-09-20 19:46:52 +00:00
$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' };
}
}
2009-02-26 16:31:23 +00:00
echo 'Score=' . $userdata -> { 'cmi.core.score.raw' } . $max . $min . " \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo 'Score=' . " \r \n " ;
2006-09-20 19:46:52 +00:00
}
if ( isset ( $userdata -> { 'cmi.core.total_time' })) {
2009-02-26 16:31:23 +00:00
echo 'Time=' . $userdata -> { 'cmi.core.total_time' } . " \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo 'Time=' . '00:00:00' . " \r \n " ;
2006-09-20 19:46:52 +00:00
}
2009-02-26 16:31:23 +00:00
echo 'Lesson_Mode=' . $userdata -> mode . " \r \n " ;
2006-09-20 19:46:52 +00:00
if ( isset ( $userdata -> { 'cmi.suspend_data' })) {
2009-02-26 16:31:23 +00:00
echo " [Core_Lesson] \r \n " . rawurldecode ( $userdata -> { 'cmi.suspend_data' }) . " \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " [Core_Lesson] \r \n " ;
2006-09-20 19:46:52 +00:00
}
2009-02-26 16:31:23 +00:00
echo " [Core_Vendor] \r \n " . $userdata -> datafromlms . " \r \n " ;
echo " [Evaluation] \r \n Course_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 " ;
2006-09-20 19:46:52 +00:00
} else {
2008-07-21 07:24:14 +00:00
print_error ( 'cannotfindsco' , 'scorm' );
2006-09-20 19:46:52 +00:00
}
}
break ;
case 'putparam' :
if ( $status == 'Running' ) {
if ( ! $cm = get_coursemodule_from_instance ( " scorm " , $scorm -> id , $scorm -> course )) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Unknown \r \n " ; // No one must see this error message if not hacked
2006-09-20 19:46:52 +00:00
}
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' ;
2009-02-26 16:31:23 +00:00
$datarows = explode ( " \r \n " , $aiccdata );
2006-09-20 19:46:52 +00:00
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 ;
case 'cmi.core.lesson_status' :
$statuses = array (
'passed' => 'passed' ,
'completed' => 'completed' ,
'failed' => 'failed' ,
'incomplete' => 'incomplete' ,
'browsed' => 'browsed' ,
'not attempted' => 'not attempted' ,
'p' => 'passed' ,
'c' => 'completed' ,
'f' => 'failed' ,
'i' => 'incomplete' ,
'b' => 'browsed' ,
'n' => 'not attempted'
);
$exites = array (
'logout' => 'logout' ,
'time-out' => 'time-out' ,
'suspend' => 'suspend' ,
'l' => 'logout' ,
't' => 'time-out' ,
's' => 'suspend' ,
);
$values = explode ( ',' , $value );
$value = '' ;
if ( count ( $values ) > 1 ) {
$value = trim ( strtolower ( $values [ 1 ]));
2009-02-26 16:31:23 +00:00
$value = $value [ 0 ];
2006-09-20 19:46:52 +00:00
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 ]));
2009-02-26 16:31:23 +00:00
$value = $value [ 0 ];
2006-09-20 19:46:52 +00:00
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 );
}
}
2008-07-21 01:31:55 +00:00
2006-09-20 19:46:52 +00:00
$value = '' ;
if ( is_numeric ( $values [ 0 ])) {
2009-11-01 15:24:58 +00:00
$value = trim ( $values [ 0 ]);
2006-09-20 19:46:52 +00:00
$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 ) != '[' )) {
2009-02-26 16:31:23 +00:00
$value .= $datarow . " \r \n " ;
2006-09-20 19:46:52 +00:00
next ( $datarows );
}
2009-02-26 16:31:23 +00:00
$value = rawurlencode ( stripslashes ( $value ));
2006-09-20 19:46:52 +00:00
$id = scorm_insert_track ( $USER -> id , $scorm -> id , $sco -> id , $attempt , $element , $value );
}
2008-07-21 01:31:55 +00:00
}
2006-09-20 19:46:52 +00:00
}
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' ) {
2010-03-12 07:24:26 +00:00
if ( $sco = scorm_get_sco ( $scoid )) {
if ( ! empty ( $sco -> mastery_score )) {
if ( ! empty ( $score )) {
if ( $score >= $sco -> mastery_score ) {
$lessonstatus = 'passed' ;
} else {
$lessonstatus = 'failed' ;
2009-03-26 20:22:43 +00:00
}
2008-07-21 01:31:55 +00:00
}
2006-09-20 19:46:52 +00:00
}
2010-03-12 07:24:26 +00:00
$id = scorm_insert_track ( $USER -> id , $scorm -> id , $sco -> id , $attempt , 'cmi.core.lesson_status' , $lessonstatus );
2006-09-20 19:46:52 +00:00
}
2008-07-21 01:31:55 +00:00
}
2006-09-20 19:46:52 +00:00
}
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
case 'putcomments' :
if ( $status == 'Running' ) {
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
case 'putinteractions' :
if ( $status == 'Running' ) {
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
case 'putobjectives' :
if ( $status == 'Running' ) {
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
case 'putpath' :
if ( $status == 'Running' ) {
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
case 'putperformance' :
if ( $status == 'Running' ) {
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
case 'exitau' :
if ( $status == 'Running' ) {
if ( isset ( $SESSION -> scorm_session_time ) && ( $SESSION -> scorm_session_time != '' )) {
2008-07-29 01:01:36 +00:00
if ( $track = $DB -> get_record_select ( 'scorm_scoes_track' , " userid=' $USER->id ' AND scormid=' $scorm->id ' AND scoid=' $sco->id ' AND element='cmi.core.total_time' " )) {
2008-07-21 01:31:55 +00:00
// Add session_time to total_time
2006-09-20 19:46:52 +00:00
$value = scorm_add_time ( $track -> value , $SESSION -> scorm_session_time );
$track -> value = $value ;
$track -> timemodified = time ();
2008-07-29 01:01:36 +00:00
$id = $DB -> update_record ( 'scorm_scoes_track' , $track );
2006-09-20 19:46:52 +00:00
} else {
2009-03-02 23:07:44 +00:00
$track = new object ();
2006-09-20 19:46:52 +00:00
$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 ();
2008-07-29 01:01:36 +00:00
$id = $DB -> insert_record ( 'scorm_scoes_track' , $track );
2006-09-20 19:46:52 +00:00
}
2009-03-02 23:07:44 +00:00
scorm_update_grades ( $scorm , $USER -> id );
2006-09-20 19:46:52 +00:00
}
$SESSION -> scorm_status = 'Terminated' ;
$SESSION -> scorm_session_time = '' ;
2009-02-26 16:31:23 +00:00
echo " error=0 \r \n error_text=Successful \r \n " ;
2006-09-20 19:46:52 +00:00
} else if ( $status == 'Terminated' ) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Terminated \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Not Initialized \r \n " ;
2006-09-20 19:46:52 +00:00
}
break ;
default :
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Invalid Command \r \n " ;
2006-09-20 19:46:52 +00:00
break ;
}
}
} else {
if ( empty ( $command )) {
2009-02-26 16:31:23 +00:00
echo " error=1 \r \n error_text=Invalid Command \r \n " ;
2006-09-20 19:46:52 +00:00
} else {
2009-02-26 16:31:23 +00:00
echo " error=3 \r \n error_text=Invalid Session ID \r \n " ;
2006-09-20 19:46:52 +00:00
}
}