Преглед на файлове

[svn r12448] - Added management of SCORM cmi.core.exit value that needs to be kept in-database to allow for better follow-up of the students interruptions
- Fixed returned values for LMSSetValue() and LMSGetValue() in SCORM API, changed from JavaScript boolean to JavaScript strings ("true" and "false") as SCORM requires

Yannick Warnier преди 18 години
родител
ревизия
70786d04f2

+ 3 - 1
main/inc/lib/add_course.lib.inc.php

@@ -981,7 +981,9 @@ function update_Db_course($courseDbName)
 		"score			float unsigned not null default 0," . //score returned by SCORM or other techs
 		"score			float unsigned not null default 0," . //score returned by SCORM or other techs
 		"status			char(32) not null default 'Not attempted'," . //status for this item (SCORM)
 		"status			char(32) not null default 'Not attempted'," . //status for this item (SCORM)
 		"suspend_data	text null default ''," .
 		"suspend_data	text null default ''," .
-		"lesson_location text null default '')";
+		"lesson_location text null default ''," .
+		"core_exit		varchar(32) not null default 'none'" .
+		")";
 	if(!api_sql_query($sql))
 	if(!api_sql_query($sql))
 	{
 	{
 		error_log($sql,0);
 		error_log($sql,0);

+ 2 - 1
main/install/migrate-db-1.8.0-1.8.1-pre.sql

@@ -43,4 +43,5 @@ ALTER TABLE lp_item_view ADD INDEX (lp_view_id);
 ALTER TABLE lp_iv_interaction ADD INDEX (lp_iv_id);
 ALTER TABLE lp_iv_interaction ADD INDEX (lp_iv_id);
 ALTER TABLE quiz_question ADD INDEX (position); 
 ALTER TABLE quiz_question ADD INDEX (position); 
 ALTER TABLE forum_thread ADD INDEX (forum_id);
 ALTER TABLE forum_thread ADD INDEX (forum_id);
-ALTER TABLE forum_thread DROP INDEX thread_id; 
+ALTER TABLE forum_thread DROP INDEX thread_id;
+ALTER TABLE lp_item_view ADD core_exit varchar(32) NOT NULL DEFAULT 'none';

+ 31 - 1
main/newscorm/learnpathItem.class.php

@@ -221,6 +221,13 @@ class learnpathItem{
     	}
     	}
     	return $list;
     	return $list;
     }
     }
+    /**
+     * Gets the core_exit value from the database
+     */
+    function get_core_exit()
+    {
+    	return $this->core_exit;
+    }
     /**
     /**
      * Gets the credit information (rather scorm-stuff) based on current status and reinit
      * Gets the credit information (rather scorm-stuff) based on current status and reinit
      * autorization. Credit tells the sco(content) if Dokeos will record the data it is sent (credit) or not (no-credit)
      * autorization. Credit tells the sco(content) if Dokeos will record the data it is sent (credit) or not (no-credit)
@@ -1321,7 +1328,11 @@ class learnpathItem{
 		     			case 'lesson_location':
 		     			case 'lesson_location':
 		     				$this->set_lesson_location($value);
 		     				$this->set_lesson_location($value);
 		     				if($this->debug>2){error_log('New LP - In learnpathItem::save() - setting lesson_location to '.$value,0);}
 		     				if($this->debug>2){error_log('New LP - In learnpathItem::save() - setting lesson_location to '.$value,0);}
-		     				break;	
+		     				break;
+		     			case 'core_exit':
+		     				$this->set_core_exit($value);
+		     				if($this->debug>2){error_log('New LP - In learnpathItem::save() - setting core_exit to '.$value,0);}
+		     				break;
 		     			case 'interactions':
 		     			case 'interactions':
 		     				//$interactions = unserialize($value);
 		     				//$interactions = unserialize($value);
 		     				//foreach($interactions as $interaction){
 		     				//foreach($interactions as $interaction){
@@ -1398,6 +1409,24 @@ class learnpathItem{
      	}
      	}
      	return false;
      	return false;
     }
     }
+    /**
+     * Sets the core_exit value to the one given
+     */
+    function set_core_exit($value)
+    {
+    	switch($value){
+    		case '':
+    			$this->core_exit = '';
+    			break;
+    		case 'suspend':
+    			$this->core_exit = 'suspend';
+    			break;
+    		default:
+    			$this->core_exit = 'none';
+    			break;
+    	}
+    	return true;
+    }
     /**
     /**
      * Sets the item's description
      * Sets the item's description
      * @param	string	Description
      * @param	string	Description
@@ -1455,6 +1484,7 @@ class learnpathItem{
 				$this->current_start_time	= $row['start_time'];
 				$this->current_start_time	= $row['start_time'];
 				$this->current_stop_time 	= $this->current_start_time + $row['total_time']; 
 				$this->current_stop_time 	= $this->current_start_time + $row['total_time']; 
 				$this->lesson_location  = $row['lesson_location'];
 				$this->lesson_location  = $row['lesson_location'];
+				$this->core_exit		= $row['core_exit'];
 		     	if($this->debug>2){error_log('New LP - In learnpathItem::set_lp_view() - Updated item object with database values',0);}
 		     	if($this->debug>2){error_log('New LP - In learnpathItem::set_lp_view() - Updated item object with database values',0);}
 
 
 		     	//now get the number of interactions for this little guy
 		     	//now get the number of interactions for this little guy

+ 9 - 3
main/newscorm/lp_comm.server.php

@@ -54,11 +54,12 @@ function backup_item_details($lp_id,$user_id,$view_id,$item_id,$score=-1,$max=-1
  * @param	string	Session time
  * @param	string	Session time
  * @param	string	Suspend data
  * @param	string	Suspend data
  * @param	string	Lesson location
  * @param	string	Lesson location
+ * @param	string	Core exit SCORM string
  */
  */
-function save_item($lp_id,$user_id,$view_id,$item_id,$score=-1,$max=-1,$min=-1,$status='',$time=0,$suspend='',$location='',$interactions=array())
+function save_item($lp_id,$user_id,$view_id,$item_id,$score=-1,$max=-1,$min=-1,$status='',$time=0,$suspend='',$location='',$interactions=array(),$core_exit='none')
 {
 {
 	$debug=0;
 	$debug=0;
-	if($debug>0){error_log('In xajax_save_item('.$lp_id.','.$user_id.','.$view_id.','.$item_id.','.$score.','.$max.','.$min.','.$status.','.$time.',"'.$suspend.'","'.$location.'","'.(count($interactions)>0?$interactions[0]:'').'")',0);}
+	if($debug>0){error_log('In xajax_save_item('.$lp_id.','.$user_id.','.$view_id.','.$item_id.','.$score.','.$max.','.$min.','.$status.','.$time.',"'.$suspend.'","'.$location.'","'.(count($interactions)>0?$interactions[0]:'').'","'.$core_exit.'")',0);}
 	$objResponse = new xajaxResponse();
 	$objResponse = new xajaxResponse();
 	require_once('learnpath.class.php');
 	require_once('learnpath.class.php');
 	require_once('scorm.class.php');
 	require_once('scorm.class.php');
@@ -132,6 +133,7 @@ function save_item($lp_id,$user_id,$view_id,$item_id,$score=-1,$max=-1,$min=-1,$
 				$mylpi->add_interaction($index,$interactions[$index]);
 				$mylpi->add_interaction($index,$interactions[$index]);
 			}
 			}
 		}
 		}
+		$mylpi->set_core_exit($core_exit);
 		$mylp->save_item($item_id,false);
 		$mylp->save_item($item_id,false);
 	}
 	}
 	
 	
@@ -280,7 +282,9 @@ function switch_item_details($lp_id,$user_id,$view_id,$current_item,$next_item)
 			"suspend_data='".$mysuspend_data."';" .
 			"suspend_data='".$mysuspend_data."';" .
 			"lesson_location='".$mylesson_location."';" .
 			"lesson_location='".$mylesson_location."';" .
 			"total_time = '".$mytotal_time."';" .
 			"total_time = '".$mytotal_time."';" .
-			"interactions = new Array();");
+			"interactions = new Array();" .
+			"G_lastError = 0;" .
+			"G_LastErrorMessage = 'No error';");
 	/*
 	/*
 	 * and re-initialise the rest
 	 * and re-initialise the rest
 	 * -saved_lesson_status = 'not attempted'
 	 * -saved_lesson_status = 'not attempted'
@@ -307,6 +311,7 @@ function switch_item_details($lp_id,$user_id,$view_id,$current_item,$next_item)
 	$mycredit = $mylpi->get_credit();
 	$mycredit = $mylpi->get_credit();
 	$mylaunch_data = $mylpi->get_launch_data();
 	$mylaunch_data = $mylpi->get_launch_data();
 	$myinteractions_count = $mylpi->get_interactions_count();
 	$myinteractions_count = $mylpi->get_interactions_count();
+	$mycore_exit = $mylpi->get_core_exit();
 	$objResponse->addScript(
 	$objResponse->addScript(
 			"saved_lesson_status='not attempted';" .
 			"saved_lesson_status='not attempted';" .
 			"lms_lp_id=".$lp_id.";" .
 			"lms_lp_id=".$lp_id.";" .
@@ -327,6 +332,7 @@ function switch_item_details($lp_id,$user_id,$view_id,$current_item,$next_item)
 			"lms_item_lesson_mode = '".$mylesson_mode."';" .
 			"lms_item_lesson_mode = '".$mylesson_mode."';" .
 			"lms_item_launch_data = '".$mylaunch_data."';" .
 			"lms_item_launch_data = '".$mylaunch_data."';" .
 			"lms_item_interactions_count = '".$myinteractions_count."';" .
 			"lms_item_interactions_count = '".$myinteractions_count."';" .
+			"lms_item_core_exit = '".$mycore_exit."'" .
 			"asset_timer = 0;"
 			"asset_timer = 0;"
 			);
 			);
 	$objResponse->addScript("update_toc('unhighlight','".$current_item."');");
 	$objResponse->addScript("update_toc('unhighlight','".$current_item."');");

+ 32 - 4
main/newscorm/scorm_api.php

@@ -154,6 +154,7 @@ var lms_item_credit = '<?php echo $oItem->get_credit();?>';
 var lms_item_lesson_mode = '<?php echo $oItem->get_lesson_mode();?>';
 var lms_item_lesson_mode = '<?php echo $oItem->get_lesson_mode();?>';
 var lms_item_launch_data = '<?php echo $oItem->get_launch_data();?>';
 var lms_item_launch_data = '<?php echo $oItem->get_launch_data();?>';
 var lms_item_interactions_count = '<?php echo $oItem->get_interactions_count(); ?>';
 var lms_item_interactions_count = '<?php echo $oItem->get_interactions_count(); ?>';
+var lms_item_core_exit = '<?php echo $oItem->get_core_exit();?>';
 var asset_timer = 0;
 var asset_timer = 0;
 
 
 //Backup for old values
 //Backup for old values
@@ -192,7 +193,8 @@ function LMSInitialize() {  //this is the initialize function of all APIobjects
 		//msg_f.src = refresh_url;
 		//msg_f.src = refresh_url;
 	}
 	}
 	*/
 	*/
-	
+	G_LastError = G_NoError ;
+	G_LastErrorMessage = 'No error';	
 	lms_initialized=1;
 	lms_initialized=1;
 	return('true');
 	return('true');
 }
 }
@@ -204,13 +206,27 @@ function Initialize() {  //this is the initialize function of all APIobjects
 
 
 function LMSGetValue(param) {
 function LMSGetValue(param) {
 	//logit_scorm("LMSGetValue('"+param+"')",1);
 	//logit_scorm("LMSGetValue('"+param+"')",1);
+	G_LastError = G_NoError ;
+	G_LastErrorMessage = 'No error';	
 	var result='';
 	var result='';
 	if(param=='cmi.core._children' || param=='cmi.core_children'){
 	if(param=='cmi.core._children' || param=='cmi.core_children'){
 		result='entry, exit, lesson_status, student_id, student_name, lesson_location, total_time, credit, lesson_mode, score, session_time';
 		result='entry, exit, lesson_status, student_id, student_name, lesson_location, total_time, credit, lesson_mode, score, session_time';
 	}else if(param == 'cmi.core.entry'){
 	}else if(param == 'cmi.core.entry'){
-		result='';
+		if(lms_item_core_exit=='none')
+		{
+			result='ab-initio';
+		}
+		else if(lms_item_core_exit=='suspend')
+		{
+			result='resume';
+		}
+		else
+		{
+			result='';
+		}
 	}else if(param == 'cmi.core.exit'){
 	}else if(param == 'cmi.core.exit'){
 		result='';
 		result='';
+		G_LastError = G_ElementIsWriteOnly;
 	}else if(param == 'cmi.core.lesson_status'){
 	}else if(param == 'cmi.core.lesson_status'){
 	    if(lesson_status != '') {
 	    if(lesson_status != '') {
 	    	result=lesson_status;
 	    	result=lesson_status;
@@ -351,6 +367,9 @@ function GetValue(param) {
 
 
 function LMSSetValue(param, val) {
 function LMSSetValue(param, val) {
 	logit_scorm("LMSSetValue\n\t('"+param+"','"+val+"')",0);
 	logit_scorm("LMSSetValue\n\t('"+param+"','"+val+"')",0);
+	G_LastError = G_NoError ;
+	G_LastErrorMessage = 'No error';	
+	return_value = "true";
 	switch(param) {
 	switch(param) {
 	case 'cmi.core.score.raw'		: score= val ;			break;
 	case 'cmi.core.score.raw'		: score= val ;			break;
 	case 'cmi.core.score.max'		: max = val;			break;
 	case 'cmi.core.score.max'		: max = val;			break;
@@ -368,6 +387,8 @@ function LMSSetValue(param, val) {
 	case 'cmi.score.scaled'			: score = val ;			break; //1.3
 	case 'cmi.score.scaled'			: score = val ;			break; //1.3
 	case 'cmi.success_status'		: success_status = val; break; //1.3
 	case 'cmi.success_status'		: success_status = val; break; //1.3
 	case 'cmi.suspend_data'			: suspend_data = val;   break;
 	case 'cmi.suspend_data'			: suspend_data = val;   break;
+	case 'cmi.core.exit'			: lms_item_core_exit = val;		break;
+	case 'cmi.core.entry'			: return_value = "false"; G_LastError = G_ElementIsReadOnly; break;
 	default:
 	default:
 		var myres = new Array();
 		var myres = new Array();
 		if(myres = param.match(/cmi.interactions.(\d+).(id|time|type|correct_responses|weighting|student_response|result|latency)(.*)/)){
 		if(myres = param.match(/cmi.interactions.(\d+).(id|time|type|correct_responses|weighting|student_response|result|latency)(.*)/)){
@@ -417,6 +438,7 @@ function LMSSetValue(param, val) {
 					break;
 					break;
 			}  
 			}  
 		}else{
 		}else{
+			return_value = "false";
 			G_lastError = G_NotImplementedError;
 			G_lastError = G_NotImplementedError;
 			G_lastErrorString = 'Not implemented yet';
 			G_lastErrorString = 'Not implemented yet';
 		}
 		}
@@ -429,7 +451,7 @@ function LMSSetValue(param, val) {
 		echo "    var mycommit = LMSCommit('force');";
 		echo "    var mycommit = LMSCommit('force');";
 	}
 	}
 	?>
 	?>
-	return(true);
+	return(return_value);
 }
 }
 
 
 function SetValue(param, val) {
 function SetValue(param, val) {
@@ -452,13 +474,15 @@ function savedata(origin) { //origin can be 'commit', 'finish' or 'terminate'
     ?>/lp_controller.php?cidReq=<?php echo api_get_course_id();?>&action=save&lp_id=<?php echo $oLP->get_id();?>&" + param + "";
     ?>/lp_controller.php?cidReq=<?php echo api_get_course_id();?>&action=save&lp_id=<?php echo $oLP->get_id();?>&" + param + "";
 	*/
 	*/
 	logit_lms('saving data (status='+lesson_status+' - interactions: '+ interactions.length +')',1);
 	logit_lms('saving data (status='+lesson_status+' - interactions: '+ interactions.length +')',1);
-	xajax_save_item(lms_lp_id, lms_user_id, lms_view_id, lms_item_id, score, max, min, lesson_status, session_time, suspend_data, lesson_location, interactions);
+	xajax_save_item(lms_lp_id, lms_user_id, lms_view_id, lms_item_id, score, max, min, lesson_status, session_time, suspend_data, lesson_location, interactions, lms_item_core_exit);
 	//xajax_update_pgs();
 	//xajax_update_pgs();
 	//xajax_update_toc();
 	//xajax_update_toc();
 }
 }
 
 
 function LMSCommit(val) {
 function LMSCommit(val) {
 	logit_scorm('LMSCommit()',0);
 	logit_scorm('LMSCommit()',0);
+	G_LastError = G_NoError ;
+	G_LastErrorMessage = 'No error';	
     commit = true ;
     commit = true ;
 	savedata('commit');
 	savedata('commit');
 	return('true');
 	return('true');
@@ -469,6 +493,8 @@ function Commit(val) {
 }
 }
 
 
 function LMSFinish(val) {
 function LMSFinish(val) {
+	G_LastError = G_NoError ;
+	G_LastErrorMessage = 'No error';	
 	if (( commit == false )) { 	
 	if (( commit == false )) { 	
 		logit_scorm('LMSFinish() (no LMSCommit())',1); 
 		logit_scorm('LMSFinish() (no LMSCommit())',1); 
 	}
 	}
@@ -512,6 +538,8 @@ function GetDiagnostic(errCode){
 
 
 function Terminate(){
 function Terminate(){
 	logit_scorm('Terminate()',0);
 	logit_scorm('Terminate()',0);
+	G_LastError = G_NoError ;
+	G_LastErrorMessage = 'No error';	
 	commit = true;
 	commit = true;
 	savedata('terminate');
 	savedata('terminate');
 	return (true);
 	return (true);