skala
Juan Carlos Raña 16 years ago
commit 463208119e
  1. 1
      dokeos_license.txt
  2. 492
      main/inc/lib/tracking.lib.php
  3. 213
      main/mySpace/index.php
  4. 96
      main/newscorm/learnpath.class.php
  5. 173
      main/newscorm/lp_ajax_initialize.php
  6. 2
      main/newscorm/lp_ajax_save_item.php
  7. 2
      main/newscorm/lp_ajax_start_timer.php
  8. 104
      main/newscorm/lp_ajax_switch_item.php
  9. 186
      main/newscorm/lp_ajax_switch_item_toc.php
  10. 477
      main/newscorm/lp_view.php
  11. 1526
      main/newscorm/scorm_api.php
  12. 203
      main/tracking/courseLog.php

@ -7,6 +7,7 @@
Copyright (c) 2001 Universite catholique de Louvain (UCL) Copyright (c) 2001 Universite catholique de Louvain (UCL)
Copyright (c) 2003-2008 Vrije Universiteit Brussel (VUB) Copyright (c) 2003-2008 Vrije Universiteit Brussel (VUB)
Copyright (c) 2004-2008 Hoogeschool Gent (HoGent) 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 For a full list of contributors detaining copyrights over parts of
the Dokeos software, see "documentation/credits.html". the Dokeos software, see "documentation/credits.html".
The full license can be read in "documentation/license.html". The full license can be read in "documentation/license.html".

@ -92,31 +92,20 @@ class Tracking {
function get_time_spent_on_the_course($user_id, $course_code) { function get_time_spent_on_the_course($user_id, $course_code) {
// protect datas // protect datas
$user_id = intval($user_id); $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); $tbl_track_course = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$condition_user = "";
$sql = 'SELECT login_course_date, logout_course_date FROM ' . $tbl_track_course . ' if (is_array($user_id)) {
WHERE user_id = ' . $user_id . ' $condition_user = " AND user_id IN (".implode(',',$user_id).") ";
AND course_code="' . $course_code . '"'; } 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__); $rs = Database::query($sql,__FILE__,__LINE__);
$row = Database::fetch_array($rs);
$nb_seconds = 0; return $row['nb_seconds'];
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;
} }
function get_first_connection_date($student_id) { 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 * 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 * @param string $course_code - Course id
* @return string value (number %) Which represents a round integer about the score average. * @return string value (number %) Which represents a round integer about the score average.
*/ */
function get_avg_student_exercise_score($student_id, $course_code) { function get_avg_student_exercise_score($student_id, $course_code) {
// protect datas // protect datas
$student_id = Database::escape_string($student_id);
$course_code = Database::escape_string($course_code); $course_code = Database::escape_string($course_code);
// get the informations of the course // get the informations of the course
$a_course = CourseManager :: get_course_information($course_code); $a_course = CourseManager :: get_course_information($course_code);
if(!empty($a_course['db_name'])) {
if(!empty($a_course['db_name']))
{
// table definition // table definition
$tbl_course_quiz = Database::get_course_table(TABLE_QUIZ_TEST,$a_course['db_name']); $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); $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__));
//get the list of exercises $quiz_avg_total_score = 0;
$sql = "SELECT id, title FROM $tbl_course_quiz WHERE active <> -1"; if (!empty($count_quiz[0]) && !empty($student_id)) {
$rs = Database::query($sql, __FILE__, __LINE__); $condition_user = "";
$count_exe = Database::num_rows($rs); if (is_array($student_id)) {
$condition_user = " AND exe_user_id IN (".implode(',',$student_id).") ";
if ($count_exe > 0) { } else {
$quiz_avg_total_score = 0; $condition_user = " AND exe_user_id = '$student_id' ";
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;
} }
return $quiz_avg_total_score/$count_exe; $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)
else $condition_user
{ AND orig_lp_id = 0
return null; 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) {
function get_avg_student_progress($student_id, $course_code) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
// protect datas // protect datas
$student_id = intval($student_id);
$course_code = addslashes($course_code); $course_code = addslashes($course_code);
// get the informations of the course // get the informations of the course
$a_course = CourseManager :: get_course_information($course_code); $a_course = CourseManager :: get_course_information($course_code);
if (!empty($a_course['db_name'])) {
if(!empty($a_course['db_name']))
{
// table definition // table definition
$tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW, $a_course['db_name']); $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 = Database :: get_course_table(TABLE_LP_MAIN, $a_course['db_name']);
$tbl_course_lp_item = Database :: get_course_table(TABLE_LP_ITEM, $a_course['db_name']); $count_lp = Database::fetch_row(Database::query("SELECT count(id) FROM $tbl_course_lp",__FILE__,__LINE__));
$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);
$avg_progress = 0; $avg_progress = 0;
if (!empty($count_lp[0]) && !empty($student_id)) {
if ($nb_lp > 0) { $condition_user = "";
while ($lp = Database :: fetch_array($rs)) { if (is_array($student_id)) {
// get the progress in learning pathes $condition_user = " lp_view.user_id IN (".implode(',',$student_id).") AND ";
$sqlProgress = "SELECT progress } else {
FROM " . $tbl_course_lp_view . " AS lp_view $condition_user = " lp_view.user_id = '$student_id' AND ";
WHERE lp_view.user_id = " . $student_id . " }
AND lp_view.lp_id = " . $lp['id'] . " $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__);
$resultItem = Database::query($sqlProgress, __FILE__, __LINE__); $rowItem = Database::fetch_row($resultItem);
if(Database::num_rows($resultItem)>0) $avg_progress = round($rowItem[0] / $count_lp[0], 1);
{ return $avg_progress;
$avg_progress += Database::result($resultItem, 0, 0); }
}
}
$avg_progress = round($avg_progress / $nb_lp, 1);
}
return $avg_progress;
}
else
{
return null;
} }
return null;
} }
/** /**
* This function gets: * 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. * 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_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
$tbl_stats_attempts= Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); $tbl_stats_attempts= Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$course = CourseManager :: get_course_information($course_code); $course = CourseManager :: get_course_information($course_code);
if (!empty($course['db_name'])) { if (!empty($course['db_name'])) {
$tbl_quiz_questions= Database :: get_course_table(TABLE_QUIZ_QUESTION,$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_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_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_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']); $lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW,$course['db_name']);
$sql_course_lp = 'SELECT id FROM '.$lp_table; $condition_lp = "";
if(count($lp_ids)!=0) { if(count($lp_ids) > 0) {
$sql_course_lp.=' WHERE id IN ('.implode(',',$lp_ids).')'; $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_score_total = 0;
$lp_scorm_weighting_total = 0; $lp_scorm_weighting_total = 0;
$lp_scorm_result_score_total = 0; $lp_scorm_result_score_total = 0;
$lp_scorm_loop=0; $lp_scorm_loop=0;
$lp_count = 0; $lp_count = 0;
$progress = 0; $progress = 0;
if(Database::num_rows($sql_result_lp)>0){ if (!empty($count_row_lp[0]) && !empty($student_id)) {
//Scorm test
while($a_learnpath = Database::fetch_array($sql_result_lp)) { $condition_user1 = "";
if (is_array($student_id)) {
//We get the last view id of this LP (with the higher id) $condition_user1 =" AND user_id IN (".implode(',',$student_id).") ";
$sql='SELECT max(id) as id FROM '.$lp_view_table.' } else {
WHERE lp_id='.$a_learnpath['id'].' AND user_id="'.intval($student_id).'"'; $condition_user1 =" AND user_id = '$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
$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";
if ($lp_view_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 // we get the progress
$sql='SELECT progress FROM '.$lp_view_table.' WHERE id="'.$lp_view_id.'"'; $sql='SELECT progress FROM '.$lp_view_table.' WHERE id="'.$lp_view_id.'"';
$rs = Database::query($sql, __FILE__, __LINE__); $rs = Database::query($sql, __FILE__, __LINE__);
$progress = Database::result($rs,0,'progress'); $progress = Database::result($rs,0,'progress');
// item's list of an scorm // item's list of an scorm
$sql_max_score='SELECT lp_iv.score as score,lp_i.max_score $sql_max_score='SELECT lp_iv.score as score,lp_i.max_score
FROM '.$lp_item_view_table.' as lp_iv FROM '.$lp_item_view_table.' as lp_iv
INNER JOIN '.$lp_item_table.' as lp_i INNER JOIN '.$lp_item_table.' as lp_i
ON lp_i.id = lp_iv.lp_item_id ON lp_i.id = lp_iv.lp_item_id
AND lp_i.item_type="sco" 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__); $res_max_score=Database::query($sql_max_score,__FILE__,__LINE__);
$count_total_loop=0; $count_total_loop=0;
$num_rows_max_score=Database::num_rows($res_max_score); $num_rows_max_score=Database::num_rows($res_max_score);
if ($num_rows_max_score==1) { if ($num_rows_max_score==1) {
while ($row_max_score=Database::fetch_array($res_max_score)) { 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) { 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. //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); $lp_scorm_result_score_total+=($row_max_score['score']/100);
$current_value = $row_max_score['score']/100; $current_value = $row_max_score['score']/100;
} else { } else {
$lp_scorm_result_score_total+=($row_max_score['score']/$row_max_score['max_score']); $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']; $current_value = $row_max_score['score']/$row_max_score['max_score'];
@ -443,10 +401,7 @@ class Tracking {
$count_total_loop++; $count_total_loop++;
} }
} elseif ($num_rows_max_score > 1) { } elseif ($num_rows_max_score > 1) {
//echo ' ---- <br>';
while ($row_max_score=Database::fetch_array($res_max_score)) { while ($row_max_score=Database::fetch_array($res_max_score)) {
//echo $row_max_score['score'].' - '.$row_max_score['max_score'];
//echo '<br>';
if ($row_max_score['max_score']==0) { if ($row_max_score['max_score']==0) {
$lp_scorm_result_score_total+=($row_max_score['score']/100); $lp_scorm_result_score_total+=($row_max_score['score']/100);
$current_value = $row_max_score['score']/100; $current_value = $row_max_score['score']/100;
@ -458,126 +413,90 @@ class Tracking {
$count_total_loop++; $count_total_loop++;
} }
} }
if ($num_rows_max_score > 0 && ($progress > 0 || $current_value > 0 )) { if ($num_rows_max_score > 0 && ($progress > 0 || $current_value > 0 )) {
$lp_count++; $lp_count++;
} }
if ($count_total_loop==0) { if ($count_total_loop==0) {
$count_total_loop=1; $count_total_loop=1;
} }
$score_of_scorm_calculate=round((($lp_scorm_result_score_total/$count_total_loop)*100),2); $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 ) { 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; $lp_scorm_score_total = $score_of_scorm_calculate;
//Quizz in a LP $condition_user2 = "";
while($a_learnpath = Database::fetch_array($sql_result_lp)) { if (is_array($student_id)) {
//we got the maxscore this is wrong $condition_user2 =" lp_view.user_id IN (".implode(',',$student_id).") AND ";
/* } else {
echo $sql = 'SELECT id as item_id, max_score $condition_user2 =" lp_view.user_id = '$student_id' AND ";
FROM '.$lp_item_table.' AS lp_item }
WHERE lp_id='.$a_learnpath['id'].'
AND item_type="quiz"'; //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
//Path is the exercise id INNER JOIN $lp_item_table lp_item ON lp_item.lp_id = lp_view.lp_id AND item_type='".TOOL_QUIZ."'
$sql = 'SELECT path, id as item_id, max_score WHERE $condition_user2 lp_view.lp_id IN (SELECT id FROM $lp_table $condition_lp)";;
FROM '.$lp_item_table.' AS lp_item
WHERE lp_id='.$a_learnpath['id'].' $rsItems = Database::query($sql, __FILE__, __LINE__);
AND item_type="quiz"';
$total_score = $total_weighting = 0;
$rsItems = Database::query($sql, __FILE__, __LINE__); if (Database::num_rows($rsItems) > 0) {
while ($item = Database::fetch_array($rsItems)) {
//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'])."'"; $lp_view_id = $item['lp_view_id'];
//$sql='SELECT max(id) as id FROM '.$lp_view_table.' WHERE lp_id='.$a_learnpath['id'].' AND user_id="'.intval($student_id).'"'; $lp_item_id = $item['item_id'];
$rs_last_lp_view_id = Database::query($sql, __FILE__, __LINE__); $lp_id = $item['lp_id'];
$lp_view_id = intval(Database::result($rs_last_lp_view_id,0,'id')); $user_id = $item['user_id'];
$total_score = $total_weighting = 0; // we take the score from a LP because we have lp_view_id
if ($lp_view_id!=0) { $sql = "SELECT score FROM $lp_item_view_table WHERE lp_item_id = '$lp_item_id' and lp_view_id = '$lp_view_id'
while ($item = Database :: fetch_array($rsItems, 'ASSOC')) { ORDER BY view_count DESC limit 1";
// we take the score from a LP because we have lp_view_id $rsScores = Database::query($sql, __FILE__, __LINE__);
$sql = "SELECT score FROM $lp_item_view_table WHERE lp_item_id = '".(int)$item['item_id']."' and lp_view_id = '".(int)$lp_view_id."' // Real max score - this was implemented because of the random exercises
ORDER BY view_count DESC limit 1"; $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';
/*$sql = 'SELECT score as student_score
FROM '.$lp_item_view_table.' as lp_view_item $resultLastAttempt = Database::query($sql_last_attempt, __FILE__, __LINE__);
WHERE lp_view_item.lp_item_id = '.$item['item_id'].' $num = Database :: num_rows($resultLastAttempt);
AND lp_view_id = "'.$lp_view_id.'" ';*/ if ($num > 0){
$rsScores = Database::query($sql, __FILE__, __LINE__); if ($num > 1){
while ($rowLA = Database :: fetch_row($resultLastAttempt)) {
// Real max score - this was implemented because of the random exercises $id_last_attempt = $rowLA[0];
$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);
} }
} 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 " . $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"; "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__); $result = Database::query($sql, __FILE__, __LINE__);
$row_max_score = Database :: fetch_array($result); $row_max_score = Database :: fetch_array($result);
$maxscore = $row_max_score['maxscore']; $maxscore = $row_max_score['maxscore'];
if ($maxscore=='') { if ($maxscore=='') {
$maxscore = $item['max_score']; $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 '<br>';
//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; $totalScore = $lp_scorm_score_total;
$pourcentageScore = 0; $pourcentageScore = 0;
if($lp_scorm_weighting_total>0) { if($lp_scorm_weighting_total>0) {
@ -589,11 +508,10 @@ class Tracking {
return $score_of_scorm_calculate; return $score_of_scorm_calculate;
} else { } else {
return null; return null;
} }
} else { }
return null;
}
} }
/** /**
* gets the list of students followed by coach * gets the list of students followed by coach
@ -619,7 +537,7 @@ class Tracking {
if ($_configuration['multiple_access_urls']==true) { if ($_configuration['multiple_access_urls']==true) {
$tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
$access_url_id = api_get_current_access_url_id(); $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 $sql = 'SELECT scu.id_session, scu.course_code
FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_session_rel_access_url.' sru FROM ' . $tbl_session_course_user . ' scu INNER JOIN '.$tbl_session_rel_access_url.' sru
ON (scu.id_session=sru.session_id) ON (scu.id_session=sru.session_id)
@ -974,56 +892,49 @@ class Tracking {
function count_student_assignments($student_id, $course_code) { function count_student_assignments($student_id, $course_code) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php'); require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
// protect datas // protect datas
$student_id = intval($student_id); $course_code = Database::escape_string($course_code);
$course_code = addslashes($course_code);
// get the informations of the course // get the informations of the course
$a_course = CourseManager :: get_course_information($course_code); $a_course = CourseManager :: get_course_information($course_code);
if (!empty($a_course['db_name'])) {
if(!empty($a_course['db_name']))
{
// table definition // table definition
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $a_course['db_name']); $tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $a_course['db_name']);
$sql = 'SELECT 1 $condition_user = "";
FROM ' . $tbl_item_property . ' if (is_array($student_id)) {
WHERE insert_user_id=' . $student_id . ' $condition_user = " AND insert_user_id IN (".implode(',',$student_id).") ";
AND tool="work"'; } 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__); $rs = Database::query($sql, __LINE__, __FILE__);
return Database::num_rows($rs); $row = Database::fetch_row($rs);
} return $row[0];
else
{
return null;
} }
return null;
} }
function count_student_messages($student_id, $course_code) { function count_student_messages($student_id, $course_code) {
require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php'); require_once (api_get_path(LIBRARY_PATH) . 'course.lib.php');
// protect datas // protect datas
$student_id = intval($student_id);
$course_code = addslashes($course_code); $course_code = addslashes($course_code);
// get the informations of the course // get the informations of the course
$a_course = CourseManager :: get_course_information($course_code); $a_course = CourseManager :: get_course_information($course_code);
if (!empty($a_course['db_name'])) {
if(!empty($a_course['db_name']))
{
// table definition // table definition
$tbl_messages = Database :: get_course_table(TABLE_FORUM_POST, $a_course['db_name']); $tbl_messages = Database :: get_course_table(TABLE_FORUM_POST, $a_course['db_name']);
$sql = 'SELECT 1 $condition_user = "";
FROM ' . $tbl_messages . ' if (is_array($student_id)) {
WHERE poster_id=' . $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__); $rs = Database::query($sql, __LINE__, __FILE__);
return Database::num_rows($rs); $row = Database::fetch_row($rs);
} return $row[0];
else }
{ return null;
return null;
}
} }
/** /**
@ -1297,8 +1208,8 @@ class Tracking {
* @param string the course id * @param string the course id
*/ */
function get_average_test_scorm_and_lp ($user_id,$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); $course_info=api_get_course_info($course_id);
$lp_table = Database :: get_course_table(TABLE_LP_MAIN,$course_info['dbName']); $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']); $lp_view_table = Database :: get_course_table(TABLE_LP_VIEW,$course_info['dbName']);
@ -1358,12 +1269,11 @@ class Tracking {
$average_data1=0; $average_data1=0;
$count_loop++; $count_loop++;
} }
if ((int)$count_loop > 0) { if ((int)$count_loop > 0) {
$avg_student_score = round(($average_data_sum / $count_loop * 100), 2); $avg_student_score = round(($average_data_sum / $count_loop * 100), 2);
} }
return $avg_student_score; return $avg_student_score;
} }
} }
?> ?>

@ -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_user = Database :: get_main_table(TABLE_MAIN_SESSION_USER);
$tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER); $tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tbl_admin = Database :: get_main_table(TABLE_MAIN_ADMIN); $tbl_admin = Database :: get_main_table(TABLE_MAIN_ADMIN);
$tbl_track_cours_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
/******************** /********************
* FUNCTIONS * FUNCTIONS
@ -435,16 +436,14 @@ if ($view == 'coach') {
</div>'; </div>';
} }
} }
echo '<div class="clear">&nbsp;</div>'; echo '<div class="clear">&nbsp;</div>';
if (api_is_allowed_to_create_course() && $view == 'teacher') { if (api_is_allowed_to_create_course() && $view == 'teacher') {
if ($nb_teacher_courses) { if ($nb_teacher_courses) {
$table = new SortableTable('courses', 'get_number_of_courses' ,'get_course_data');
$table = new SortableTable('tracking_list_course', 'count_teacher_courses');
$parameters['view'] = 'teacher'; $parameters['view'] = 'teacher';
$parameters['class'] = 'data_table'; $parameters['class'] = 'data_table';
$table->set_additional_parameters($parameters); $table->set_additional_parameters($parameters);
$table -> set_header(0, get_lang('CourseTitle'), false, 'align="center"'); $table -> set_header(0, get_lang('CourseTitle'), false, 'align="center"');
$table -> set_header(1, get_lang('NbStudents'), false); $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('AvgExercisesScore', ''),
get_lang('AvgMessages', ''), get_lang('AvgMessages', ''),
get_lang('AvgAssignments', '') get_lang('AvgAssignments', '')
); );
$table->display();
$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[] = '<center><a href="../tracking/courseLog.php?cidReq='.$course_code.'&studentlist=true&from=myspace"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
$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();
} }
} }
@ -566,7 +475,6 @@ if ($is_platform_admin && $view == 'admin') {
if ($_GET['display'] == 'useroverview') { if ($_GET['display'] == 'useroverview') {
echo ' | <a href="'.api_get_self().'?view=admin&amp;display=useroverview&amp;export=options">'.get_lang('ExportUserOverviewOptions').'</a>'; echo ' | <a href="'.api_get_self().'?view=admin&amp;display=useroverview&amp;export=options">'.get_lang('ExportUserOverviewOptions').'</a>';
} }
if ($_GET['display'] === 'useroverview') { if ($_GET['display'] === 'useroverview') {
display_tracking_user_overview(); display_tracking_user_overview();
} else { } else {
@ -584,7 +492,6 @@ if ($is_platform_admin && $view == 'admin') {
} else { } 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')); $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); $table = new SortableTable('tracking_list_coaches', 'count_coaches', null, ($is_western_name_order xor $sort_by_first_name) ? 1 : 0);
$parameters['view'] = 'admin'; $parameters['view'] = 'admin';
$table->set_additional_parameters($parameters); $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 $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 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 WHERE scu.id_user=user_id AND scu.status=2 AND login_user_id=user_id
GROUP BY user_id "; GROUP BY user_id ";
// ORDER BY login_date ".$tracking_direction;
if ($_configuration['multiple_access_urls'] == true) { if ($_configuration['multiple_access_urls'] == true) {
$tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); $tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
$access_url_id = api_get_current_access_url_id(); $access_url_id = api_get_current_access_url_id();
@ -642,14 +548,12 @@ if ($is_platform_admin && $view == 'admin') {
GROUP BY user_id "; GROUP BY user_id ";
} }
} }
if (!empty($order[$tracking_column])) { if (!empty($order[$tracking_column])) {
$sqlCoachs .= "ORDER BY ".$order[$tracking_column]." ".$tracking_direction; $sqlCoachs .= "ORDER BY ".$order[$tracking_column]." ".$tracking_direction;
} }
$result_coaches = Database::query($sqlCoachs, __FILE__, __LINE__); $result_coaches = Database::query($sqlCoachs, __FILE__, __LINE__);
$total_no_coaches = Database::num_rows($result_coaches); $total_no_coaches = Database::num_rows($result_coaches);
$global_coaches = array(); $global_coaches = array();
while ($coach = Database::fetch_array($result_coaches)) { while ($coach = Database::fetch_array($result_coaches)) {
$global_coaches[$coach['user_id']] = $coach; $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); $extra_data = UserManager::get_extra_user_data($user_id, true);
return $extra_data; 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[] = '<center><a href="../tracking/courseLog.php?cidReq='.$course_code.'&studentlist=true&from=myspace"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
$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;
}

@ -1786,9 +1786,9 @@ class learnpath {
' <a href="lp_controller.php?action=stats" onclick="window.parent.API.save_asset();return true;" target="content_name_blank" title="stats" id="stats_link"><img border="0" src="../img/lp_stats.gif" title="' . get_lang('Reporting') . '"></a>' . "\n" . ' <a href="lp_controller.php?action=stats" onclick="window.parent.API.save_asset();return true;" target="content_name_blank" title="stats" id="stats_link"><img border="0" src="../img/lp_stats.gif" title="' . get_lang('Reporting') . '"></a>' . "\n" .
' <a href="" onclick="dokeos_xajax_handler.switch_item(' . $mycurrentitemid . ',\'previous\');return false;" title="previous"><img border="0" src="../img/lp_leftarrow.gif" title="' . get_lang('ScormPrevious') . '"></a>' . "\n" . ' <a href="" onclick="switch_item(' . $mycurrentitemid . ',\'previous\');return false;" title="previous"><img border="0" src="../img/lp_leftarrow.gif" title="' . get_lang('ScormPrevious') . '"></a>' . "\n" .
' <a href="" onclick="dokeos_xajax_handler.switch_item(' . $mycurrentitemid . ',\'next\');return false;" title="next" ><img border="0" src="../img/lp_rightarrow.gif" title="' . get_lang('ScormNext') . '"></a>' . "\n" . ' <a href="" onclick="switch_item(' . $mycurrentitemid . ',\'next\');return false;" title="next" ><img border="0" src="../img/lp_rightarrow.gif" title="' . get_lang('ScormNext') . '"></a>' . "\n" .
//' <a href="lp_controller.php?action=mode&mode=embedded" target="_top" title="embedded mode"><img border="0" src="../img/view_choose.gif" title="'.get_lang('ScormExitFullScreen').'"></a>'."\n" . //' <a href="lp_controller.php?action=mode&mode=embedded" target="_top" title="embedded mode"><img border="0" src="../img/view_choose.gif" title="'.get_lang('ScormExitFullScreen').'"></a>'."\n" .
@ -1814,9 +1814,9 @@ class learnpath {
' <a href="lp_controller.php?action=stats" onclick="window.parent.API.save_asset();return true;" target="content_name" title="stats" id="stats_link"><img border="0" src="../img/lp_stats.gif" title="' . get_lang('Reporting') . '"></a>' . "\n" . ' <a href="lp_controller.php?action=stats" onclick="window.parent.API.save_asset();return true;" target="content_name" title="stats" id="stats_link"><img border="0" src="../img/lp_stats.gif" title="' . get_lang('Reporting') . '"></a>' . "\n" .
' <a href="" onclick="dokeos_xajax_handler.switch_item(' . $mycurrentitemid . ',\'previous\');return false;" title="previous"><img border="0" src="../img/lp_leftarrow.gif" title="' . get_lang('ScormPrevious') . '"></a>' . "\n" . ' <a href="" onclick="switch_item(' . $mycurrentitemid . ',\'previous\');return false;" title="previous"><img border="0" src="../img/lp_leftarrow.gif" title="' . get_lang('ScormPrevious') . '"></a>' . "\n" .
' <a href="" onclick="dokeos_xajax_handler.switch_item(' . $mycurrentitemid . ',\'next\');return false;" title="next" ><img border="0" src="../img/lp_rightarrow.gif" title="' . get_lang('ScormNext') . '"></a>' . "\n" . ' <a href="" onclick="switch_item(' . $mycurrentitemid . ',\'next\');return false;" title="next" ><img border="0" src="../img/lp_rightarrow.gif" title="' . get_lang('ScormNext') . '"></a>' . "\n" .
// ' <a href="lp_controller.php?action=mode&mode=fullscreen" target="_top" title="fullscreen"><img border="0" src="../img/view_fullscreen.gif" width="18" height="18" title="'.get_lang('ScormFullScreen').'"></a>'."\n" . // ' <a href="lp_controller.php?action=mode&mode=fullscreen" target="_top" title="fullscreen"><img border="0" src="../img/view_fullscreen.gif" width="18" height="18" title="'.get_lang('ScormFullScreen').'"></a>'."\n" .
@ -2648,6 +2648,28 @@ class learnpath {
} }
return $toc; 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 "<pre>".print_r($this->items,true)."</pre>";
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 * Gets the learning path type
* @param boolean Return the name? If false, return the ID. Default is false. * @param boolean Return the name? If false, return the ID. Default is false.
@ -2714,70 +2736,6 @@ class learnpath {
} }
return $list; 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 = '<div class="inner_lp_toc">'."\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 .= '<a name="atoc_'.$item['id'].'" /><div class="'.$style.'" style="padding-left: '.($item['level']/2).'em; padding-right:'.($item['level']/2).'em" id="toc_'.$item['id'].'" >' .
'<img id="toc_img_'.$item['id'].'" class="scorm_status_img" src="'.$icon_name[$item['status']].'" alt="'.substr($item['status'],0,1).'" />';
//$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 .= "<a href='lp_controller.php?".api_get_cidReq()."&action=content&lp_id=".$this->get_id()."&item_id=".$item['id']."' target='lp_content_frame_name'>".$title."</a>" ;
$url = $this->get_link('http',$item['id']);
//$html .= '<a href="'.$url.'" target="content_name" onclick="top.load_item('.$item['id'].',\''.$url.'\');">'.$title.'</a>' ;
//$html .= '<a href="" onclick="top.load_item('.$item['id'].',\''.$url.'\');return false;">'.$title.'</a>' ;
$html .= '<a href="" onclick="dokeos_xajax_handler.switch_item(' .
$mycurrentitemid.',' .
$item['id'].');' .
'return false;" >'.$title.'</a>' ;
}else{
$html .= $title;
}
$html .= "</div>\n";
}
$html .= "</div>\n";
return $html;
}*/
/** /**
* Uses the table generated by get_toc() and returns an HTML-formatted string ready to display * Uses the table generated by get_toc() and returns an HTML-formatted string ready to display
* @return string HTML TOC ready to display * @return string HTML TOC ready to display
@ -2880,7 +2838,7 @@ class learnpath {
//$html .= '<a href="" onclick="top.load_item('.$item['id'].',\''.$url.'\');return false;">'.$title.'</a>' ; //$html .= '<a href="" onclick="top.load_item('.$item['id'].',\''.$url.'\');return false;">'.$title.'</a>' ;
//<img align="absbottom" width="13" height="13" src="../img/lp_document.png">&nbsp;background:#aaa; //<img align="absbottom" width="13" height="13" src="../img/lp_document.png">&nbsp;background:#aaa;
$html .= '<a href="" onclick="dokeos_xajax_handler.switch_item(' . $html .= '<a href="" onclick="switch_item(' .
$mycurrentitemid . ',' . $mycurrentitemid . ',' .
$item['id'] . ');' . $item['id'] . ');' .
'return false;" >' . stripslashes($title) . '</a>'; 'return false;" >' . stripslashes($title) . '</a>';

@ -0,0 +1,173 @@
<?php //$id$
/**
* This script contains the server part of the xajax interaction process. The client part is located
* in lp_api.php or other api's.
* This script, in particular, enables the process of SCO's initialization. It
* resets the JavaScript values for each SCO to the current LMS status.
* @package dokeos.learnpath
* @author Yannick Warnier <ywarnier@beeznest.org>
*/
/**
* 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']);

@ -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($mylpi->get_type()!='sco')
{ //if this object's JS status has not been updated by the SCORM API, update now { //if this object's JS status has not been updated by the SCORM API, update now
//$objResponse->addScript("lesson_status='".$mystatus."';"); //$objResponse->addScript("lesson_status='".$mystatus."';");
$return .= "lesson_status='".$mystatus."';"; $return .= "olms.lesson_status='".$mystatus."';";
} }
//$objResponse->addScript("update_toc('".$mystatus."','".$item_id."');"); //$objResponse->addScript("update_toc('".$mystatus."','".$item_id."');");
$return .= "update_toc('".$mystatus."','".$item_id."');"; $return .= "update_toc('".$mystatus."','".$item_id."');";

@ -16,6 +16,6 @@ function start_timer()
$time = time(); $time = time();
//$objResponse->addScript("asset_timer='$time';asset_timer_total=0;"); //$objResponse->addScript("asset_timer='$time';asset_timer_total=0;");
//return $objResponse; //return $objResponse;
return "asset_timer='$time';asset_timer_total=0;"; return "olms.asset_timer='$time';olms.asset_timer_total=0;";
} }
echo start_timer(); echo start_timer();

@ -140,35 +140,38 @@ function switch_item_details($lp_id,$user_id,$view_id,$current_item,$next_item)
if (!empty($myistring)) { if (!empty($myistring)) {
$myistring = substr($myistring,1); $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 .= $return .=
"score=".$myscore.";" . "olms.score=".$myscore.";" .
"max=".$mymax.";" . "olms.max=".$mymax.";" .
"min=".$mymin.";" . "olms.min=".$mymin.";" .
"lesson_status='".$mylesson_status."';" . "olms.lesson_status='".$mylesson_status."';" .
"lesson_location='".$mylesson_location."';" . "olms.lesson_location='".$mylesson_location."';" .
"session_time='".$mysession_time."';" . "olms.session_time='".$mysession_time."';" .
"suspend_data='".$mysuspend_data."';" . "olms.suspend_data='".$mysuspend_data."';" .
"total_time = '".$mytotal_time."';" . "olms.total_time = '".$mytotal_time."';" .
"mastery_score = '".$mymastery_score."';" . "olms.mastery_score = '".$mymastery_score."';" .
"max_time_allowed = '".$mymax_time_allowed."';" . "olms.max_time_allowed = '".$mymax_time_allowed."';" .
"launch_data = '".$mylaunch_data."';" . "olms.launch_data = '".$mylaunch_data."';" .
"interactions = new Array(".$myistring.");" . "olms.interactions = new Array(".$myistring.");" .
"item_objectives = new Array();" . "olms.item_objectives = new Array();" .
"G_lastError = 0;" . "olms.G_lastError = 0;" .
"G_LastErrorMessage = 'No error';"; "olms.G_LastErrorMessage = 'No error';" ;
//);
/* /*
* and re-initialise the rest * and re-initialise the rest
* -saved_lesson_status = 'not attempted'
* -lms_lp_id * -lms_lp_id
* -lms_item_id * -lms_item_id
* -lms_old_item_id * -lms_old_item_id
* -lms_new_item_id * -lms_new_item_id
* -lms_been_synchronized
* -lms_initialized * -lms_initialized
* -lms_total_lessons
* -lms_complete_lessons
* -lms_progress_bar_mode * -lms_progress_bar_mode
* -lms_view_id * -lms_view_id
* -lms_user_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(); $myobjectives_count = $mylpi->get_objectives_count();
$mycore_exit = $mylpi->get_core_exit(); $mycore_exit = $mylpi->get_core_exit();
//$objResponse->addScript(
$return .= $return .=
"saved_lesson_status='not attempted';" . //"saved_lesson_status='not attempted';" .
"lms_lp_id=".$lp_id.";" . "olms.lms_lp_id=".$lp_id.";" .
"lms_item_id=".$new_item_id.";" . "olms.lms_item_id=".$new_item_id.";" .
"lms_old_item_id=0;" . "olms.lms_old_item_id=0;" .
"lms_been_synchronized=0;" . //"lms_been_synchronized=0;" .
"lms_initialized=0;" . "olms.lms_initialized=0;" .
"lms_total_lessons=".$mytotal.";" . //"lms_total_lessons=".$mytotal.";" .
"lms_complete_lessons=".$mycomplete.";" . //"lms_complete_lessons=".$mycomplete.";" .
"lms_progress_bar_mod='".$myprogress_mode."';" . //"lms_progress_bar_mode='".$myprogress_mode."';" .
"lms_view_id=".$view_id.";" . "olms.lms_view_id=".$view_id.";" .
"lms_user_id=".$user_id.";" . "olms.lms_user_id=".$user_id.";" .
"next_item=".$new_item_id.";" . //this one is very important to replace possible literal strings "olms.next_item=".$new_item_id.";" . //this one is very important to replace possible literal strings
"lms_next_item=".$mynext.";" . "olms.lms_next_item=".$mynext.";" .
"lms_previous_item=".$myprevious.";" . "olms.lms_previous_item=".$myprevious.";" .
"lms_item_type = '".$myitemtype."';" . "olms.lms_item_type = '".$myitemtype."';" .
"lms_item_credit = '".$mycredit."';" . "olms.lms_item_credit = '".$mycredit."';" .
"lms_item_lesson_mode = '".$mylesson_mode."';" . "olms.lms_item_lesson_mode = '".$mylesson_mode."';" .
"lms_item_launch_data = '".$mylaunch_data."';" . "olms.lms_item_launch_data = '".$mylaunch_data."';" .
"lms_item_interactions_count = '".$myinteractions_count."';" . "olms.lms_item_interactions_count = '".$myinteractions_count."';" .
"lms_item_objectives_count = '".$myinteractions_count."';" . "olms.lms_item_objectives_count = '".$myinteractions_count."';" .
"lms_item_core_exit = '".$mycore_exit."';" . "olms.lms_item_core_exit = '".$mycore_exit."';" .
"asset_timer = 0;"; "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."');". $return .= "update_toc('unhighlight','".$current_item."');".
"update_toc('highlight','".$new_item_id."');". "update_toc('highlight','".$new_item_id."');".
"update_toc('$mylesson_status','".$new_item_id."');". "update_toc('$mylesson_status','".$new_item_id."');".
"update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');"; "update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');";
$mylp->set_error_msg(''); $mylp->set_error_msg('');
$mylp->prerequisites_match(); //check the prerequisites are all complete $mylp->prerequisites_match(); //check the prerequisites are all complete
if($debug>1){error_log('Prereq_match() returned '.htmlentities($mylp->error),0);} 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['scorm_item_id'] = $new_item_id;//Save the new item ID for the exercise tool to use
$_SESSION['lpobject'] = serialize($mylp); $_SESSION['lpobject'] = serialize($mylp);
return $return; return $return;
//return $objResponse; //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']);

@ -0,0 +1,186 @@
<?php //$id$
/**
* This script contains the server part of the xajax interaction process. The client part is located
* in lp_api.php or other api's.
* This script updated the TOC of the SCORM without updating the SCO's attributes
* @package dokeos.learnpath
* @author Yannick Warnier <ywarnier@beeznest.org>
*/
/**
* 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']);

@ -71,16 +71,14 @@ $my_style=$platform_theme;
Header Header
----------------------------------------------------------- -----------------------------------------------------------
*/ */
//$htmlHeadXtra[] = '<script type="text/javascript" src="lp_view.lib.js"></script>';
//$htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/')."\n";
$htmlHeadXtra[] = '<script src="../inc/lib/javascript/jquery.js" type="text/javascript" language="javascript"></script>'; //jQuery $htmlHeadXtra[] = '<script src="../inc/lib/javascript/jquery.js" type="text/javascript" language="javascript"></script>'; //jQuery
$htmlHeadXtra[] = '<script language="javascript"> $htmlHeadXtra[] = '<script language="javascript" type="text/javascript">
function cleanlog(){ $(document).ready(function (){
if(document.getElementById){ $("div#log_content_cleaner").bind("click", function(){
document.getElementById("log_content").innerHTML = ""; $("div#log_content").empty();
} });
} });
</script>'; </script>';
$htmlHeadXtra[] = '<script language="JavaScript" type="text/javascript"> $htmlHeadXtra[] = '<script language="JavaScript" type="text/javascript">
@ -229,45 +227,42 @@ if($_SESSION['oLP']->mode == 'fullscreen') {
//set flag to ensure lp_header.php is loaded by this script (flag is unset in lp_header.php) //set flag to ensure lp_header.php is loaded by this script (flag is unset in lp_header.php)
$_SESSION['loaded_lp_view'] = true; $_SESSION['loaded_lp_view'] = true;
?> ?>
<input type="hidden" id="old_item" name ="old_item" value="0"/> <body>
<input type="hidden" id="current_item_id" name ="current_item_id" value="0" /> <div id="learning_path_main" style="width:100%;height:100%;" >
<div id="learning_path_left_zone" style="float:left;width:280px;height:100%">
<div id="learningPathMain" style="width:100%;height:100%;" >
<div id="learningPathLeftZone" style="float:left;width:280px;height:100%">
<!-- header --> <!-- header -->
<div id="header"> <div id="header">
<div id="learningPathHeader" style="font-size:14px;"> <div id="learning_path_header" style="font-size:14px;">
<table> <table>
<tr> <tr>
<td> <td>
<a href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();"> <a href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();">
<img src="../img/lp_arrow.gif" /> <img src="../img/lp_arrow.gif" />
</a> </a>
</td> </td>
<td> <td>
<a class="link" href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();"> <a class="link" href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();">
<?php echo api_convert_encoding(get_lang('CourseHomepageLink'), $charset, api_get_system_encoding()); ?></a> <?php echo api_convert_encoding(get_lang('CourseHomepageLink'), $charset, api_get_system_encoding()); ?></a>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
</div> </div>
<!-- end header --> <!-- end header -->
<!-- Image preview Layout --> <!-- Image preview Layout -->
<div id="author_image" name="author_image" class="lp_author_image" style="height:23%; width:100%;margin-left:5px"> <div id="author_image" name="author_image" class="lp_author_image" style="height:23%; width:100%;margin-left:5px">
<?php $image = '../img/lp_author_background.gif'; ?> <?php $image = '../img/lp_author_background.gif'; ?>
<div id="preview_image" style="padding:5px;background-image: url('../img/lp_author_background.gif');background-repeat:no-repeat;height:110px"> <div id="preview_image" style="padding:5px;background-image: url('../img/lp_author_background.gif');background-repeat:no-repeat;height:110px">
<div style="width:100; float:left;height:105;margin:5px"> <div style="width:100; float:left;height:105;margin:5px">
<span> <span>
<?php if ($_SESSION['oLP']->get_preview_image()!=''): ?> <?php
<img width="115" height="100" src="<?php echo api_get_path(WEB_COURSE_PATH).api_get_course_path().'/upload/learning_path/images/'.$_SESSION['oLP']->get_preview_image(); ?>"> if ($_SESSION['oLP']->get_preview_image()!='') {
<?php echo '<img width="115px" height="100px" src="'.api_get_path(WEB_COURSE_PATH).api_get_course_path().'/upload/learning_path/images/'.$_SESSION['oLP']->get_preview_image().'">';
else } else {
: echo Display :: display_icon('unknown_250_100.jpg', ' '); echo Display :: display_icon('unknown_250_100.jpg', ' ');
endif; }; ?>
?>
</span> </span>
</div> </div>
@ -295,9 +290,9 @@ if($_SESSION['oLP']->mode == 'fullscreen') {
$sql = "SELECT audio FROM " . $tbl_lp_item . " WHERE lp_id = '" . $_SESSION['oLP']->lp_id."'"; $sql = "SELECT audio FROM " . $tbl_lp_item . " WHERE lp_id = '" . $_SESSION['oLP']->lp_id."'";
$res_media= Database::query($sql, __FILE__, __LINE__); $res_media= Database::query($sql, __FILE__, __LINE__);
if(Database::num_rows($res_media) > 0){ if (Database::num_rows($res_media) > 0) {
while($row_media= Database::fetch_array($res_media)) { while ($row_media= Database::fetch_array($res_media)) {
if(!empty($row_media['audio'])) {$show_audioplayer = true; break;} if (!empty($row_media['audio'])) {$show_audioplayer = true; break;}
} }
} }
?> ?>
@ -311,9 +306,9 @@ if($_SESSION['oLP']->mode == 'fullscreen') {
</div> </div>
<!-- end image preview Layout --> <!-- end image preview Layout -->
<div id="author_name" style="position:relative;top:2px;left:0px;margin:0;padding:0;text-align:center;width:100%"> <div id="author_name" style="position:relative;top:2px;left:0px;margin:0;padding:0;text-align:center;width:100%">
<?php echo $_SESSION['oLP']->get_author() ?> <?php echo $_SESSION['oLP']->get_author() ?>
</div> </div>
<!-- media player layaout --> <!-- media player layaout -->
<?php $style_media = (($show_audioplayer)?' style= "position:relative;top:10px;left:10px;margin:8px;font-size:32pt;height:20px;"':'style="height:15px"'); ?> <?php $style_media = (($show_audioplayer)?' style= "position:relative;top:10px;left:10px;margin:8px;font-size:32pt;height:20px;"':'style="height:15px"'); ?>
@ -324,160 +319,143 @@ if($_SESSION['oLP']->mode == 'fullscreen') {
<!-- toc layout --> <!-- toc layout -->
<div id="toc_id" name="toc_name" style="padding:0;margin-top:20px;height:60%;width:100%"> <div id="toc_id" name="toc_name" style="padding:0;margin-top:20px;height:60%;width:100%">
<div id="learningPathToc" style="font-size:9pt;margin:0;"><?php echo $_SESSION['oLP']->get_html_toc(); ?> <div id="learning_path_toc" style="font-size:9pt;margin:0;"><?php echo $_SESSION['oLP']->get_html_toc(); ?>
<!-- log message layout --> <!-- log message layout -->
<div id="lp_log_name" name="lp_log_name" class="lp_log" style="height:50px;overflow:auto;margin:15px"> <div id="lp_log_name" name="lp_log_name" class="lp_log" style="height:50px;overflow:auto;margin:15px">
<div id="log_content"></div> <div id="log_content"></div>
<div style="color: white;" onClick="cleanlog();">.</div> <div id="log_content_cleaner" style="color: white;">.</div>
</div> </div>
<!-- end log message layout --> <!-- end log message layout -->
</div> </div>
</div> </div>
<!-- end toc layout --> <!-- end toc layout -->
</div>
</div>
<!-- end left Zone --> <!-- end left Zone -->
<!-- right Zone --> <!-- right Zone -->
<div id="learningPathRightZone" style="margin-left:282px;border : 0pt solid blue;height:100%"> <div id="learning_path_right_zone" style="margin-left:282px;border : 0pt solid blue;height:100%">
<iframe id="content_id_blank" name="content_name_blank" src="blank.php" border="0" frameborder="0" style="width:100%;height:600px" ></iframe> <iframe id="content_id_blank" name="content_name_blank" src="blank.php" border="0" frameborder="0" style="width:100%;height:600px" ></iframe>
</div> </div>
<!-- end right Zone --> <!-- end right Zone -->
</div> </div>
<script language="JavaScript" type="text/javascript"> <script language="JavaScript" type="text/javascript">
// Need to be called after the <head> to be sure window.oxajax is defined <!--
var dokeos_xajax_handler = window.oxajax; var leftZoneHeightOccupied = 0;
</script> var rightZoneHeightOccupied = 0;
<script language="JavaScript" type="text/javascript"> var initialLeftZoneHeight = 0;
<!-- var initialRightZoneHeight = 0;
var leftZoneHeightOccupied = 0;
var rightZoneHeightOccupied = 0; var updateContentHeight = function() {
var initialLeftZoneHeight = 0; winHeight = (window.innerHeight != undefined ? window.innerHeight : document.documentElement.clientHeight);
var initialRightZoneHeight = 0; newLeftZoneHeight = winHeight - leftZoneHeightOccupied;
newRightZoneHeight = winHeight - rightZoneHeightOccupied;
var updateContentHeight = function() { if (newLeftZoneHeight <= initialLeftZoneHeight) {
winHeight = (window.innerHeight != undefined ? window.innerHeight : document.documentElement.clientHeight); newLeftZoneHeight = initialLeftZoneHeight;
newLeftZoneHeight = winHeight - leftZoneHeightOccupied; newRightZoneHeight = newLeftZoneHeight + leftZoneHeightOccupied - rightZoneHeightOccupied;
newRightZoneHeight = winHeight - rightZoneHeightOccupied; }
if (newLeftZoneHeight <= initialLeftZoneHeight) { if (newRightZoneHeight <= initialRightZoneHeight) {
newLeftZoneHeight = initialLeftZoneHeight; newRightZoneHeight = initialRightZoneHeight;
newRightZoneHeight = newLeftZoneHeight + leftZoneHeightOccupied - rightZoneHeightOccupied; newLeftZoneHeight = newRightZoneHeight + rightZoneHeightOccupied - leftZoneHeightOccupied;
} }
if (newRightZoneHeight <= initialRightZoneHeight) { document.getElementById('learning_path_toc').style.height = newLeftZoneHeight + 'px';
newRightZoneHeight = initialRightZoneHeight; document.getElementById('learning_path_right_zone').style.height = newRightZoneHeight + 'px';
newLeftZoneHeight = newRightZoneHeight + rightZoneHeightOccupied - leftZoneHeightOccupied; document.getElementById('content_id_blank').style.height = newRightZoneHeight + 'px';
} if (document.body.clientHeight > winHeight) {
document.getElementById('learningPathToc').style.height = newLeftZoneHeight + 'px'; document.body.style.overflow = 'auto';
document.getElementById('learningPathRightZone').style.height = newRightZoneHeight + 'px'; } else {
document.getElementById('content_id_blank').style.height = newRightZoneHeight + 'px'; document.body.style.overflow = 'hidden';
if (document.body.clientHeight > winHeight) { }
document.body.style.overflow = 'auto'; };
} else {
document.body.style.overflow = 'hidden';
}
};
window.onload = function() {
screen_height = screen.height; window.onload = function() {
screen_width = screen.height;
document.getElementById('learningPathLeftZone').style.height = "100%"; screen_height = screen.height;
document.getElementById('learningPathToc').style.height = "60%"; screen_width = screen.height;
document.getElementById('learningPathToc').style.width = "100%";
document.getElementById('learningPathRightZone').style.height = "100%"
document.getElementById('content_id').style.height = "100%" ;
if (screen_height <= 600) { document.getElementById('learning_path_left_zone').style.height = "100%";
document.getElementById('inner_lp_toc').style.height = "100px" ; document.getElementById('learning_path_toc').style.height = "60%";
document.getElementById('learningPathLeftZone').style.height = "415px"; document.getElementById('learning_path_toc').style.width = "100%";
} document.getElementById('learning_path_right_zone').style.height = "100%"
document.getElementById('content_id').style.height = "100%" ;
initialLeftZoneHeight = document.getElementById('learningPathToc').offsetHeight; if (screen_height <= 600) {
initialRightZoneHeight = document.getElementById('learningPathRightZone').offsetHeight; document.getElementById('inner_lp_toc').style.height = "100px" ;
docHeight = document.body.clientHeight; document.getElementById('learning_path_left_zone').style.height = "415px";
leftZoneHeightOccupied = docHeight - initialLeftZoneHeight;
rightZoneHeightOccupied = docHeight - initialRightZoneHeight;
document.body.style.overflow = 'hidden';
updateContentHeight();
} }
window.onresize = updateContentHeight; initialLeftZoneHeight = document.getElementById('learning_path_toc').offsetHeight;
--> initialRightZoneHeight = document.getElementById('learning_path_right_zone').offsetHeight;
</script> docHeight = document.body.clientHeight;
leftZoneHeightOccupied = docHeight - initialLeftZoneHeight;
rightZoneHeightOccupied = docHeight - initialRightZoneHeight;
document.body.style.overflow = 'hidden';
updateContentHeight();
}
window.onresize = updateContentHeight;
-->
</script>
</body>
<?php <?php
} } else {
else //not fullscreen mode
{
include_once('../inc/reduced_header.inc.php'); include_once('../inc/reduced_header.inc.php');
//$displayAudioRecorder = (api_get_setting('service_visio','active')=='true') ? true : false; //$displayAudioRecorder = (api_get_setting('service_visio','active')=='true') ? true : false;
//check if audio recorder needs to be in studentview //check if audio recorder needs to be in studentview
$course_id=$_SESSION["_course"]["id"]; $course_id=$_SESSION["_course"]["id"];
if($_SESSION["status"][$course_id]==5) if ($_SESSION["status"][$course_id]==5) {
{
$audio_recorder_studentview = true; $audio_recorder_studentview = true;
} } else {
else
{
$audio_recorder_studentview = false; $audio_recorder_studentview = false;
} }
//set flag to ensure lp_header.php is loaded by this script (flag is unset in lp_header.php) //set flag to ensure lp_header.php is loaded by this script (flag is unset in lp_header.php)
$_SESSION['loaded_lp_view'] = true; $_SESSION['loaded_lp_view'] = true;
?> ?>
<body>
<input type="hidden" id="old_item" name ="old_item" value="0"/> <div id="learning_path_main" style="width:100%;height:100%;" >
<input type="hidden" id="current_item_id" name ="current_item_id" value="0" /> <div id="learning_path_left_zone" style="float:left;width:280px;height:100%">
<div id="learningPathMain" style="width:100%;height:100%;" >
<div id="learningPathLeftZone" style="float:left;width:280px;height:100%">
<!-- header --> <!-- header -->
<div id="header"> <div id="header">
<div id="learningPathHeader" style="font-size:14px;"> <div id="learning_path_header" style="font-size:14px;">
<table> <table>
<tr> <tr>
<td> <td>
<a href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();"><img src="../img/lp_arrow.gif" /></a> <a href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();"><img src="../img/lp_arrow.gif" /></a>
</td> </td>
<td> <td>
<a class="link" href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();"> <a class="link" href="lp_controller.php?action=return_to_course_homepage" target="_self" onclick="window.parent.API.save_asset();">
<?php echo api_convert_encoding(get_lang('CourseHomepageLink'), $charset, api_get_system_encoding()); ?></a> <?php echo api_convert_encoding(get_lang('CourseHomepageLink'), $charset, api_get_system_encoding()); ?></a>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
</div> </div>
<!-- end header --> <!-- end header -->
<!-- Image preview Layout --> <!-- Image preview Layout -->
<div id="author_image" name="author_image" class="lp_author_image" style="height:23%; width:100%;margin-left:5px;"> <div id="author_image" name="author_image" class="lp_author_image" style="height:23%; width:100%;margin-left:5px;">
<?php $image = '../img/lp_author_background.gif'; ?> <?php $image = '../img/lp_author_background.gif'; ?>
<div id="preview_image" style="padding:5px;background-image: url('../img/lp_author_background.gif');background-repeat:no-repeat;height:110px"> <div id="preview_image" style="padding:5px;background-image: url('../img/lp_author_background.gif');background-repeat:no-repeat;height:110px">
<div style="width:100; float:left;height:105;margin:5px"> <div style="width:100; float:left;height:105;margin:5px">
<span style="width:104px; height:96px; float:left; vertical-align:bottom;"> <span style="width:104px; height:96px; float:left; vertical-align:bottom;">
<center><?php if ($_SESSION['oLP']->get_preview_image()!=''): ?> <center>
<?php <?php
if ($_SESSION['oLP']->get_preview_image()!='') {
$picture = getimagesize(api_get_path(SYS_COURSE_PATH).api_get_course_path().'/upload/learning_path/images/'.$_SESSION['oLP']->get_preview_image()); $picture = getimagesize(api_get_path(SYS_COURSE_PATH).api_get_course_path().'/upload/learning_path/images/'.$_SESSION['oLP']->get_preview_image());
if($picture['1'] < 96) $style = ' style="padding-top:'.((94 -$picture['1'])/2).'px;" '; if($picture['1'] < 96) { $style = ' style="padding-top:'.((94 -$picture['1'])/2).'px;" '; }
$size = ($picture['0'] > 104 && $picture['1'] > 96 )? ' width="104" height="96" ': $style; $size = ($picture['0'] > 104 && $picture['1'] > 96 )? ' width="104" height="96" ': $style;
$flie = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/upload/learning_path/images/'.$_SESSION['oLP']->get_preview_image(); $my_path = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/upload/learning_path/images/'.$_SESSION['oLP']->get_preview_image();
echo '<img '.$size.' src="'.$flie.'">'; echo '<img '.$size.' src="'.$my_path.'">';
?> } else {
<?php echo Display :: display_icon('unknown_250_100.jpg', ' ');
else }
: echo Display :: display_icon('unknown_250_100.jpg', ' '); ?>
endif; </center>
?></center> </span>
</span>
</div> </div>
<div id="nav_id" name="nav_name" class="lp_nav" style="margin-left:105;height:90"> <div id="nav_id" name="nav_name" class="lp_nav" style="margin-left:105;height:90">
@ -503,9 +481,9 @@ else
$sql = "SELECT audio FROM " . $tbl_lp_item . " WHERE lp_id = '" . $_SESSION['oLP']->lp_id."'"; $sql = "SELECT audio FROM " . $tbl_lp_item . " WHERE lp_id = '" . $_SESSION['oLP']->lp_id."'";
$res_media= Database::query($sql, __FILE__, __LINE__); $res_media= Database::query($sql, __FILE__, __LINE__);
if(Database::num_rows($res_media) > 0){ if (Database::num_rows($res_media) > 0) {
while($row_media= Database::fetch_array($res_media)) { while ($row_media= Database::fetch_array($res_media)) {
if(!empty($row_media['audio'])) {$show_audioplayer = true; break;} if (!empty($row_media['audio'])) {$show_audioplayer = true; break;}
} }
} }
?> ?>
@ -515,110 +493,102 @@ else
<div style="height:20px"><?php echo $progress_bar; ?></div> <div style="height:20px"><?php echo $progress_bar; ?></div>
</div> </div>
</div> </div>
</div>
</div>
<!-- end image preview Layout -->
<div id="author_name" style="position:relative;top:2px;left:0px;margin:0;padding:0;text-align:center;width:100%">
<?php echo $_SESSION['oLP']->get_author() ?>
</div> </div>
</div> <!-- media player layaout -->
<!-- end image preview Layout --> <?php $style_media = (($show_audioplayer)?' style= "position:relative;top:10px;left:10px;margin:8px;font-size:32pt;height:20px;"':'style="height:15px"'); ?>
<div id="author_name" style="position:relative;top:2px;left:0px;margin:0;padding:0;text-align:center;width:100%"> <div id="media" <?php echo $style_media ?>>
<?php echo $_SESSION['oLP']->get_author() ?> <?php echo (!empty($mediaplayer))?$mediaplayer:'&nbsp;' ?>
</div>
<!-- media player layaout -->
<?php $style_media = (($show_audioplayer)?' style= "position:relative;top:10px;left:10px;margin:8px;font-size:32pt;height:20px;"':'style="height:15px"'); ?>
<div id="media" <?php echo $style_media ?>>
<?php echo (!empty($mediaplayer))?$mediaplayer:'&nbsp;' ?>
</div>
<!-- end media player layaout -->
<!-- toc layout -->
<div id="toc_id" name="toc_name" style="padding:0;margin-top:20px;height:60%;width:100%">
<div id="learningPathToc" style="font-size:9pt;margin:0;"><?php echo $_SESSION['oLP']->get_html_toc(); ?>
<!-- log message layout -->
<div id="lp_log_name" name="lp_log_name" class="lp_log" style="height:50px;overflow:auto;margin:15px">
<div id="log_content"></div>
<div style="color: white;" onClick="cleanlog();">.</div>
</div> </div>
<!-- end log message layout --> <!-- end media player layaout -->
<!-- toc layout -->
<div id="toc_id" name="toc_name" style="padding:0;margin-top:20px;height:60%;width:100%">
<div id="learning_path_toc" style="font-size:9pt;margin:0;"><?php echo $_SESSION['oLP']->get_html_toc(); ?>
<?php if (!empty($_SESSION['oLP']->scorm_debug)) { //only show log ?>
<!-- log message layout -->
<div id="lp_log_name" name="lp_log_name" class="lp_log" style="height:150px;overflow:auto;margin:4px">
<div id="log_content"></div>
<div id="log_content_cleaner" style="color: white;">.</div>
</div>
<!-- end log message layout -->
<?php } ?>
</div>
</div> </div>
<!-- end toc layout -->
</div>
<!-- end toc layout -->
</div> </div>
<!-- end left Zone --> <!-- end left Zone -->
<!-- right Zone --> <!-- right Zone -->
<div id="learningPathRightZone" style="margin-left:282px;height:100%"> <div id="learning_path_right_zone" style="margin-left:282px;height:100%">
<iframe id="content_id" name="content_name" src="<?php echo $src; ?>" border="0" frameborder="0" style="width:100%;height:600px" ></iframe> <iframe id="content_id" name="content_name" src="<?php echo $src; ?>" border="0" frameborder="0" style="width:100%;height:600px" ></iframe>
</div> </div>
<!-- end right Zone --> <!-- end right Zone -->
</div> </div>
<script language="JavaScript" type="text/javascript">
<!--
var leftZoneHeightOccupied = 0;
var rightZoneHeightOccupied = 0;
var initialLeftZoneHeight = 0;
var initialRightZoneHeight = 0;
var updateContentHeight = function() {
winHeight = (window.innerHeight != undefined ? window.innerHeight : document.documentElement.clientHeight);
newLeftZoneHeight = winHeight - leftZoneHeightOccupied;
newRightZoneHeight = winHeight - rightZoneHeightOccupied;
if (newLeftZoneHeight <= initialLeftZoneHeight) {
newLeftZoneHeight = initialLeftZoneHeight;
newRightZoneHeight = newLeftZoneHeight + leftZoneHeightOccupied - rightZoneHeightOccupied;
}
if (newRightZoneHeight <= initialRightZoneHeight) {
newRightZoneHeight = initialRightZoneHeight;
newLeftZoneHeight = newRightZoneHeight + rightZoneHeightOccupied - leftZoneHeightOccupied;
}
document.getElementById('learning_path_toc').style.height = newLeftZoneHeight + 'px';
document.getElementById('learning_path_right_zone').style.height = newRightZoneHeight + 'px';
document.getElementById('content_id').style.height = newRightZoneHeight + 'px';
if (document.body.clientHeight > winHeight) {
document.body.style.overflow = 'auto';
} else {
document.body.style.overflow = 'hidden';
}
};
<script language="JavaScript" type="text/javascript"> window.onload = function() {
// Need to be called after the <head> to be sure window.oxajax is defined
var dokeos_xajax_handler = window.oxajax;
</script>
<script language="JavaScript" type="text/javascript">
<!--
var leftZoneHeightOccupied = 0;
var rightZoneHeightOccupied = 0;
var initialLeftZoneHeight = 0;
var initialRightZoneHeight = 0;
var updateContentHeight = function() {
winHeight = (window.innerHeight != undefined ? window.innerHeight : document.documentElement.clientHeight);
newLeftZoneHeight = winHeight - leftZoneHeightOccupied;
newRightZoneHeight = winHeight - rightZoneHeightOccupied;
if (newLeftZoneHeight <= initialLeftZoneHeight) {
newLeftZoneHeight = initialLeftZoneHeight;
newRightZoneHeight = newLeftZoneHeight + leftZoneHeightOccupied - rightZoneHeightOccupied;
}
if (newRightZoneHeight <= initialRightZoneHeight) {
newRightZoneHeight = initialRightZoneHeight;
newLeftZoneHeight = newRightZoneHeight + rightZoneHeightOccupied - leftZoneHeightOccupied;
}
document.getElementById('learningPathToc').style.height = newLeftZoneHeight + 'px';
document.getElementById('learningPathRightZone').style.height = newRightZoneHeight + 'px';
document.getElementById('content_id').style.height = newRightZoneHeight + 'px';
if (document.body.clientHeight > winHeight) {
document.body.style.overflow = 'auto';
} else {
document.body.style.overflow = 'hidden';
}
};
window.onload = function() {
screen_height = screen.height;
screen_width = screen.height;
document.getElementById('learningPathLeftZone').style.height = "100%"; screen_height = screen.height;
document.getElementById('learningPathToc').style.height = "60%"; screen_width = screen.height;
document.getElementById('learningPathToc').style.width = "100%";
document.getElementById('learningPathRightZone').style.height = "100%"
document.getElementById('content_id').style.height = "100%" ;
if (screen_height <= 600) { document.getElementById('learning_path_left_zone').style.height = "100%";
document.getElementById('inner_lp_toc').style.height = "100px" ; document.getElementById('learning_path_toc').style.height = "60%";
document.getElementById('learningPathLeftZone').style.height = "415px"; document.getElementById('learning_path_toc').style.width = "100%";
} document.getElementById('learning_path_right_zone').style.height = "100%"
document.getElementById('content_id').style.height = "100%" ;
initialLeftZoneHeight = document.getElementById('learningPathToc').offsetHeight; if (screen_height <= 600) {
initialRightZoneHeight = document.getElementById('learningPathRightZone').offsetHeight; document.getElementById('inner_lp_toc').style.height = "100px" ;
docHeight = document.body.clientHeight; document.getElementById('learning_path_left_zone').style.height = "415px";
leftZoneHeightOccupied = docHeight - initialLeftZoneHeight;
rightZoneHeightOccupied = docHeight - initialRightZoneHeight;
document.body.style.overflow = 'hidden';
updateContentHeight();
} }
window.onresize = updateContentHeight; initialLeftZoneHeight = document.getElementById('learning_path_toc').offsetHeight;
--> initialRightZoneHeight = document.getElementById('learning_path_right_zone').offsetHeight;
</script> docHeight = document.body.clientHeight;
leftZoneHeightOccupied = docHeight - initialLeftZoneHeight;
rightZoneHeightOccupied = docHeight - initialRightZoneHeight;
document.body.style.overflow = 'hidden';
updateContentHeight();
}
window.onresize = updateContentHeight;
-->
</script>
</body>
<?php <?php
/* /*
============================================================================== ==============================================================================
@ -628,5 +598,4 @@ else
//Display::display_footer(); //Display::display_footer();
} }
//restore global setting //restore global setting
$_setting['show_navigation_menu'] = $save_setting; $_setting['show_navigation_menu'] = $save_setting;
?>

File diff suppressed because it is too large Load Diff

@ -647,7 +647,23 @@ if ($_GET['studentlist'] == 'false') {
$tracking_direction = isset($_GET['tracking_direction']) ? $_GET['tracking_direction'] : 'DESC'; $tracking_direction = isset($_GET['tracking_direction']) ? $_GET['tracking_direction'] : 'DESC';
if (count($a_students) > 0) { if (count($a_students) > 0) {
$table = new SortableTable('tracking', 'count_student_in_course', null, ($is_western_name_order xor $sort_by_first_name) ? 2 : 1);
if ($export_csv) {
$csv_content[] = array ();
}
$all_datas = array();
$course_code = $_course['id'];
$user_ids = array_keys($a_students);
$table = new SortableTable('users', 'get_number_of_users', 'get_user_data', (api_is_western_name_order() xor api_sort_by_first_name()) ? 3 : 2);
$parameters['cidReq'] = Security::remove_XSS($_GET['cidReq']);
$parameters['studentlist'] = Security::remove_XSS($_GET['studentlist']);
$parameters['from'] = Security::remove_XSS($_GET['myspace']);
$table->set_additional_parameters($parameters);
$table -> set_header(0, get_lang('OfficialCode'), false, 'align="center"'); $table -> set_header(0, get_lang('OfficialCode'), false, 'align="center"');
if ($is_western_name_order) { if ($is_western_name_order) {
$table -> set_header(1, get_lang('FirstName'), false, 'align="center"'); $table -> set_header(1, get_lang('FirstName'), false, 'align="center"');
@ -663,86 +679,15 @@ if ($_GET['studentlist'] == 'false') {
$table -> set_header(7, get_lang('Messages'),false); $table -> set_header(7, get_lang('Messages'),false);
$table -> set_header(8, get_lang('FirstLogin'), false, 'align="center"'); $table -> set_header(8, get_lang('FirstLogin'), false, 'align="center"');
$table -> set_header(9, get_lang('LatestLogin'), false, 'align="center"'); $table -> set_header(9, get_lang('LatestLogin'), false, 'align="center"');
if (isset($_GET['additional_profile_field']) AND is_numeric($_GET['additional_profile_field'])) { //if (isset($_GET['additional_profile_field']) AND is_numeric($_GET['additional_profile_field'])) {
$table -> set_header(10, get_lang('AdditionalProfileField'),false); $table -> set_header(10, get_lang('AdditionalProfileField'),false);
$table -> set_header(11, get_lang('Details'),false); /*} else {
} else { $table -> set_header(10, ,false);
$table -> set_header(10, get_lang('Details'),false); }*/
} $table -> set_header(11, get_lang('Details'),false);
if ($export_csv) { $table->display();
$csv_content[] = array ();
}
$all_datas = array();
$course_code = $_course['id'];
foreach ($a_students as $student_id => $student) {
$student_datas = UserManager :: get_user_info_by_id($student_id);
$avg_time_spent = $avg_student_score = $avg_student_progress = $total_assignments = $total_messages = 0;
$nb_courses_student = 0;
$avg_time_spent = Tracking :: get_time_spent_on_the_course($student_id, $course_code);
$avg_student_score = Tracking :: get_average_test_scorm_and_lp($student_id, $course_code);
$avg_student_progress = Tracking :: get_avg_student_progress($student_id, $course_code);
$total_assignments = Tracking :: count_student_assignments($student_id, $course_code);
$total_messages = Tracking :: count_student_messages($student_id, $course_code);
$row = array();
$row[] = $student_datas['official_code'];
if ($is_western_name_order) {
$row[] = $student_datas['firstname'];
$row[] = $student_datas['lastname'];
} else {
$row[] = $student_datas['lastname'];
$row[] = $student_datas['firstname'];
}
$row[] = api_time_to_hms($avg_time_spent);
if (is_null($avg_student_score)) {$avg_student_score=0;}
if (is_null($avg_student_progress)) {$avg_student_progress=0;}
$row[] = $avg_student_progress.'%';
$row[] = $avg_student_score.'%';
$row[] = $total_assignments;
$row[] = $total_messages;
$row[] = Tracking :: get_first_connection_date_on_the_course($student_id, $course_code);
$row[] = Tracking :: get_last_connection_date_on_the_course($student_id, $course_code);
// we need to display an additional profile field
if (isset($_GET['additional_profile_field']) AND is_numeric($_GET['additional_profile_field'])) {
if (is_array($additional_user_profile_info[$student_id])) {
$row[]=implode(', ', $additional_user_profile_info[$student_id]);
} else {
$row[]='&nbsp;';
}
}
$row[] = '<center><a href="../mySpace/myStudents.php?student='.$student_id.'&details=true&course='.$course_code.'&origin=tracking_course"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
if ($export_csv) {
$row[8] = strip_tags($row[8]);
$row[9] = strip_tags($row[9]);
unset($row[10]);
$csv_content[] = $row;
}
$all_datas[] = $row;
}
$clean_order = array('ASC','DESC');
if(in_array($_GET['tracking_direction'],$clean_order) && $_GET['tracking_direction'] == 'ASC'){
usort($all_datas, 'sort_users');
} else if (in_array($_GET['tracking_direction'],$clean_order) && $_GET['tracking_direction'] == 'DESC') {
usort($all_datas, 'sort_users_desc');
}
$page = $table->get_pager()->getCurrentPageID();
$all_datas = array_slice($all_datas, ($page-1)*$table -> per_page, $table -> per_page);
// if ($export_csv) { usort($csv_content, 'sort_users'); }
foreach ($all_datas as $row) {
$table -> addRow($row,'align="right"');
}
$table -> setColAttributes(0, array('align' => 'left'));
$table -> setColAttributes(1, array('align' => 'left'));
$table -> setColAttributes(2, array('align' => 'left'));
$table -> setColAttributes(7, array('align' => 'right'));
$table -> setColAttributes(8, array('align' => 'center'));
$table -> setColAttributes(9, array('align' => 'center'));
$table -> display();
} else { } else {
echo get_lang('NoUsersInCourseTracking'); echo get_lang('NoUsersInCourseTracking');
} }
@ -904,7 +849,7 @@ function get_addtional_profile_information_of_field($field_id){
* @since Nov 2009 * @since Nov 2009
* @version 1.8.6.2 * @version 1.8.6.2
*/ */
function get_addtional_profile_information_of_field_by_user($field_id, $users){ function get_addtional_profile_information_of_field_by_user($field_id, $users) {
// Database table definition // Database table definition
$table_user = Database::get_main_table(TABLE_MAIN_USER); $table_user = Database::get_main_table(TABLE_MAIN_USER);
$table_user_field_values = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES); $table_user_field_values = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
@ -952,7 +897,6 @@ function get_addtional_profile_information_of_field_by_user($field_id, $users){
return $return; return $return;
} }
/** /**
* count the number of students in this course (used for SortableTable) * count the number of students in this course (used for SortableTable)
*/ */
@ -968,3 +912,98 @@ function sort_users($a, $b) {
function sort_users_desc($a, $b) { function sort_users_desc($a, $b) {
return strcmp( trim(api_strtolower($b[$_SESSION['tracking_column']])), trim(api_strtolower($a[$_SESSION['tracking_column']]))); return strcmp( trim(api_strtolower($b[$_SESSION['tracking_column']])), trim(api_strtolower($a[$_SESSION['tracking_column']])));
} }
/**
* Get number of users for sortable with pagination
* @return int
*/
function get_number_of_users() {
global $user_ids;
return count($user_ids);
}
/**
* Get data for users list in sortable with pagination
* @return array
*/
function get_user_data($from, $number_of_items, $column, $direction) {
global $user_ids, $course_code, $additional_user_profile_info, $export_csv, $is_western_name_order, $csv_content;
$course_code = Database::escape_string($course_code);
$course_info = CourseManager :: get_course_information($course_code);
$tbl_track_cours_access = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$tbl_user = Database :: get_main_table(TABLE_MAIN_USER);
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY, $course_info['db_name']);
$tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST, $course_info['db_name']);
$tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW, $course_info['db_name']);
$tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN, $course_info['db_name']);
// get all users data from a course for sortable with limit
$condition_user = "";
if (is_array($user_ids)) {
$condition_user = " WHERE user.user_id IN (".implode(',',$user_ids).") ";
} else {
$condition_user = " WHERE user.user_id = '$user_ids' ";
}
$sql = "SELECT user.user_id as col0,
user.official_code as col1,
user.lastname as col2,
user.firstname as col3
FROM $tbl_user as user
$condition_user ";
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__);
$users = array ();
$t = time();
$row = array();
while ($user = Database::fetch_row($res)) {
$row[0] = $user[1];
if ($is_western_name_order) {
$row[1] = $user[3];
$row[2] = $user[2];
} else {
$row[1] = $user[2];
$row[2] = $user[3];
}
$row[3] = api_time_to_hms(Tracking::get_time_spent_on_the_course($user[0], $course_code));
$avg_student_score = Tracking::get_average_test_scorm_and_lp($user[0], $course_code);
$avg_student_progress = Tracking::get_avg_student_progress($user[0], $course_code);
if (empty($avg_student_score)) {$avg_student_score=0;}
if (empty($avg_student_progress)) {$avg_student_progress=0;}
$row[4] = $avg_student_progress.'%';
$row[5] = $avg_student_score.'%';
$row[6] = Tracking::count_student_assignments($user[0], $course_code);$user[4];
$row[7] = Tracking::count_student_messages($user[0], $course_code);//$user[5];
$row[8] = Tracking::get_first_connection_date_on_the_course($user[0], $course_code);
$row[9] = Tracking::get_last_connection_date_on_the_course($user[0], $course_code);
// we need to display an additional profile field
if (isset($_GET['additional_profile_field']) AND is_numeric($_GET['additional_profile_field'])) {
if (is_array($additional_user_profile_info[$user[0]])) {
$row[10]=implode(', ', $additional_user_profile_info[$user[0]]);
} else {
$row[10]='&nbsp;';
}
}
$row[11] = '<center><a href="../mySpace/myStudents.php?student='.$user[0].'&details=true&course='.$course_code.'&origin=tracking_course"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a></center>';
if ($export_csv) {
$row[8] = strip_tags($row[8]);
$row[9] = strip_tags($row[9]);
unset($row[10]);
unset($row[11]);
$csv_content[] = $row;
}
// store columns in array $users
$users[] = array($row[0],$row[1],$row[2],$row[3],$row[4],$row[5],$row[6],$row[7],$row[8],$row[9],$row[10],$row[11]);
}
return $users;
}
Loading…
Cancel
Save