diff --git a/dokeos_license.txt b/dokeos_license.txt
index 8c9d4d38ce..40f804e941 100644
--- a/dokeos_license.txt
+++ b/dokeos_license.txt
@@ -7,6 +7,7 @@
Copyright (c) 2001 Universite catholique de Louvain (UCL)
Copyright (c) 2003-2008 Vrije Universiteit Brussel (VUB)
Copyright (c) 2004-2008 Hoogeschool Gent (HoGent)
+ Copyright (c) Denes Nagy (darkden@freemail.hu)
For a full list of contributors detaining copyrights over parts of
the Dokeos software, see "documentation/credits.html".
The full license can be read in "documentation/license.html".
diff --git a/main/inc/lib/tracking.lib.php b/main/inc/lib/tracking.lib.php
index 355089c77d..2d289f67a3 100644
--- a/main/inc/lib/tracking.lib.php
+++ b/main/inc/lib/tracking.lib.php
@@ -92,31 +92,20 @@ class Tracking {
function get_time_spent_on_the_course($user_id, $course_code) {
// protect datas
$user_id = intval($user_id);
- $course_code = addslashes($course_code);
-
+ $course_code = addslashes($course_code);
$tbl_track_course = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
-
- $sql = 'SELECT login_course_date, logout_course_date FROM ' . $tbl_track_course . '
- WHERE user_id = ' . $user_id . '
- AND course_code="' . $course_code . '"';
-
+ $condition_user = "";
+ if (is_array($user_id)) {
+ $condition_user = " AND user_id IN (".implode(',',$user_id).") ";
+ } else {
+ $condition_user = " AND user_id = '$user_id' ";
+ }
+ $sql = " SELECT SUM(UNIX_TIMESTAMP(logout_course_date)-UNIX_TIMESTAMP(login_course_date)) as nb_seconds
+ FROM $tbl_track_course
+ WHERE course_code='$course_code' $condition_user";
$rs = Database::query($sql,__FILE__,__LINE__);
-
- $nb_seconds = 0;
-
- while ($a_connections = Database::fetch_array($rs)) {
-
- $s_login_date = $a_connections["login_course_date"];
- $s_logout_date = $a_connections["logout_course_date"];
-
- $i_timestamp_login_date = strtotime($s_login_date);
- $i_timestamp_logout_date = strtotime($s_logout_date);
-
- $nb_seconds += ($i_timestamp_logout_date - $i_timestamp_login_date);
-
- }
-
- return $nb_seconds;
+ $row = Database::fetch_array($rs);
+ return $row['nb_seconds'];
}
function get_first_connection_date($student_id) {
@@ -243,120 +232,83 @@ class Tracking {
/**
* This function gets the score average from all tests in a course by student
- * @param int $student_id - User id
+ * @param int $student_id - or array for multiples User id (array(0=>1,1=>2))
* @param string $course_code - Course id
* @return string value (number %) Which represents a round integer about the score average.
*/
function get_avg_student_exercise_score($student_id, $course_code) {
// protect datas
- $student_id = Database::escape_string($student_id);
$course_code = Database::escape_string($course_code);
-
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
-
- if(!empty($a_course['db_name']))
- {
+ if(!empty($a_course['db_name'])) {
// table definition
$tbl_course_quiz = Database::get_course_table(TABLE_QUIZ_TEST,$a_course['db_name']);
- $tbl_stats_exercise = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-
- //get the list of exercises
- $sql = "SELECT id, title FROM $tbl_course_quiz WHERE active <> -1";
- $rs = Database::query($sql, __FILE__, __LINE__);
- $count_exe = Database::num_rows($rs);
-
- if ($count_exe > 0) {
- $quiz_avg_total_score = 0;
- while($quiz = Database::fetch_array($rs)) {
-
- // get the score and max score from track_e_exercise
- $sql = 'SELECT exe_result , exe_weighting
- FROM '.$tbl_stats_exercise.'
- WHERE exe_exo_id = '.(int)$quiz['id'].'
- AND exe_user_id = '.(int)$student_id.'
- AND orig_lp_id = 0
- AND exe_cours_id = "'.Database::escape_string($course_code).'"
- AND orig_lp_item_id = 0
- ORDER BY exe_date DESC';
-
- $rsAttempt = Database::query($sql, __FILE__, __LINE__);
- $nb_attempts = 0;
-
- $quiz_avg_score = 0;
- while ($attempt = Database::fetch_array($rsAttempt)) {
- $nb_attempts++;
- $exe_weight=$attempt['exe_weighting'];
- if ($exe_weight >0) {
- $quiz_avg_score += round(($attempt['exe_result']/$exe_weight*100),2);
- }
- }
- if($nb_attempts>0) {
- $quiz_avg_score = $quiz_avg_score / $nb_attempts;
- }
-
- $quiz_avg_total_score += $quiz_avg_score;
+ $tbl_stats_exercise = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+ $count_quiz = Database::fetch_row(Database::query("SELECT count(id) FROM $tbl_course_quiz WHERE active <> -1",__FILE__,__LINE__));
+ $quiz_avg_total_score = 0;
+ if (!empty($count_quiz[0]) && !empty($student_id)) {
+ $condition_user = "";
+ if (is_array($student_id)) {
+ $condition_user = " AND exe_user_id IN (".implode(',',$student_id).") ";
+ } else {
+ $condition_user = " AND exe_user_id = '$student_id' ";
}
- return $quiz_avg_total_score/$count_exe;
- }
- }
- else
- {
- return null;
- }
-
+ $sql = "SELECT SUM(exe_result/exe_weighting*100) as avg_score
+ FROM $tbl_stats_exercise
+ WHERE exe_exo_id IN (SELECT id FROM $tbl_course_quiz WHERE active <> -1)
+ $condition_user
+ AND orig_lp_id = 0
+ AND exe_cours_id = '$course_code'
+ AND orig_lp_item_id = 0
+ ORDER BY exe_date DESC";
+ $res = Database::query($sql, __FILE__, __LINE__);
+ $row = Database::fetch_array($res);
+ $quiz_avg_score = 0;
+ if (!empty($row['avg_score'])) {
+ $quiz_avg_score = round($row['avg_score'],2);
+ }
+ $count_attempt = Database::fetch_row(Database::query("SELECT count(*) FROM $tbl_stats_exercise WHERE exe_exo_id IN (SELECT id FROM $tbl_course_quiz WHERE active <> -1) $condition_user AND orig_lp_id = 0 AND exe_cours_id = '$course_code' AND orig_lp_item_id = 0 ORDER BY exe_date DESC",__FILE__,__LINE__));
+ if(!empty($count_attempt[0])) {
+ $quiz_avg_score = $quiz_avg_score / $count_attempt[0];
+ }
+ $quiz_avg_total_score = $quiz_avg_score;
+ return $quiz_avg_total_score/$count_quiz[0];
+ }
+ }
+ return null;
}
-
- function get_avg_student_progress($student_id, $course_code) {
- require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
-
+ function get_avg_student_progress($student_id, $course_code) {
// protect datas
- $student_id = intval($student_id);
$course_code = addslashes($course_code);
-
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
-
- if(!empty($a_course['db_name']))
- {
+ if (!empty($a_course['db_name'])) {
// table definition
- $tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW, $a_course['db_name']);
- $tbl_course_lp_view_item = Database :: get_course_table(TABLE_LP_ITEM_VIEW, $a_course['db_name']);
- $tbl_course_lp_item = Database :: get_course_table(TABLE_LP_ITEM, $a_course['db_name']);
- $tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN, $a_course['db_name']);
-
- //get the list of learning paths
- $sql = 'SELECT id FROM ' . $tbl_course_lp;
- $rs = Database::query($sql, __FILE__, __LINE__);
- $nb_lp = Database::num_rows($rs);
+ $tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW, $a_course['db_name']);
+ $tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN, $a_course['db_name']);
+ $count_lp = Database::fetch_row(Database::query("SELECT count(id) FROM $tbl_course_lp",__FILE__,__LINE__));
$avg_progress = 0;
-
- if ($nb_lp > 0) {
- while ($lp = Database :: fetch_array($rs)) {
- // get the progress in learning pathes
- $sqlProgress = "SELECT progress
- FROM " . $tbl_course_lp_view . " AS lp_view
- WHERE lp_view.user_id = " . $student_id . "
- AND lp_view.lp_id = " . $lp['id'] . "
- ";
- $resultItem = Database::query($sqlProgress, __FILE__, __LINE__);
- if(Database::num_rows($resultItem)>0)
- {
- $avg_progress += Database::result($resultItem, 0, 0);
- }
- }
- $avg_progress = round($avg_progress / $nb_lp, 1);
- }
-
- return $avg_progress;
- }
- else
- {
- return null;
+ if (!empty($count_lp[0]) && !empty($student_id)) {
+ $condition_user = "";
+ if (is_array($student_id)) {
+ $condition_user = " lp_view.user_id IN (".implode(',',$student_id).") AND ";
+ } else {
+ $condition_user = " lp_view.user_id = '$student_id' AND ";
+ }
+ $sqlProgress = "SELECT SUM(progress) FROM $tbl_course_lp_view AS lp_view WHERE $condition_user lp_view.lp_id IN (SELECT id FROM $tbl_course_lp)";
+ $resultItem = Database::query($sqlProgress, __FILE__, __LINE__);
+ $rowItem = Database::fetch_row($resultItem);
+ $avg_progress = round($rowItem[0] / $count_lp[0], 1);
+ return $avg_progress;
+ }
}
+ return null;
}
+
+
/**
* This function gets:
* 1. The score average from all SCORM Test items in all LP in a course-> All the answers / All the max score.
@@ -377,65 +329,71 @@ class Tracking {
$tbl_stats_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
$tbl_stats_attempts= Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$course = CourseManager :: get_course_information($course_code);
+
if (!empty($course['db_name'])) {
-
+
$tbl_quiz_questions= Database :: get_course_table(TABLE_QUIZ_QUESTION,$course['db_name']);
$lp_table = Database :: get_course_table(TABLE_LP_MAIN,$course['db_name']);
$lp_item_table = Database :: get_course_table(TABLE_LP_ITEM,$course['db_name']);
$lp_view_table = Database :: get_course_table(TABLE_LP_VIEW,$course['db_name']);
$lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW,$course['db_name']);
-
- $sql_course_lp = 'SELECT id FROM '.$lp_table;
- if(count($lp_ids)!=0) {
- $sql_course_lp.=' WHERE id IN ('.implode(',',$lp_ids).')';
+
+ $condition_lp = "";
+ if(count($lp_ids) > 0) {
+ $condition_lp =" WHERE id IN(".implode(',',$lp_ids).") ";
}
-
- $sql_result_lp = Database::query($sql_course_lp, __FILE__, __LINE__);
+
+ $count_row_lp = Database::fetch_row(Database::query("SELECT count(*) FROM $lp_table $condition_lp",__FILE__,__LINE__));
+
$lp_scorm_score_total = 0;
$lp_scorm_weighting_total = 0;
$lp_scorm_result_score_total = 0;
$lp_scorm_loop=0;
$lp_count = 0;
$progress = 0;
-
- if(Database::num_rows($sql_result_lp)>0){
- //Scorm test
- while($a_learnpath = Database::fetch_array($sql_result_lp)) {
-
- //We get the last view id of this LP (with the higher id)
- $sql='SELECT max(id) as id FROM '.$lp_view_table.'
- WHERE lp_id='.$a_learnpath['id'].' AND user_id="'.intval($student_id).'"';
- $rs_last_lp_view_id = Database::query($sql, __FILE__, __LINE__);
- $lp_view_id = Database::result($rs_last_lp_view_id,0,'id'); // THE view
-
- if ($lp_view_id != '') {
+
+ if (!empty($count_row_lp[0]) && !empty($student_id)) {
+
+ $condition_user1 = "";
+ if (is_array($student_id)) {
+ $condition_user1 =" AND user_id IN (".implode(',',$student_id).") ";
+ } else {
+ $condition_user1 =" AND user_id = '$student_id' ";
+ }
+
+ $sql = "SELECT max(id) as id, lp_id, user_id FROM $lp_view_table WHERE lp_id IN (SELECT id FROM $lp_table $condition_lp) $condition_user1 GROUP BY lp_id,user_id";
+ $rs_last_lp_view_id = Database::query($sql, __FILE__, __LINE__);
+
+ $score_of_scorm_calculate = 0;
+ if (Database::num_rows($rs_last_lp_view_id) > 0) {
+ while ($row_lp_view = Database::fetch_array($rs_last_lp_view_id)) {
+
+ $lp_view_id = $row_lp_view['id'];
// we get the progress
$sql='SELECT progress FROM '.$lp_view_table.' WHERE id="'.$lp_view_id.'"';
+
$rs = Database::query($sql, __FILE__, __LINE__);
$progress = Database::result($rs,0,'progress');
-
+
// item's list of an scorm
$sql_max_score='SELECT lp_iv.score as score,lp_i.max_score
FROM '.$lp_item_view_table.' as lp_iv
INNER JOIN '.$lp_item_table.' as lp_i
ON lp_i.id = lp_iv.lp_item_id
AND lp_i.item_type="sco"
- WHERE lp_view_id="'.$lp_view_id.'"';
+ WHERE lp_view_id="'.$lp_view_id.'"';
- //$rs = Database::query($sql, __FILE__, __LINE__);
- //$sql_max_score='SELECT max_score FROM '.$lp_item_view_table.' WHERE lp_view_id="'.$lp_view_id.'" ';
$res_max_score=Database::query($sql_max_score,__FILE__,__LINE__);
$count_total_loop=0;
$num_rows_max_score=Database::num_rows($res_max_score);
-
+
if ($num_rows_max_score==1) {
while ($row_max_score=Database::fetch_array($res_max_score)) {
- //echo $row_max_score['score'].' - '.$row_max_score['max_score'];
if ($row_max_score['max_score']==0) {
//when there's no max score, we assume 100 as the max score, as the SCORM 1.2 says that the value should always be between 0 and 100.
$lp_scorm_result_score_total+=($row_max_score['score']/100);
$current_value = $row_max_score['score']/100;
-
+
} else {
$lp_scorm_result_score_total+=($row_max_score['score']/$row_max_score['max_score']);
$current_value = $row_max_score['score']/$row_max_score['max_score'];
@@ -443,10 +401,7 @@ class Tracking {
$count_total_loop++;
}
} elseif ($num_rows_max_score > 1) {
- //echo ' ----
';
while ($row_max_score=Database::fetch_array($res_max_score)) {
- //echo $row_max_score['score'].' - '.$row_max_score['max_score'];
- //echo '
';
if ($row_max_score['max_score']==0) {
$lp_scorm_result_score_total+=($row_max_score['score']/100);
$current_value = $row_max_score['score']/100;
@@ -458,126 +413,90 @@ class Tracking {
$count_total_loop++;
}
}
-
+
if ($num_rows_max_score > 0 && ($progress > 0 || $current_value > 0 )) {
$lp_count++;
}
-
+
if ($count_total_loop==0) {
$count_total_loop=1;
}
$score_of_scorm_calculate=round((($lp_scorm_result_score_total/$count_total_loop)*100),2);
-
- } else {
- $score_of_scorm_calculate = 0;
+
}
- }
-
- //The next call to a MySQL fetch function, such as mysql_fetch_assoc(), would return that row.
- mysql_data_seek($sql_result_lp,0);
-
- if ($lp_count==0) {
- $lp_count=1;
- }
-
+ }
+
if(count($lp_ids)==0 ) {
- $score_of_scorm_calculate=round((($score_of_scorm_calculate/$lp_count)),2);
+ $score_of_scorm_calculate=round((($score_of_scorm_calculate/$count_row_lp[0])),2);
}
-
+
$lp_scorm_score_total = $score_of_scorm_calculate;
-
- //Quizz in a LP
- while($a_learnpath = Database::fetch_array($sql_result_lp)) {
- //we got the maxscore this is wrong
- /*
- echo $sql = 'SELECT id as item_id, max_score
- FROM '.$lp_item_table.' AS lp_item
- WHERE lp_id='.$a_learnpath['id'].'
- AND item_type="quiz"';
- */
-
- //Path is the exercise id
- $sql = 'SELECT path, id as item_id, max_score
- FROM '.$lp_item_table.' AS lp_item
- WHERE lp_id='.$a_learnpath['id'].'
- AND item_type="quiz"';
-
- $rsItems = Database::query($sql, __FILE__, __LINE__);
-
- //We get the last view id of this LP
- $sql = "SELECT id FROM $lp_view_table WHERE user_id = '".intval($student_id)."' and lp_id='".intval($a_learnpath['id'])."'";
- //$sql='SELECT max(id) as id FROM '.$lp_view_table.' WHERE lp_id='.$a_learnpath['id'].' AND user_id="'.intval($student_id).'"';
- $rs_last_lp_view_id = Database::query($sql, __FILE__, __LINE__);
- $lp_view_id = intval(Database::result($rs_last_lp_view_id,0,'id'));
-
- $total_score = $total_weighting = 0;
- if ($lp_view_id!=0) {
- while ($item = Database :: fetch_array($rsItems, 'ASSOC')) {
-
- // we take the score from a LP because we have lp_view_id
- $sql = "SELECT score FROM $lp_item_view_table WHERE lp_item_id = '".(int)$item['item_id']."' and lp_view_id = '".(int)$lp_view_id."'
- ORDER BY view_count DESC limit 1";
-
- /*$sql = 'SELECT score as student_score
- FROM '.$lp_item_view_table.' as lp_view_item
- WHERE lp_view_item.lp_item_id = '.$item['item_id'].'
- AND lp_view_id = "'.$lp_view_id.'" ';*/
- $rsScores = Database::query($sql, __FILE__, __LINE__);
-
- // Real max score - this was implemented because of the random exercises
- $sql_last_attempt = 'SELECT exe_id FROM '. $tbl_stats_exercices. ' ' .
- 'WHERE exe_exo_id="' .$item['path']. '" AND exe_user_id="' . $student_id . '" AND orig_lp_id = "'.$a_learnpath['id'].'" AND orig_lp_item_id = "'.$item['item_id'].'" AND exe_cours_id="' . $course_code . '" ORDER BY exe_date DESC limit 1';
-
- $resultLastAttempt = Database::query($sql_last_attempt, __FILE__, __LINE__);
- $num = Database :: num_rows($resultLastAttempt);
- if ($num > 0){
- if ($num > 1){
- while ($rowLA = Database :: fetch_row($resultLastAttempt)) {
- $id_last_attempt = $rowLA[0];
- }
- } else {
- $id_last_attempt = Database :: result($resultLastAttempt, 0, 0);
+
+ $condition_user2 = "";
+ if (is_array($student_id)) {
+ $condition_user2 =" lp_view.user_id IN (".implode(',',$student_id).") AND ";
+ } else {
+ $condition_user2 =" lp_view.user_id = '$student_id' AND ";
+ }
+
+ //Path is the exercise id
+ $sql = "SELECT lp_view.id as lp_view_id, lp_view.lp_id as lp_id, lp_item.path, lp_item.id as item_id, lp_item.max_score, lp_view.user_id as user_id
+ FROM $lp_view_table lp_view
+ INNER JOIN $lp_item_table lp_item ON lp_item.lp_id = lp_view.lp_id AND item_type='".TOOL_QUIZ."'
+ WHERE $condition_user2 lp_view.lp_id IN (SELECT id FROM $lp_table $condition_lp)";;
+
+ $rsItems = Database::query($sql, __FILE__, __LINE__);
+
+ $total_score = $total_weighting = 0;
+ if (Database::num_rows($rsItems) > 0) {
+ while ($item = Database::fetch_array($rsItems)) {
+
+ $lp_view_id = $item['lp_view_id'];
+ $lp_item_id = $item['item_id'];
+ $lp_id = $item['lp_id'];
+ $user_id = $item['user_id'];
+
+ // we take the score from a LP because we have lp_view_id
+ $sql = "SELECT score FROM $lp_item_view_table WHERE lp_item_id = '$lp_item_id' and lp_view_id = '$lp_view_id'
+ ORDER BY view_count DESC limit 1";
+
+ $rsScores = Database::query($sql, __FILE__, __LINE__);
+ // Real max score - this was implemented because of the random exercises
+ $sql_last_attempt = 'SELECT exe_id FROM '. $tbl_stats_exercices. ' ' .
+ 'WHERE exe_exo_id="' .$item['path']. '" AND exe_user_id="' . $user_id . '" AND orig_lp_id = "'.$lp_id.'" AND orig_lp_item_id = "'.$lp_item_id.'" AND exe_cours_id="' . $course_code . '" ORDER BY exe_date DESC limit 1';
+
+ $resultLastAttempt = Database::query($sql_last_attempt, __FILE__, __LINE__);
+ $num = Database :: num_rows($resultLastAttempt);
+ if ($num > 0){
+ if ($num > 1){
+ while ($rowLA = Database :: fetch_row($resultLastAttempt)) {
+ $id_last_attempt = $rowLA[0];
}
+ } else {
+ $id_last_attempt = Database :: result($resultLastAttempt, 0, 0);
}
+ }
- $sql = "SELECT SUM(t.ponderation) as maxscore from ( SELECT distinct question_id, marks,ponderation FROM $tbl_stats_attempts as at " .
- "INNER JOIN $tbl_quiz_questions as q on(q.id = at.question_id) where exe_id ='$id_last_attempt' ) as t";
-
- $result = Database::query($sql, __FILE__, __LINE__);
- $row_max_score = Database :: fetch_array($result);
- $maxscore = $row_max_score['maxscore'];
- if ($maxscore=='') {
- $maxscore = $item['max_score'];
+ $sql = "SELECT SUM(t.ponderation) as maxscore from ( SELECT distinct question_id, marks,ponderation FROM $tbl_stats_attempts as at " .
+ "INNER JOIN $tbl_quiz_questions as q on(q.id = at.question_id) where exe_id ='$id_last_attempt' ) as t";
+
+ $result = Database::query($sql, __FILE__, __LINE__);
+ $row_max_score = Database :: fetch_array($result);
+ $maxscore = $row_max_score['maxscore'];
+ if ($maxscore=='') {
+ $maxscore = $item['max_score'];
+ }
+ if(Database::num_rows($rsScores)>0) {
+ $total_score = Database::result($rsScores, 0, 0);
+ $total_weighting += $maxscore;
+ if($total_weighting>0 && $maxscore>0) {
+ $lp_scorm_score_total += ($total_score/$maxscore)*100;
+ $lp_scorm_weighting_total+=100;
}
- // not right!
- /*if(Database::num_rows($rsScores)>0) {
- $total_score += Database::result($rsScores, 0, 0);
- //echo $total_weighting += $item['max_score'];
- $total_weighting += $maxscore;
-
- if($total_weighting>0) {
- //echo ($total_score/$total_weighting)*100;
- $lp_scorm_score_total += ($total_score/$total_weighting)*100;
- $lp_scorm_weighting_total+=100;
- }
- }*/
-
- if(Database::num_rows($rsScores)>0) {
- $total_score = Database::result($rsScores, 0, 0);
- //echo $total_weighting += $item['max_score'];
- $total_weighting += $maxscore;
- if($total_weighting>0 && $maxscore>0) {
- //echo $total_score.' - '.$maxscore; echo '
';
- //echo $lp_scorm_score_total += ($total_score/$total_weighting)*100;
- $lp_scorm_score_total += ($total_score/$maxscore)*100;
- $lp_scorm_weighting_total+=100;
- }
- }
- }
+ }
}
- }
- }
-
+ }
+ }
$totalScore = $lp_scorm_score_total;
$pourcentageScore = 0;
if($lp_scorm_weighting_total>0) {
@@ -589,11 +508,10 @@ class Tracking {
return $score_of_scorm_calculate;
} else {
return null;
- }
- } else {
- return null;
- }
+ }
+ }
}
+
/**
* gets the list of students followed by coach
@@ -619,7 +537,7 @@ class Tracking {
if ($_configuration['multiple_access_urls']==true) {
$tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
$access_url_id = api_get_current_access_url_id();
- if ($access_url_id != -1){
+ if ($access_url_id != -1) {
$sql = 'SELECT scu.id_session, scu.course_code
FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_session_rel_access_url.' sru
ON (scu.id_session=sru.session_id)
@@ -974,56 +892,49 @@ class Tracking {
function count_student_assignments($student_id, $course_code) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
- // protect datas
- $student_id = intval($student_id);
- $course_code = addslashes($course_code);
-
+ // protect datas
+ $course_code = Database::escape_string($course_code);
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
-
- if(!empty($a_course['db_name']))
- {
+ if (!empty($a_course['db_name'])) {
// table definition
- $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $a_course['db_name']);
- $sql = 'SELECT 1
- FROM ' . $tbl_item_property . '
- WHERE insert_user_id=' . $student_id . '
- AND tool="work"';
-
+ $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $a_course['db_name']);
+ $condition_user = "";
+ if (is_array($student_id)) {
+ $condition_user = " AND insert_user_id IN (".implode(',',$student_id).") ";
+ } else {
+ $condition_user = " AND insert_user_id = '$student_id' ";
+ }
+ $sql = "SELECT count(tool) FROM $tbl_item_property WHERE tool='work' $condition_user ";
$rs = Database::query($sql, __LINE__, __FILE__);
- return Database::num_rows($rs);
- }
- else
- {
- return null;
+ $row = Database::fetch_row($rs);
+ return $row[0];
}
+ return null;
}
function count_student_messages($student_id, $course_code) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
// protect datas
- $student_id = intval($student_id);
$course_code = addslashes($course_code);
-
// get the informations of the course
$a_course = CourseManager :: get_course_information($course_code);
-
- if(!empty($a_course['db_name']))
- {
+ if (!empty($a_course['db_name'])) {
// table definition
- $tbl_messages = Database :: get_course_table(TABLE_FORUM_POST, $a_course['db_name']);
- $sql = 'SELECT 1
- FROM ' . $tbl_messages . '
- WHERE poster_id=' . $student_id;
-
+ $tbl_messages = Database :: get_course_table(TABLE_FORUM_POST, $a_course['db_name']);
+ $condition_user = "";
+ if (is_array($student_id)) {
+ $condition_user = " WHERE poster_id IN (".implode(',',$student_id).") ";
+ } else {
+ $condition_user = " WHERE poster_id = '$student_id' ";
+ }
+ $sql = "SELECT count(post_id) FROM $tbl_messages $condition_user ";
$rs = Database::query($sql, __LINE__, __FILE__);
- return Database::num_rows($rs);
- }
- else
- {
- return null;
- }
+ $row = Database::fetch_row($rs);
+ return $row[0];
+ }
+ return null;
}
/**
@@ -1297,8 +1208,8 @@ class Tracking {
* @param string the course id
*/
function get_average_test_scorm_and_lp ($user_id,$course_id) {
- //the score inside the Reporting table
-
+
+ //the score inside the Reporting table
$course_info=api_get_course_info($course_id);
$lp_table = Database :: get_course_table(TABLE_LP_MAIN,$course_info['dbName']);
$lp_view_table = Database :: get_course_table(TABLE_LP_VIEW,$course_info['dbName']);
@@ -1358,12 +1269,11 @@ class Tracking {
$average_data1=0;
$count_loop++;
}
-
if ((int)$count_loop > 0) {
$avg_student_score = round(($average_data_sum / $count_loop * 100), 2);
}
-
return $avg_student_score;
}
+
}
?>
diff --git a/main/mySpace/index.php b/main/mySpace/index.php
index f6c856e8d1..3d25bd2e0f 100755
--- a/main/mySpace/index.php
+++ b/main/mySpace/index.php
@@ -48,7 +48,8 @@ $tbl_session_course = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE);
$tbl_session_user = Database :: get_main_table(TABLE_MAIN_SESSION_USER);
$tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tbl_admin = Database :: get_main_table(TABLE_MAIN_ADMIN);
-
+$tbl_track_cours_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
+
/********************
* FUNCTIONS
@@ -435,16 +436,14 @@ if ($view == 'coach') {
';
}
}
-
echo '
';
if (api_is_allowed_to_create_course() && $view == 'teacher') {
+
if ($nb_teacher_courses) {
-
- $table = new SortableTable('tracking_list_course', 'count_teacher_courses');
+ $table = new SortableTable('courses', 'get_number_of_courses' ,'get_course_data');
$parameters['view'] = 'teacher';
$parameters['class'] = 'data_table';
-
$table->set_additional_parameters($parameters);
$table -> set_header(0, get_lang('CourseTitle'), false, 'align="center"');
$table -> set_header(1, get_lang('NbStudents'), false);
@@ -465,98 +464,8 @@ if (api_is_allowed_to_create_course() && $view == 'teacher') {
get_lang('AvgExercisesScore', ''),
get_lang('AvgMessages', ''),
get_lang('AvgAssignments', '')
- );
-
- $a_course_students = array();
-
- foreach ($courses as $course) {
- $course_code = $course['course_code'];
- $avg_assignments_in_course = $avg_messages_in_course = $nb_students_in_course = $avg_progress_in_course = $avg_score_in_course = $avg_time_spent_in_course = $avg_score_in_exercise = 0;
-
- // students directly subscribed to the course
- $sql = "SELECT user_id FROM $tbl_course_user as course_rel_user WHERE course_rel_user.status='5' AND course_rel_user.course_code='$course_code'";
- $rs = Database::query($sql, __FILE__, __LINE__);
- while ($row = Database::fetch_array($rs)) {
- $nb_students_in_course++;
-
- // tracking datas
- $avg_progress_in_course += Tracking :: get_avg_student_progress ($row['user_id'], $course_code);
- $avg_score_in_course += Tracking :: get_avg_student_score ($row['user_id'], $course_code);
- $avg_score_in_exercise += Tracking :: get_avg_student_exercise_score ($row['user_id'], $course_code);
- $avg_time_spent_in_course += Tracking :: get_time_spent_on_the_course ($row['user_id'], $course_code);
- $avg_messages_in_course += Tracking :: count_student_messages ($row['user_id'], $course_code);
- $avg_assignments_in_course += Tracking :: count_student_assignments ($row['user_id'], $course_code);
- $a_course_students[] = $row['user_id'];
- }
-
- // students subscribed to the course through a session
- if (api_get_setting('use_session_mode') == 'true') {
- $sql = 'SELECT id_user as user_id
- FROM '.$tbl_session_course_user.'
- WHERE course_code="'.addslashes($course_code).'" ORDER BY course_code';
- $rs = Database::query($sql, __FILE__, __LINE__);
- while ($row = Database::fetch_array($rs)) {
- if (!in_array($row['user_id'], $a_course_students)) {
- $nb_students_in_course++;
-
- // tracking datas
- $avg_progress_in_course += Tracking :: get_avg_student_progress ($row['user_id'], $course_code);
- $avg_score_in_course += Tracking :: get_avg_student_score ($row['user_id'], $course_code);
- $avg_score_in_exercise += Tracking :: get_avg_student_exercise_score ($row['user_id'], $course_code);
- $avg_time_spent_in_course += Tracking :: get_time_spent_on_the_course ($row['user_id'], $course_code);
- $avg_messages_in_course += Tracking :: count_student_messages ($row['user_id'], $course_code);
- $avg_assignments_in_course += Tracking :: count_student_assignments ($row['user_id'], $course_code);
- $a_course_students[] = $row['user_id'];
- }
- }
- }
-
- if ($nb_students_in_course > 0) {
- $avg_time_spent_in_course = api_time_to_hms($avg_time_spent_in_course / $nb_students_in_course);
- $avg_progress_in_course = round($avg_progress_in_course / $nb_students_in_course, 2);
- $avg_score_in_course = round($avg_score_in_course / $nb_students_in_course, 2);
- $avg_score_in_exercise = round($avg_score_in_exercise / $nb_students_in_course, 2);
- $avg_messages_in_course = round($avg_messages_in_course / $nb_students_in_course, 2);
- $avg_assignments_in_course = round($avg_assignments_in_course / $nb_students_in_course, 2);
- } else {
- $avg_time_spent_in_course = null;
- $avg_progress_in_course = null;
- $avg_score_in_course = null;
- $avg_score_in_exercise = null;
- $avg_messages_in_course = null;
- $avg_assignments_in_course = null;
- }
-
- $table_row = array();
- $table_row[] = $course['title'];
- $table_row[] = $nb_students_in_course;
- $table_row[] = $avg_time_spent_in_course;
- $table_row[] = is_null($avg_progress_in_course) ? '' : $avg_progress_in_course.'%';
- $table_row[] = is_null($avg_score_in_course) ? '' : $avg_score_in_course.'%';
- $table_row[] = is_null($avg_score_in_exercise) ? '' : $avg_score_in_exercise.'%';
- $table_row[] = $avg_messages_in_course;
- $table_row[] = $avg_assignments_in_course;
- //set the "from" value to know if I access the Reporting by the Dokeos tab or the course link
- $table_row[] = '
';
-
- $csv_content[] = array(
- api_html_entity_decode($course['title'], ENT_QUOTES, $charset),
- $nb_students_in_course,
- $avg_time_spent_in_course,
- is_null($avg_progress_in_course) ? null : $avg_progress_in_course.'%',
- is_null($avg_score_in_course) ? null : $avg_score_in_course.'%',
- is_null($avg_score_in_exercise) ? null : $avg_score_in_exercise.'%',
- $avg_messages_in_course,
- $avg_assignments_in_course,
- );
-
- $table -> addRow($table_row, 'align="right"');
-
- $a_course_students = array();
- }
- $table -> updateColAttributes(0, array('align' => 'left'));
- $table -> updateColAttributes(7, array('align' => 'center'));
- $table -> display();
+ );
+ $table->display();
}
}
@@ -566,7 +475,6 @@ if ($is_platform_admin && $view == 'admin') {
if ($_GET['display'] == 'useroverview') {
echo ' | '.get_lang('ExportUserOverviewOptions').'';
}
-
if ($_GET['display'] === 'useroverview') {
display_tracking_user_overview();
} else {
@@ -584,7 +492,6 @@ if ($is_platform_admin && $view == 'admin') {
} else {
$order = array(0 => 'lastname', 1 => 'firstname', 2 => ($sort_by_first_name ? 'firstname' : 'lastname'), 3 => 'login_date', 4 => ($sort_by_first_name ? 'firstname' : 'lastname'), 5 => ($sort_by_first_name ? 'firstname' : 'lastname'));
}
-
$table = new SortableTable('tracking_list_coaches', 'count_coaches', null, ($is_western_name_order xor $sort_by_first_name) ? 1 : 0);
$parameters['view'] = 'admin';
$table->set_additional_parameters($parameters);
@@ -629,9 +536,8 @@ if ($is_platform_admin && $view == 'admin') {
$sqlCoachs = "SELECT DISTINCT scu.id_user as id_coach, user_id, lastname, firstname, MAX(login_date) as login_date
FROM $tbl_user, $tbl_session_course_user scu, $tbl_track_login
WHERE scu.id_user=user_id AND scu.status=2 AND login_user_id=user_id
- GROUP BY user_id ";
- // ORDER BY login_date ".$tracking_direction;
-
+ GROUP BY user_id ";
+
if ($_configuration['multiple_access_urls'] == true) {
$tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
$access_url_id = api_get_current_access_url_id();
@@ -642,14 +548,12 @@ if ($is_platform_admin && $view == 'admin') {
GROUP BY user_id ";
}
}
-
if (!empty($order[$tracking_column])) {
$sqlCoachs .= "ORDER BY ".$order[$tracking_column]." ".$tracking_direction;
}
$result_coaches = Database::query($sqlCoachs, __FILE__, __LINE__);
$total_no_coaches = Database::num_rows($result_coaches);
-
$global_coaches = array();
while ($coach = Database::fetch_array($result_coaches)) {
$global_coaches[$coach['user_id']] = $coach;
@@ -1206,3 +1110,104 @@ function get_user_overview_export_extra_fields($user_id) {
$extra_data = UserManager::get_extra_user_data($user_id, true);
return $extra_data;
}
+/**
+ * Get number of courses for sortable with pagination
+ * @return int
+ */
+function get_number_of_courses() {
+ global $courses;
+ return count($courses);
+}
+/**
+ * Get data for courses list in sortable with pagination
+ * @return array
+ */
+function get_course_data($from, $number_of_items, $column, $direction) {
+
+ global $courses, $csv_content, $charset ;
+ global $tbl_course, $tbl_course_user, $tbl_track_cours_access, $tbl_session_course_user;
+
+ $a_course_students = array();
+ $course_data = array();
+ $arr_course = $courses;
+ foreach ($arr_course as &$cours) {
+ $cours = "'{$cours[course_code]}'";
+ }
+
+ // get all courses with limit
+ $sql = "SELECT course.code as col1, course.title as col2
+ FROM $tbl_course course
+ WHERE course.code IN (".implode(',',$arr_course).")";
+ if (!in_array($direction, array('ASC','DESC'))) $direction = 'ASC';
+
+ $column = intval($column);
+ $from = intval($from);
+ $number_of_items = intval($number_of_items);
+ $sql .= " ORDER BY col$column $direction ";
+ $sql .= " LIMIT $from,$number_of_items";
+
+ $res = Database::query($sql, __FILE__, __LINE__);
+ while ($row_course = Database::fetch_row($res)) {
+
+ $course_code = $row_course[0];
+ $course_info = api_get_course_info($course_code);
+ $avg_assignments_in_course = $avg_messages_in_course = $nb_students_in_course = $avg_progress_in_course = $avg_score_in_course = $avg_time_spent_in_course = $avg_score_in_exercise = 0;
+ $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $course_info['dbName']);
+ $tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST, $course_info['dbName']);
+ $tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW, $course_info['dbName']);
+ $tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN, $course_info['dbName']);
+
+ // students directly subscribed to the course
+ $sql = "SELECT user_id FROM $tbl_course_user as course_rel_user WHERE course_rel_user.status='5' AND course_rel_user.course_code='$course_code'
+ UNION DISTINCT SELECT id_user as user_id FROM $tbl_session_course_user srcu WHERE srcu. course_code='$course_code'";
+ $rs = Database::query($sql, __FILE__, __LINE__);
+ $users = array();
+ while ($row = Database::fetch_array($rs)) {
+ $users[] = $row['user_id'];
+ }
+ if (count($users) > 0) {
+ $nb_students_in_course = count($users);
+ $avg_assignments_in_course = Tracking::count_student_assignments($users, $course_code);
+ $avg_messages_in_course = Tracking::count_student_messages($users, $course_code);
+ $avg_time_spent_in_course = Tracking::get_time_spent_on_the_course($users, $course_code);
+ $avg_progress_in_course = Tracking::get_avg_student_progress($users, $course_code);
+ $avg_score_in_course = Tracking :: get_avg_student_score($users, $course_code);
+ $avg_score_in_exercise = Tracking::get_avg_student_exercise_score($users, $course_code);
+
+ $avg_time_spent_in_course = api_time_to_hms($avg_time_spent_in_course / $nb_students_in_course);
+ $avg_progress_in_course = round($avg_progress_in_course / $nb_students_in_course, 2);
+ $avg_score_in_course = round($avg_score_in_course / $nb_students_in_course, 2);
+ $avg_score_in_exercise = round($avg_score_in_exercise / $nb_students_in_course, 2);
+ } else {
+ $avg_time_spent_in_course = null;
+ $avg_progress_in_course = null;
+ $avg_score_in_course = null;
+ $avg_score_in_exercise = null;
+ $avg_messages_in_course = null;
+ $avg_assignments_in_course = null;
+ }
+ $table_row = array();
+ $table_row[] = $row_course[1];
+ $table_row[] = $nb_students_in_course;
+ $table_row[] = $avg_time_spent_in_course;
+ $table_row[] = is_null($avg_progress_in_course) ? '' : $avg_progress_in_course.'%';
+ $table_row[] = is_null($avg_score_in_course) ? '' : $avg_score_in_course.'%';
+ $table_row[] = is_null($avg_score_in_exercise) ? '' : $avg_score_in_exercise.'%';
+ $table_row[] = $avg_messages_in_course;
+ $table_row[] = $avg_assignments_in_course;
+ //set the "from" value to know if I access the Reporting by the Dokeos tab or the course link
+ $table_row[] = '
';
+ $csv_content[] = array(
+ api_html_entity_decode($row_course[1], ENT_QUOTES, $charset),
+ $nb_students_in_course,
+ $avg_time_spent_in_course,
+ is_null($avg_progress_in_course) ? null : $avg_progress_in_course.'%',
+ is_null($avg_score_in_course) ? null : $avg_score_in_course.'%',
+ is_null($avg_score_in_exercise) ? null : $avg_score_in_exercise.'%',
+ $avg_messages_in_course,
+ $avg_assignments_in_course,
+ );
+ $course_data[] = $table_row;
+ }
+ return $course_data;
+}
\ No newline at end of file
diff --git a/main/newscorm/learnpath.class.php b/main/newscorm/learnpath.class.php
index 2c059279f5..e199209f94 100644
--- a/main/newscorm/learnpath.class.php
+++ b/main/newscorm/learnpath.class.php
@@ -1786,9 +1786,9 @@ class learnpath {
'
' . "\n" .
- '
' . "\n" .
+ '
' . "\n" .
- '
' . "\n" .
+ '
' . "\n" .
//'
'."\n" .
@@ -1814,9 +1814,9 @@ class learnpath {
'
' . "\n" .
- '
' . "\n" .
+ '
' . "\n" .
- '
' . "\n" .
+ '
' . "\n" .
// '
'."\n" .
@@ -2648,6 +2648,28 @@ class learnpath {
}
return $toc;
}
+ /**
+ * Generate and return the table of contents for this learnpath. The JS
+ * table returned is used inside of scorm_api.php
+ * @return string A JS array vairiable construction
+ */
+ function get_items_details_as_js($varname='olms.lms_item_types') {
+ if ($this->debug > 0) {
+ error_log('New LP - In learnpath::get_items_details_as_js()', 0);
+ }
+ $toc = $varname.' = new Array();';
+ //echo "".print_r($this->items,true)."
";
+ foreach ($this->ordered_items as $item_id) {
+ if ($this->debug > 2) {
+ error_log('New LP - learnpath::get_items_details_as_js(): getting info for item ' . $item_id, 0);
+ }
+ $toc.= $varname."['i$item_id'] = '".$this->items[$item_id]->get_type()."';";
+ }
+ if ($this->debug > 2) {
+ error_log('New LP - In learnpath::get_items_details_as_js() - TOC array: ' . print_r($toc, true), 0);
+ }
+ return $toc;
+ }
/**
* Gets the learning path type
* @param boolean Return the name? If false, return the ID. Default is false.
@@ -2714,70 +2736,6 @@ class learnpath {
}
return $list;
}
- /**
- * Uses the table generated by get_toc() and returns an HTML-formatted string ready to display
- * @return string HTML TOC ready to display
- */
- /*function get_html_toc()
- {
- if($this->debug>0){error_log('New LP - In learnpath::get_html_toc()',0);}
- $list = $this->get_toc();
- //echo $this->current;
- //$parent = $this->items[$this->current]->get_parent();
- //if(empty($parent)){$parent = $this->ordered_items[$this->items[$this->current]->get_previous_index()];}
- $html = ''."\n" ;
- // " onchange=\"javascript:document.getElementById('toc_$parent').focus();\">\n";
- require_once('resourcelinker.inc.php');
-
- //temp variables
- $mycurrentitemid = $this->get_current_item_id();
-
- foreach($list as $item)
- {
- if($this->debug>2){error_log('New LP - learnpath::get_html_toc(): using item '.$item['id'],0);}
- //TODO complete this
- $icon_name = array('not attempted' => '../img/notattempted.gif',
- 'incomplete' => '../img/incomplete.gif',
- 'failed' => '../img/failed.gif',
- 'completed' => '../img/completed.gif',
- 'passed' => '../img/passed.gif',
- 'succeeded' => '../img/succeeded.gif',
- 'browsed' => '../img/completed.gif');
-
- $style = 'scorm_item';
- if($item['id'] == $this->current){
- $style = 'scorm_item_highlight';
- }
- //the anchor will let us center the TOC on the currently viewed item &^D
- $html .= '
' .
- '
!['.substr($item['status'],0,1).']('.$icon_name[$item['status']].')
';
-
- //$title = htmlspecialchars($item['title'],ENT_QUOTES,$this->encoding);
- $title = $item['title'];
- if(empty($title)){
- $title = rl_get_resource_name(api_get_course_id(),$this->get_id(),$item['id']);
- $title = htmlspecialchars($title,ENT_QUOTES,$this->encoding);
- }
- if(empty($title))$title = '-';
-
- if($item['type']!='dokeos_chapter' and $item['type']!='dir'){
- //$html .= "
".$title."" ;
- $url = $this->get_link('http',$item['id']);
- //$html .= '
'.$title.'' ;
- //$html .= '
'.$title.'' ;
- $html .= '
'.$title.'' ;
- }else{
- $html .= $title;
- }
- $html .= "
\n";
- }
- $html .= "
\n";
- return $html;
- }*/
-
/**
* Uses the table generated by get_toc() and returns an HTML-formatted string ready to display
* @return string HTML TOC ready to display
@@ -2880,7 +2838,7 @@ class learnpath {
//$html .= ''.$title.'' ;
//
background:#aaa;
- $html .= '' . stripslashes($title) . '';
diff --git a/main/newscorm/lp_ajax_initialize.php b/main/newscorm/lp_ajax_initialize.php
new file mode 100644
index 0000000000..d7b1bbb0dc
--- /dev/null
+++ b/main/newscorm/lp_ajax_initialize.php
@@ -0,0 +1,173 @@
+
+ */
+/**
+ * Script
+ */
+//flag to allow for anonymous user - needs to be set before global.inc.php
+$use_anonymous = true;
+// name of the language file that needs to be included
+$language_file[] = 'learnpath';
+require_once('back_compat.inc.php');
+/**
+ * Get one item's details
+ * @param integer LP ID
+ * @param integer user ID
+ * @param integer View ID
+ * @param integer Current item ID
+ * @param integer New item ID
+ */
+function initialize_item($lp_id,$user_id,$view_id,$next_item)
+{
+ $debug=0;
+ $return = '';
+ if($debug>0){error_log('In initialize_item('.$lp_id.','.$user_id.','.$view_id.','.$next_item.')',0);}
+ //$objResponse = new xajaxResponse();
+ /*$item_id may be one of:
+ * -'next'
+ * -'previous'
+ * -'first'
+ * -'last'
+ * - a real item ID
+ */
+ require_once('learnpath.class.php');
+ require_once('scorm.class.php');
+ require_once('aicc.class.php');
+ require_once('learnpathItem.class.php');
+ require_once('scormItem.class.php');
+ require_once('aiccItem.class.php');
+ $mylp = '';
+ if (isset($_SESSION['lpobject'])) {
+ if ($debug>1) {error_log('////$_SESSION[lpobject] is set',0);}
+ $oLP =& unserialize($_SESSION['lpobject']);
+ if (!is_object($oLP)) {
+ if($debug>1){error_log(print_r($oLP,true),0);}
+ if($debug>2){error_log('////Building new lp',0);}
+ unset($oLP);
+ $code = api_get_course_id();
+ $mylp = & new learnpath($code,$lp_id,$user_id);
+ } else {
+ if($debug>1){error_log('////Reusing session lp',0);}
+ $mylp = & $oLP;
+ }
+ }
+ $mylp->set_current_item($next_item);
+ if ($debug>1) {error_log('In {default} - item is '.$new_item_id,0);}
+ $mylp->start_current_item(true);
+ /*
+ if ($mylp->force_commit) {
+ $mylp->save_current();
+ }
+ */
+ //$objResponse->addAlert(api_get_path(REL_CODE_PATH).'newscorm/learnpathItem.class.php');
+ if (is_object($mylp->items[$next_item])) {
+ $mylpi = & $mylp->items[$next_item];
+ } else {
+ if($debug>1){error_log('In switch_item_details - generating new item object',0);}
+ $mylpi =& new learnpathItem($next_item,$user_id);
+ $mylpi->set_lp_view($view_id);
+ }
+ /*
+ * now get what's needed by the SCORM API:
+ * -score
+ * -max
+ * -min
+ * -lesson_status
+ * -session_time
+ * -suspend_data
+ */
+ $myscore = $mylpi->get_score();
+ $mymax = $mylpi->get_max();
+ if($mymax===''){$mymax="''";}
+ $mymin = $mylpi->get_min();
+ $mylesson_status = $mylpi->get_status();
+ $mylesson_location = $mylpi->get_lesson_location();
+ $mytotal_time = $mylpi->get_scorm_time('js');
+ $mymastery_score = $mylpi->get_mastery_score();
+ $mymax_time_allowed = $mylpi->get_max_time_allowed();
+ $mylaunch_data = $mylpi->get_launch_data();
+ $mysession_time = $mylpi->get_total_time();
+ $mysuspend_data = $mylpi->get_suspend_data();
+ $mylesson_location = $mylpi->get_lesson_location();
+ $myic = $mylpi->get_interactions_count();
+ $myistring = '';
+ for ($i=0;$i<$myic;$i++) {
+ $myistring .= ",[".$i.",'','','','','','','']";
+ }
+ if (!empty($myistring)) {
+ $myistring = substr($myistring,1);
+ }
+ $return .=
+ "olms.score=".$myscore.";" .
+ "olms.max=".$mymax.";" .
+ "olms.min=".$mymin.";" .
+ "olms.lesson_status='".$mylesson_status."';" .
+ "olms.lesson_location='".$mylesson_location."';" .
+ "olms.session_time='".$mysession_time."';" .
+ "olms.suspend_data='".$mysuspend_data."';" .
+ "olms.total_time = '".$mytotal_time."';" .
+ "olms.mastery_score = '".$mymastery_score."';" .
+ "olms.max_time_allowed = '".$mymax_time_allowed."';" .
+ "olms.launch_data = '".$mylaunch_data."';" .
+ "olms.interactions = new Array(".$myistring.");" .
+ "olms.item_objectives = new Array();" .
+ "olms.G_lastError = 0;" .
+ "olms.G_LastErrorMessage = 'No error';" ;
+ /*
+ * and re-initialise the rest (proper to the LMS)
+ * -lms_lp_id
+ * -lms_item_id
+ * -lms_old_item_id
+ * -lms_new_item_id
+ * -lms_initialized
+ * -lms_progress_bar_mode
+ * -lms_view_id
+ * -lms_user_id
+ */
+ $mytotal = $mylp->get_total_items_count_without_chapters();
+ $mycomplete = $mylp->get_complete_items_count();
+ $myprogress_mode = $mylp->get_progress_bar_mode();
+ $myprogress_mode = ($myprogress_mode==''?'%':$myprogress_mode);
+ $mynext = $mylp->get_next_item_id();
+ $myprevious = $mylp->get_previous_item_id();
+ $myitemtype = $mylpi->get_type();
+ $mylesson_mode = $mylpi->get_lesson_mode();
+ $mycredit = $mylpi->get_credit();
+ $mylaunch_data = $mylpi->get_launch_data();
+ $myinteractions_count = $mylpi->get_interactions_count();
+ $myobjectives_count = $mylpi->get_objectives_count();
+ $mycore_exit = $mylpi->get_core_exit();
+
+ $return .=
+ "olms.lms_lp_id=".$lp_id.";" .
+ "olms.lms_item_id=".$next_item.";" .
+ "olms.lms_old_item_id=0;" .
+ "olms.lms_initialized=0;" .
+ "olms.lms_view_id=".$view_id.";" .
+ "olms.lms_user_id=".$user_id.";" .
+ "olms.next_item=".$next_item.";" . //this one is very important to replace possible literal strings
+ "olms.lms_next_item=".$mynext.";" .
+ "olms.lms_previous_item=".$myprevious.";" .
+ "olms.lms_item_type = '".$myitemtype."';" .
+ "olms.lms_item_credit = '".$mycredit."';" .
+ "olms.lms_item_lesson_mode = '".$mylesson_mode."';" .
+ "olms.lms_item_launch_data = '".$mylaunch_data."';" .
+ "olms.lms_item_interactions_count = '".$myinteractions_count."';" .
+ "olms.lms_item_objectives_count = '".$myinteractions_count."';" .
+ "olms.lms_item_core_exit = '".$mycore_exit."';" .
+ "olms.asset_timer = 0;";
+
+ $mylp->set_error_msg('');
+ $mylp->prerequisites_match(); //check the prerequisites are all complete
+ if($debug>1){error_log('Prereq_match() returned '.htmlentities($mylp->error),0);}
+ //$_SESSION['scorm_item_id'] = $new_item_id;//Save the new item ID for the exercise tool to use
+ //$_SESSION['lpobject'] = serialize($mylp);
+ return $return;
+}
+echo initialize_item($_POST['lid'],$_POST['uid'],$_POST['vid'],$_POST['iid']);
\ No newline at end of file
diff --git a/main/newscorm/lp_ajax_save_item.php b/main/newscorm/lp_ajax_save_item.php
index 22ca9c1007..58b6b4ff04 100755
--- a/main/newscorm/lp_ajax_save_item.php
+++ b/main/newscorm/lp_ajax_save_item.php
@@ -141,7 +141,7 @@ function save_item($lp_id,$user_id,$view_id,$item_id,$score=-1,$max=-1,$min=-1,$
if($mylpi->get_type()!='sco')
{ //if this object's JS status has not been updated by the SCORM API, update now
//$objResponse->addScript("lesson_status='".$mystatus."';");
- $return .= "lesson_status='".$mystatus."';";
+ $return .= "olms.lesson_status='".$mystatus."';";
}
//$objResponse->addScript("update_toc('".$mystatus."','".$item_id."');");
$return .= "update_toc('".$mystatus."','".$item_id."');";
diff --git a/main/newscorm/lp_ajax_start_timer.php b/main/newscorm/lp_ajax_start_timer.php
old mode 100755
new mode 100644
index 4a2dabca9c..d8ddb1c41a
--- a/main/newscorm/lp_ajax_start_timer.php
+++ b/main/newscorm/lp_ajax_start_timer.php
@@ -16,6 +16,6 @@ function start_timer()
$time = time();
//$objResponse->addScript("asset_timer='$time';asset_timer_total=0;");
//return $objResponse;
- return "asset_timer='$time';asset_timer_total=0;";
+ return "olms.asset_timer='$time';olms.asset_timer_total=0;";
}
echo start_timer();
\ No newline at end of file
diff --git a/main/newscorm/lp_ajax_switch_item.php b/main/newscorm/lp_ajax_switch_item.php
index 6326ad0290..9433c02026 100644
--- a/main/newscorm/lp_ajax_switch_item.php
+++ b/main/newscorm/lp_ajax_switch_item.php
@@ -140,35 +140,38 @@ function switch_item_details($lp_id,$user_id,$view_id,$current_item,$next_item)
if (!empty($myistring)) {
$myistring = substr($myistring,1);
}
- //$objResponse->addScript(
+ /*
+ * The following lines should reinitialize the values for the SCO
+ * However, due to many complications, we are now relying more on the
+ * LMSInitialize() call and its underlying lp_ajax_initialize.php call
+ * so this code is technically deprecated (but the change of item_id should
+ * remain). However, due to numerous technical issues with SCORM, we prefer
+ * leaving it as a double-lock security. If removing, please test carefully
+ * with both SCORM and dokeos learning path tracking.
+ */
$return .=
- "score=".$myscore.";" .
- "max=".$mymax.";" .
- "min=".$mymin.";" .
- "lesson_status='".$mylesson_status."';" .
- "lesson_location='".$mylesson_location."';" .
- "session_time='".$mysession_time."';" .
- "suspend_data='".$mysuspend_data."';" .
- "total_time = '".$mytotal_time."';" .
- "mastery_score = '".$mymastery_score."';" .
- "max_time_allowed = '".$mymax_time_allowed."';" .
- "launch_data = '".$mylaunch_data."';" .
- "interactions = new Array(".$myistring.");" .
- "item_objectives = new Array();" .
- "G_lastError = 0;" .
- "G_LastErrorMessage = 'No error';";
- //);
+ "olms.score=".$myscore.";" .
+ "olms.max=".$mymax.";" .
+ "olms.min=".$mymin.";" .
+ "olms.lesson_status='".$mylesson_status."';" .
+ "olms.lesson_location='".$mylesson_location."';" .
+ "olms.session_time='".$mysession_time."';" .
+ "olms.suspend_data='".$mysuspend_data."';" .
+ "olms.total_time = '".$mytotal_time."';" .
+ "olms.mastery_score = '".$mymastery_score."';" .
+ "olms.max_time_allowed = '".$mymax_time_allowed."';" .
+ "olms.launch_data = '".$mylaunch_data."';" .
+ "olms.interactions = new Array(".$myistring.");" .
+ "olms.item_objectives = new Array();" .
+ "olms.G_lastError = 0;" .
+ "olms.G_LastErrorMessage = 'No error';" ;
/*
* and re-initialise the rest
- * -saved_lesson_status = 'not attempted'
* -lms_lp_id
* -lms_item_id
* -lms_old_item_id
* -lms_new_item_id
- * -lms_been_synchronized
* -lms_initialized
- * -lms_total_lessons
- * -lms_complete_lessons
* -lms_progress_bar_mode
* -lms_view_id
* -lms_user_id
@@ -187,48 +190,41 @@ function switch_item_details($lp_id,$user_id,$view_id,$current_item,$next_item)
$myobjectives_count = $mylpi->get_objectives_count();
$mycore_exit = $mylpi->get_core_exit();
- //$objResponse->addScript(
$return .=
- "saved_lesson_status='not attempted';" .
- "lms_lp_id=".$lp_id.";" .
- "lms_item_id=".$new_item_id.";" .
- "lms_old_item_id=0;" .
- "lms_been_synchronized=0;" .
- "lms_initialized=0;" .
- "lms_total_lessons=".$mytotal.";" .
- "lms_complete_lessons=".$mycomplete.";" .
- "lms_progress_bar_mod='".$myprogress_mode."';" .
- "lms_view_id=".$view_id.";" .
- "lms_user_id=".$user_id.";" .
- "next_item=".$new_item_id.";" . //this one is very important to replace possible literal strings
- "lms_next_item=".$mynext.";" .
- "lms_previous_item=".$myprevious.";" .
- "lms_item_type = '".$myitemtype."';" .
- "lms_item_credit = '".$mycredit."';" .
- "lms_item_lesson_mode = '".$mylesson_mode."';" .
- "lms_item_launch_data = '".$mylaunch_data."';" .
- "lms_item_interactions_count = '".$myinteractions_count."';" .
- "lms_item_objectives_count = '".$myinteractions_count."';" .
- "lms_item_core_exit = '".$mycore_exit."';" .
- "asset_timer = 0;";
+ //"saved_lesson_status='not attempted';" .
+ "olms.lms_lp_id=".$lp_id.";" .
+ "olms.lms_item_id=".$new_item_id.";" .
+ "olms.lms_old_item_id=0;" .
+ //"lms_been_synchronized=0;" .
+ "olms.lms_initialized=0;" .
+ //"lms_total_lessons=".$mytotal.";" .
+ //"lms_complete_lessons=".$mycomplete.";" .
+ //"lms_progress_bar_mode='".$myprogress_mode."';" .
+ "olms.lms_view_id=".$view_id.";" .
+ "olms.lms_user_id=".$user_id.";" .
+ "olms.next_item=".$new_item_id.";" . //this one is very important to replace possible literal strings
+ "olms.lms_next_item=".$mynext.";" .
+ "olms.lms_previous_item=".$myprevious.";" .
+ "olms.lms_item_type = '".$myitemtype."';" .
+ "olms.lms_item_credit = '".$mycredit."';" .
+ "olms.lms_item_lesson_mode = '".$mylesson_mode."';" .
+ "olms.lms_item_launch_data = '".$mylaunch_data."';" .
+ "olms.lms_item_interactions_count = '".$myinteractions_count."';" .
+ "olms.lms_item_objectives_count = '".$myinteractions_count."';" .
+ "olms.lms_item_core_exit = '".$mycore_exit."';" .
+ "olms.asset_timer = 0;";
//);
- //$objResponse->addScript("update_toc('unhighlight','".$current_item."');");
- //$objResponse->addScript("update_toc('highlight','".$new_item_id."');");
- //$objResponse->addScript("update_toc('$mylesson_status','".$new_item_id."');");
- //$objResponse->addScript("update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');");
$return .= "update_toc('unhighlight','".$current_item."');".
- "update_toc('highlight','".$new_item_id."');".
- "update_toc('$mylesson_status','".$new_item_id."');".
- "update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');";
+ "update_toc('highlight','".$new_item_id."');".
+ "update_toc('$mylesson_status','".$new_item_id."');".
+ "update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');";
$mylp->set_error_msg('');
$mylp->prerequisites_match(); //check the prerequisites are all complete
if($debug>1){error_log('Prereq_match() returned '.htmlentities($mylp->error),0);}
- //$objResponse->addScript("update_message_frame('".str_replace("'","\'",htmlentities($mylp->error))."');");
- $return .= "update_message_frame('".str_replace("'","\'",api_htmlentities($mylp->error, ENT_QUOTES, api_get_system_encoding()))."');";
$_SESSION['scorm_item_id'] = $new_item_id;//Save the new item ID for the exercise tool to use
$_SESSION['lpobject'] = serialize($mylp);
return $return;
//return $objResponse;
}
-echo switch_item_details($_GET['lid'],$_GET['uid'],$_GET['vid'],$_GET['iid'],$_GET['next']);
+echo switch_item_details($_POST['lid'],$_POST['uid'],$_POST['vid'],$_POST['iid'],$_POST['next']);
\ No newline at end of file
diff --git a/main/newscorm/lp_ajax_switch_item_toc.php b/main/newscorm/lp_ajax_switch_item_toc.php
new file mode 100644
index 0000000000..2f22ee076c
--- /dev/null
+++ b/main/newscorm/lp_ajax_switch_item_toc.php
@@ -0,0 +1,186 @@
+
+ */
+/**
+ * Script
+ */
+//flag to allow for anonymous user - needs to be set before global.inc.php
+$use_anonymous = true;
+// name of the language file that needs to be included
+$language_file[] = 'learnpath';
+require_once('back_compat.inc.php');
+/**
+ * Get one item's details
+ * @param integer LP ID
+ * @param integer user ID
+ * @param integer View ID
+ * @param integer Current item ID
+ * @param integer New item ID
+ */
+function switch_item_toc($lp_id,$user_id,$view_id,$current_item,$next_item)
+{
+ $debug=0;
+ $return = '';
+ if($debug>0){error_log('In xajax_switch_item_toc('.$lp_id.','.$user_id.','.$view_id.','.$current_item.','.$next_item.')',0);}
+ require_once('learnpath.class.php');
+ require_once('scorm.class.php');
+ require_once('aicc.class.php');
+ require_once('learnpathItem.class.php');
+ require_once('scormItem.class.php');
+ require_once('aiccItem.class.php');
+ $mylp = '';
+ if(isset($_SESSION['lpobject']))
+ {
+ if($debug>1){error_log('////$_SESSION[lpobject] is set',0);}
+ $oLP =& unserialize($_SESSION['lpobject']);
+ if(!is_object($oLP)){
+ if($debug>1){error_log(print_r($oLP,true),0);}
+ if($debug>2){error_log('////Building new lp',0);}
+ unset($oLP);
+ $code = api_get_course_id();
+ $mylp = & new learnpath($code,$lp_id,$user_id);
+ }else{
+ if($debug>1){error_log('////Reusing session lp',0);}
+ $mylp = & $oLP;
+ }
+ }
+ $new_item_id = 0;
+ switch($next_item){
+ case 'next':
+ $mylp->set_current_item($current_item);
+ $mylp->next();
+ $new_item_id = $mylp->get_current_item_id();
+ if($debug>1){error_log('In {next} - next item is '.$new_item_id.'(current: '.$current_item.')',0);}
+ break;
+ case 'previous':
+ $mylp->set_current_item($current_item);
+ $mylp->previous();
+ $new_item_id = $mylp->get_current_item_id();
+ if($debug>1){error_log('In {previous} - next item is '.$new_item_id.'(current: '.$current_item.')',0);}
+ break;
+ case 'first':
+ $mylp->set_current_item($current_item);
+ $mylp->first();
+ $new_item_id = $mylp->get_current_item_id();
+ if($debug>1){error_log('In {first} - next item is '.$new_item_id.'(current: '.$current_item.')',0);}
+ break;
+ case 'last':
+ break;
+ default:
+ //should be filtered to check it's not hacked
+ if($next_item == $current_item){
+ //if we're opening the same item again
+ $mylp->items[$current_item]->restart();
+ }
+ $new_item_id = $next_item;
+ $mylp->set_current_item($new_item_id);
+ if($debug>1){error_log('In {default} - next item is '.$new_item_id.'(current: '.$current_item.')',0);}
+ break;
+ }
+ $mylp->start_current_item(true);
+ if($mylp->force_commit){
+ $mylp->save_current();
+ }
+ //$objResponse->addAlert(api_get_path(REL_CODE_PATH).'newscorm/learnpathItem.class.php');
+ if(is_object($mylp->items[$new_item_id])){
+ $mylpi = & $mylp->items[$new_item_id];
+ }else{
+ if($debug>1){error_log('In switch_item_details - generating new item object',0);}
+ $mylpi =& new learnpathItem($new_item_id,$user_id);
+ $mylpi->set_lp_view($view_id);
+ }
+ /*
+ * now get what's needed by the SCORM API:
+ * -score
+ * -max
+ * -min
+ * -lesson_status
+ * -session_time
+ * -suspend_data
+ */
+ $myscore = $mylpi->get_score();
+ $mymax = $mylpi->get_max();
+ if($mymax===''){$mymax="''";}
+ $mymin = $mylpi->get_min();
+ $mylesson_status = $mylpi->get_status();
+ $mylesson_location = $mylpi->get_lesson_location();
+ $mytotal_time = $mylpi->get_scorm_time('js');
+ $mymastery_score = $mylpi->get_mastery_score();
+ $mymax_time_allowed = $mylpi->get_max_time_allowed();
+ $mylaunch_data = $mylpi->get_launch_data();
+ /*
+ if($mylpi->get_type() == 'asset'){
+ //temporary measure to save completion of an asset. Later on, Dokeos should trigger something on unload, maybe... (even though that would mean the last item cannot be completed)
+ $mylesson_status = 'completed';
+ $mylpi->set_status('completed');
+ $mylpi->save();
+ }
+ */
+ $mysession_time = $mylpi->get_total_time();
+ $mysuspend_data = $mylpi->get_suspend_data();
+ $mylesson_location = $mylpi->get_lesson_location();
+ $myic = $mylpi->get_interactions_count();
+ $myistring = '';
+ for ($i=0;$i<$myic;$i++) {
+ $myistring .= ",[".$i.",'','','','','','','']";
+ }
+ if (!empty($myistring)) {
+ $myistring = substr($myistring,1);
+ }
+ $mytotal = $mylp->get_total_items_count_without_chapters();
+ $mycomplete = $mylp->get_complete_items_count();
+ $myprogress_mode = $mylp->get_progress_bar_mode();
+ $myprogress_mode = ($myprogress_mode==''?'%':$myprogress_mode);
+ $mynext = $mylp->get_next_item_id();
+ $myprevious = $mylp->get_previous_item_id();
+ $myitemtype = $mylpi->get_type();
+ $mylesson_mode = $mylpi->get_lesson_mode();
+ $mycredit = $mylpi->get_credit();
+ $mylaunch_data = $mylpi->get_launch_data();
+ $myinteractions_count = $mylpi->get_interactions_count();
+ $myobjectives_count = $mylpi->get_objectives_count();
+ $mycore_exit = $mylpi->get_core_exit();
+
+ $return .=
+ //"saved_lesson_status='not attempted';" .
+ "olms.lms_lp_id=".$lp_id.";" .
+ "olms.lms_item_id=".$new_item_id.";" .
+ "olms.lms_old_item_id=0;" .
+ //"lms_been_synchronized=0;" .
+ "olms.lms_initialized=0;" .
+ //"lms_total_lessons=".$mytotal.";" .
+ //"lms_complete_lessons=".$mycomplete.";" .
+ //"lms_progress_bar_mode='".$myprogress_mode."';" .
+ "olms.lms_view_id=".$view_id.";" .
+ "olms.lms_user_id=".$user_id.";" .
+ "olms.next_item=".$new_item_id.";" . //this one is very important to replace possible literal strings
+ "olms.lms_next_item=".$mynext.";" .
+ "olms.lms_previous_item=".$myprevious.";" .
+ "olms.lms_item_type = '".$myitemtype."';" .
+ "olms.lms_item_credit = '".$mycredit."';" .
+ "olms.lms_item_lesson_mode = '".$mylesson_mode."';" .
+ "olms.lms_item_launch_data = '".$mylaunch_data."';" .
+ "olms.lms_item_interactions_count = '".$myinteractions_count."';" .
+ "olms.lms_item_objectives_count = '".$myinteractions_count."';" .
+ "olms.lms_item_core_exit = '".$mycore_exit."';" .
+ "olms.asset_timer = 0;";
+ //);
+ $return .= "update_toc('unhighlight','".$current_item."');".
+ "update_toc('highlight','".$new_item_id."');".
+ "update_toc('$mylesson_status','".$new_item_id."');".
+ "update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');";
+
+ $mylp->set_error_msg('');
+ $mylp->prerequisites_match(); //check the prerequisites are all complete
+ if($debug>1){error_log('Prereq_match() returned '.htmlentities($mylp->error),0);}
+ $_SESSION['scorm_item_id'] = $new_item_id;//Save the new item ID for the exercise tool to use
+ $_SESSION['lpobject'] = serialize($mylp);
+ return $return;
+ //return $objResponse;
+ }
+echo switch_item_toc($_POST['lid'],$_POST['uid'],$_POST['vid'],$_POST['iid'],$_POST['next']);
\ No newline at end of file
diff --git a/main/newscorm/lp_view.php b/main/newscorm/lp_view.php
index 1e672ac228..9fd484ba5c 100644
--- a/main/newscorm/lp_view.php
+++ b/main/newscorm/lp_view.php
@@ -71,16 +71,14 @@ $my_style=$platform_theme;
Header
-----------------------------------------------------------
*/
-//$htmlHeadXtra[] = '';
-//$htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/')."\n";
$htmlHeadXtra[] = ''; //jQuery
-$htmlHeadXtra[] = '';
$htmlHeadXtra[] = '
-
+ initialLeftZoneHeight = document.getElementById('learning_path_toc').offsetHeight;
+ initialRightZoneHeight = document.getElementById('learning_path_right_zone').offsetHeight;
+ docHeight = document.body.clientHeight;
+ leftZoneHeightOccupied = docHeight - initialLeftZoneHeight;
+ rightZoneHeightOccupied = docHeight - initialRightZoneHeight;
+ document.body.style.overflow = 'hidden';
+ updateContentHeight();
+}
+window.onresize = updateContentHeight;
+-->
+
+