You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
8.7 KiB
210 lines
8.7 KiB
<?php // $id: $
|
|
/*
|
|
----------------------------------------------------------------------
|
|
Dokeos - elearning and course management software
|
|
|
|
Copyright (c) 2004 Dokeos S.A.
|
|
Copyright (c) Denes Nagy (darkden@freemail.hu)
|
|
|
|
For a full list of contributors, see "credits.txt".
|
|
The full license can be read in "license.txt".
|
|
|
|
This program 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 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
Contact: Dokeos, 181 rue Royale, B-1000 Brussels, Belgium, info@dokeos.com
|
|
----------------------------------------------------------------------
|
|
*/
|
|
/**
|
|
==============================================================================
|
|
* @package dokeos.scorm
|
|
==============================================================================
|
|
*/
|
|
|
|
// incoming data from scormfunctions.js : $score - $max - $min - $lesson_status - $time
|
|
$langFile = "scorm";
|
|
include('../inc/global.inc.php');
|
|
$this_section=SECTION_COURSES;
|
|
|
|
//include('XMLencode.php');
|
|
//$charset = GetXMLEncode($_GET['file']);
|
|
header('Content-Type: text/html; charset='. $charset);
|
|
//error_log($_SERVER['REQUEST_URI'],0);
|
|
//error_log("Starting closesco",0);
|
|
|
|
$lesson_status = $_GET['lesson_status'];
|
|
$score = $_GET['score'];
|
|
$time = $_GET['time'];
|
|
$my_sco_identifier = $_GET['sco_identifier'];
|
|
$contentId = $_SESSION['contentId'];
|
|
$items = $_SESSION['items'];
|
|
$origin = $_GET['origin'];
|
|
$max = $_GET['max'];
|
|
$min = $_GET['min'];
|
|
$file = $_GET['file'];
|
|
|
|
$charset_lang = 'ISO-8859-15';
|
|
|
|
$array_status=array('completed' => htmlentities(get_lang('ScormCompstatus'),ENT_QUOTES,$charset_lang),
|
|
'passed' => htmlentities(get_lang('ScormPassed'),ENT_QUOTES,$charset_lang),
|
|
'failed' => htmlentities(get_lang('ScormFailed'),ENT_QUOTES,$charset_lang),
|
|
'incomplete' => htmlentities(get_lang('ScormIncomplete'),ENT_QUOTES,$charset_lang),
|
|
'not attempted' => htmlentities(get_lang('ScormNotAttempted'),ENT_QUOTES,$charset_lang));
|
|
//although we defined 'not attempted' here as a common status, it shouldn't be used in
|
|
// the context of this script, which is only for content closing purposes
|
|
|
|
//save this sco-id in session so that we can check what last sco has been closed
|
|
$_SESSION['last_sco_closed'] = $my_sco_identifier;
|
|
|
|
if ($lesson_status=='') { $lesson_status='incomplete'; }
|
|
|
|
$TBL_SCORM_SCO_DATA = Database::get_scorm_sco_data_table();
|
|
|
|
//prepare a small reverse-index of "clusterinfo"=>"item index"
|
|
$items_clusterinfo_dictionary = array();
|
|
foreach($items as $key=>$content){
|
|
$items_clusterinfo_dictionary[$content['clusterinfo']]=$key;
|
|
}
|
|
|
|
if($_SESSION['dont_save_last']!=true){
|
|
//error_log("Element $my_sco_identifier can be saved (no conditions preventing it)",0);
|
|
//check if there are dependent clusters
|
|
$sub_cluster_completed = true;
|
|
$base_child_cluster = $items[$_SESSION['items_dictionary'][$my_sco_identifier]]['clusterinfo']*10;
|
|
for ($i = $base_child_cluster; $i<($base_child_cluster+10);$i++){
|
|
$j = $items_clusterinfo_dictionary[$i];
|
|
if(is_array($items[$j])){
|
|
//error_log('items['.$j.'] is an array',0);
|
|
$sql = "SELECT status FROM $TBL_SCORM_SCO_DATA
|
|
WHERE (contentId='$contentId' and studentId='".$_user['user_id']."' and scoIdentifier='".$items[$j]['identifier']."')";
|
|
$result = api_sql_query($sql,__FILE__,__LINE__);
|
|
$ar=mysql_fetch_array($result);
|
|
$sub_lesson_status=$ar['status'];
|
|
//error_log('status: '.$sub_lesson_status,0);
|
|
if ((($sub_lesson_status)<>'completed') and ($sub_lesson_status <> 'passed' )) { $sub_cluster_completed=false; }
|
|
}
|
|
}
|
|
if($sub_cluster_completed){
|
|
//error_log("Element $my_sco_identifier has no incomplete children, change status to $lesson_status",0);
|
|
$sql="UPDATE $TBL_SCORM_SCO_DATA SET score='$score', status='$lesson_status', time='$time' WHERE (studentId='".$_user['user_id']."' and scoIdentifier='$my_sco_identifier' and contentId='$contentId')";
|
|
$result = api_sql_query($sql,__FILE__,__LINE__);
|
|
//error_log($sql,0);
|
|
}else{
|
|
//error_log("Element $my_sco_identifier has incomplete children, set status to incomplete)",0);
|
|
$sql="UPDATE $TBL_SCORM_SCO_DATA SET score='$score', status='incomplete', time='$time' WHERE (studentId='".$_user['user_id']."' and scoIdentifier='$my_sco_identifier' and contentId='$contentId')";
|
|
$result = api_sql_query($sql,__FILE__,__LINE__);
|
|
}
|
|
}else{
|
|
//error_log("Element $my_sco_identifier cannot be saved (restart conditions preventing it)",0);
|
|
}
|
|
/*==================================================================================
|
|
SEARCHING FOR COMPLETE CLUSTERS AND IF ANY, UPDATE THEM TO COMPLETED IF NECCESSARY
|
|
==================================================================================*/
|
|
|
|
//if ($lesson_status=='completed') {
|
|
$clustercompleted=true;
|
|
//$i=0; //get to the current element
|
|
$i = $_SESSION['items_dictionary'][$my_sco_identifier];
|
|
//do {
|
|
// $i++;
|
|
//} while (($items[$i]['identifier'] != $my_sco_identifier) and ($i <= count($items)));
|
|
// now $i is the index of the current element
|
|
//$items[$i]['status'] = $lesson_status;
|
|
//api_session_unregister($items);
|
|
//api_session_register($items);
|
|
|
|
|
|
//now check if the current element completes the cluster
|
|
//a. get the parent's clusterinfo (if clusterinfo = 23, parent is 2)
|
|
$startcluster=floor(($items[$i]['clusterinfo'])/10);
|
|
//b. get through all elements of the same cluster (all elements with clusterinfo of 2* - max 10 elems)
|
|
for ($cluster=($startcluster*10); (($cluster<=($startcluster*10+9)) && ($clustercompleted==true)); $cluster++) {
|
|
//$i=0;
|
|
//do {
|
|
// $i++;
|
|
//} while (($items[$i]['clusterinfo'] != $cluster) and ($i <= count($items)));
|
|
//get index of parent cluster
|
|
$i = (!empty($items_clusterinfo_dictionary[$cluster])?$items_clusterinfo_dictionary[$cluster]:0);
|
|
$id=$items[$i]['identifier'];
|
|
$sql = "SELECT status FROM $TBL_SCORM_SCO_DATA
|
|
WHERE (contentId='$contentId' and studentId='".$_user['user_id']."' and scoIdentifier='$id')";
|
|
$result = api_sql_query($sql,__FILE__,__LINE__);
|
|
$ar=mysql_fetch_array($result);
|
|
$cluster_lesson_status=$ar['status'];
|
|
if ((is_array($items[$i])) and ((($cluster_lesson_status)<>'completed') and ($cluster_lesson_status <> 'passed' ))) { $clustercompleted=false; }
|
|
}
|
|
|
|
if ($clustercompleted) { //if every sub-element of this cluster was completed
|
|
//$i=0;
|
|
//do {
|
|
// $i++;
|
|
//} while (($items[$i]['clusterinfo'] != $startcluster) and ($i <= count($items)));
|
|
$i = (!empty($items_clusterinfo_dictionary[$startcluster])?$items_clusterinfo_dictionary[$startcluster]:0);
|
|
$my_sco_identifier=$items[$i]['identifier'];
|
|
$sql="UPDATE $TBL_SCORM_SCO_DATA SET status='completed' WHERE (studentId='".$_user['user_id']."' and scoIdentifier='$my_sco_identifier' and contentId='$contentId')";
|
|
//echo $sql;
|
|
$result = api_sql_query($sql,__FILE__,__LINE__);
|
|
} else { // if at least one element was not completed
|
|
//$i=0;
|
|
//do {
|
|
// $i++;
|
|
//} while (($items[$i]['clusterinfo'] != $startcluster) and ($i <= count($items)));
|
|
$i = (!empty($items_clusterinfo_dictionary[$startcluster])?$items_clusterinfo_dictionary[$startcluster]:0);
|
|
$my_sco_identifier=$items[$i]['identifier'];
|
|
$sql="UPDATE $TBL_SCORM_SCO_DATA SET status='incomplete' WHERE (studentId='".$_user['user_id']."' and scoIdentifier='$my_sco_identifier' and contentId='$contentId')";
|
|
//echo $sql;
|
|
$result = api_sql_query($sql,__FILE__,__LINE__);
|
|
}
|
|
//}
|
|
|
|
//$origin can be 'terminate', 'finish' or 'commit'
|
|
|
|
/*=============================================
|
|
SENDING MESSAGE ABOUT STATUS TO MESSAGE FRAME
|
|
=============================================*/
|
|
?>
|
|
<html><head><link rel='stylesheet' type='text/css' href='../css/scorm.css'>
|
|
<script type='text/javascript'>
|
|
/* <![CDATA[ */
|
|
function reloadcontents() {
|
|
newloc=addtime(parent.contents.document.location);
|
|
top.contents.document.location=newloc; //in order to refresh
|
|
}
|
|
function addtime(input) {
|
|
rnd=Math.random()*100;
|
|
if (input.toString().indexOf("#")==-1) {
|
|
newstring=input+'&rnd='+rnd;
|
|
return(newstring);
|
|
} else {
|
|
t=input.toString().indexOf("#");
|
|
sub1=input.toString().substr(0,t);
|
|
sub2=input.toString().substr(t,input.length);
|
|
newstring=sub1+'&rnd='+rnd+sub2;
|
|
return(newstring);
|
|
}
|
|
}
|
|
/* ]]> */
|
|
</script>
|
|
</head><body onload='javascript:reloadcontents();'>
|
|
|
|
<?php
|
|
if (($lesson_status=='completed') or ($lesson_status=='passed'))
|
|
{
|
|
//echo "<img src='../img/right.gif' alt='right'>";
|
|
echo "<div class='message'>"
|
|
.htmlentities(get_lang('ScormThisStatus'),ENT_QUOTES,$charset_lang)." : ".$array_status[$lesson_status]
|
|
." </div>";
|
|
}
|
|
else
|
|
{
|
|
//echo "<img src='../img/wrong.gif' alt='wrong'>";
|
|
echo "<div class='message'>"
|
|
.htmlentities(get_lang('ScormThisStatus'),ENT_QUOTES,$charset_lang)." : ".$array_status[$lesson_status]
|
|
."</div>";
|
|
}
|
|
echo "</body></html>";
|
|
?>
|