@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This script displays statistics on the current learning path (scorm)
@ -7,7 +8,6 @@
* @author Yannick Warnier < ywarnier @ beeznest . org >
* @todo clean this file like the exercise files J.M
*/
/**
* Code
*/
@ -22,7 +22,6 @@ if (empty($user_id)) {
}
// Declare variables to be used in lp_stats.php
//When checking the reporting myspace/lp_tracking.php
if (isset($_GET['lp_id']) & & isset($lp_id) & & !empty($lp_id)) {
$lp_id = intval($lp_id);
@ -56,16 +55,9 @@ if (!isset($origin)) {
//Origin = tracking means that teachers see that info in the Reporting tool
if ($origin != 'tracking') {
Display::display_reduced_header();
echo '< body dir = "'.api_get_text_direction().'" > ';
}
$output = '';
// if display in fullscreen required.
if (!empty($_GET['fs']) & & strcmp($_GET['fs'], 'true') == 0) {
$output .= '< table width = "100%" align = "center" > ';
} else {
$output .= '< table width = "100%" > ';
}
// Check if the user asked for the "extend all" option.
$extend_all_link = '';
@ -83,9 +75,10 @@ if (!empty($_GET['extend_all'])) {
}
if ($origin != 'tracking') {
$output .= "< tr > < td > < h2 > " . get_lang('ScormMystatus') . "< / h2 > < / td > < / tr > " ;
$output .= Display::page_header(get_lang('ScormMystatus')) ;
}
$output .= '< tr > < td > < table border = "0" class = "data_table" > < tr > '.
$output .= '< table class = "data_table" > < tr > ' .
'< th width = "16" > ' . $extend_all_link . '< / td > ' .
'< th colspan = "4" class = "title" > < div class = "mystatusfirstrow" > ' . get_lang('ScormLessonTitle') . "< / div > < / td > " .
'< th colspan = "2" class = "title" > < div class = "mystatusfirstrow" > ' . get_lang('ScormStatus') . "< / div > < / td > " .
@ -140,10 +133,24 @@ if (isset($_GET['lp_id']) && isset($_GET['lp_item_id'])) {
if (Database::num_rows($res_path) > 0) {
if ($origin != 'tracking') {
$sql_attempts = 'SELECT * FROM ' . $tbl_stats_exercices . '
WHERE exe_exo_id="' . (int)$row_path['path'] . '" AND status < > "incomplete" AND exe_user_id="' . api_get_user_id() . '" AND orig_lp_id = "'.(int)$clean_lp_id.'" AND orig_lp_item_id = "'.(int)$clean_lp_item_id.'" AND exe_cours_id="' . $clean_course_code. '" AND session_id = '.$session_id.' ORDER BY exe_date';
WHERE exe_exo_id="' . (int) $row_path['path'] . '" AND
status < > "incomplete" AND
exe_user_id="' . api_get_user_id() . '" AND
orig_lp_id = "' . (int) $clean_lp_id . '" AND
orig_lp_item_id = "' . (int) $clean_lp_item_id . '" AND
exe_cours_id="' . $clean_course_code . '" AND
session_id = ' . $session_id . '
ORDER BY exe_date';
} else {
$sql_attempts = 'SELECT * FROM ' . $tbl_stats_exercices . '
WHERE exe_exo_id="' . (int)$row_path['path'] . '" AND status < > "incomplete" AND exe_user_id="' . $student_id . '" AND orig_lp_id = "'.(int)$clean_lp_id.'" AND orig_lp_item_id = "'.(int)$clean_lp_item_id.'" AND exe_cours_id="' . $clean_course_code. '" AND session_id = '.$session_id.' ORDER BY exe_date';
WHERE exe_exo_id="' . (int) $row_path['path'] . '" AND
status < > "incomplete" AND
exe_user_id="' . $student_id . '" AND
orig_lp_id = "' . (int) $clean_lp_id . '" AND
orig_lp_item_id = "' . (int) $clean_lp_item_id . '" AND
exe_cours_id="' . $clean_course_code . '" AND
session_id = ' . $session_id . '
ORDER BY exe_date';
}
}
//var_dump($sql_attempts);
@ -161,8 +168,7 @@ if (is_array($list) && count($list) > 0) {
// Prepare statement to go through each attempt.
if (!empty($view)) {
$sql = "SELECT
iv.status as mystatus,
$sql = "SELECT iv.status as mystatus,
v.view_count as mycount,
iv.score as myscore,
iv.total_time as mytime,
@ -183,12 +189,12 @@ if (is_array($list) && count($list) > 0) {
i.id = $my_item_id AND
i.lp_id = $lp_id AND
v.user_id = $user_id AND
v.view_count = $view AND v.session_id = $session_id
v.view_count = $view AND
v.session_id = $session_id
ORDER BY iv.view_count $qry_order ";
//var_dump($sql);
} else {
$sql = "SELECT
iv.status as mystatus,
$sql = "SELECT iv.status as mystatus,
v.view_count as mycount,
iv.score as myscore,
iv.total_time as mytime,
@ -233,7 +239,6 @@ if (is_array($list) && count($list) > 0) {
}
}
//echo '< br / > < pre > '; print_r($row); echo '< / pre > < br / > ';
// If there are several attempts, and the link to extend has been clicked, show each attempt...
if (($counter % 2) == 0) {
$oddclass = 'row_odd';
@ -253,7 +258,15 @@ if (is_array($list) && count($list) > 0) {
if ($row['item_type'] != 'dokeos_chapter') {
$correct_test_link = '-';
$title = Security::remove_XSS($title);
$output .= "< tr class = '$oddclass' > " . "< td > $extend_link< / td > " . '< td colspan = "4" class = "content" > < div class = "mystatus" > ' . $title . "< / div > < / td > " . '< td colspan = "2" class = "content" > < / td > '.'< td colspan = "2" class = "content" > < / td > '.'< td colspan = "2" class = "content" > < / td > < td class = "content" > < / td > ' . "< / tr > ";
$output .= '< tr class = "'.$oddclass.'" >
< td > '.$extend_link.'< / td >
< td colspan = "4" class = "content" >
< div class = "mystatus" > '.$title.'< / div >
< / td >
< td colspan = "2" class = "content" > < / td >
< td colspan = "2" class = "content" > < / td >
< td colspan = "2" class = "content" > < / td >
< td class = "content" > < / td > < / tr > ';
}
$counter++;
@ -266,10 +279,10 @@ if (is_array($list) && count($list) > 0) {
if (!empty($_GET['extend_attempt_id']) & & $_GET['extend_attempt_id'] == $row['iv_id']) {
// The extend button for this attempt has been clicked.
$extend_this_attempt = 1;
$extend_attempt_link = '< a href = "' . api_get_self() . '?action=stats&extend_id=' . $my_item_id . '&fold_attempt_id=' . $row['iv_id'] . $url_suffix . '" > < img src = "../img/visible.gif" alt = "'.get_lang('HideAttemptView').'" title = "'.get_lang('HideAttemptView').'" border = "0" > < / a > ' . "\n" ;
$extend_attempt_link = '< a href = "' . api_get_self() . '?action=stats&extend_id=' . $my_item_id . '&fold_attempt_id=' . $row['iv_id'] . $url_suffix . '" > < img src = "../img/visible.gif" alt = "' . get_lang('HideAttemptView') . '" title = "' . get_lang('HideAttemptView') . '" border = "0" > < / a > ' ;
} else { // Same case if fold_attempt_id is set, so not implemented explicitly.
// The extend button for this attempt has not been clicked.
$extend_attempt_link = '< a href = "' . api_get_self() . '?action=stats&extend_id=' . $my_item_id . '&extend_attempt_id=' . $row['iv_id'] . $url_suffix . '" > < img src = "../img/invisible.gif" alt = "'.get_lang('ExtendAttemptView').'" title = "'.get_lang('ExtendAttemptView').'" border = "0" > < / a > ' . "\n" ;
$extend_attempt_link = '< a href = "' . api_get_self() . '?action=stats&extend_id=' . $my_item_id . '&extend_attempt_id=' . $row['iv_id'] . $url_suffix . '" > < img src = "../img/invisible.gif" alt = "' . get_lang('ExtendAttemptView') . '" title = "' . get_lang('ExtendAttemptView') . '" border = "0" > < / a > ' ;
}
}
@ -361,7 +374,6 @@ if (is_array($list) && count($list) > 0) {
} else {
$temp[] = ($score == 0 ? '0/' . $maxscore : ($maxscore == 0 ? $score : $score . '/' . float_format($maxscore, 1)));
}
} else {
$temp[] = ($score == 0 ? '/' : ($maxscore == 0 ? $score : $score . '/' . float_format($maxscore, 1)));
}
@ -409,7 +421,6 @@ if (is_array($list) && count($list) > 0) {
}
}
} while ($row = Database :: fetch_array($result));
} elseif ($num > 0) {
//Not extended
@ -479,9 +490,25 @@ if (is_array($list) && count($list) > 0) {
// Selecting the exe_id from stats attempts tables in order to look the max score value.
if ($origin != 'tracking') {
$sql_last_attempt = 'SELECT * FROM ' . $tbl_stats_exercices . ' WHERE exe_exo_id="' . $row['path'] . '" AND exe_user_id="' . api_get_user_id() . '" AND orig_lp_id = "'.$lp_id.'" AND orig_lp_item_id = "'.$row['myid'].'" AND exe_cours_id="' . $course_code . '" AND status < > "incomplete" AND session_id = '.$session_id.' ORDER BY exe_date DESC limit 1';
} else {
$sql_last_attempt = 'SELECT * FROM ' . $tbl_stats_exercices . ' WHERE exe_exo_id="' . $row['path'] . '" AND exe_user_id="' . $student_id . '" AND orig_lp_id = "'.$lp_id.'" AND orig_lp_item_id = "'.$row['myid'].'" AND exe_cours_id="' . $course_code . '" AND status < > "incomplete" AND session_id = '.$session_id.' ORDER BY exe_date DESC limit 1';
$sql_last_attempt = 'SELECT * FROM ' . $tbl_stats_exercices . '
WHERE exe_exo_id="' . $row['path'] . '" AND
exe_user_id="' . api_get_user_id() . '" AND
orig_lp_id = "' . $lp_id . '" AND
orig_lp_item_id = "' . $row['myid'] . '" AND
exe_cours_id="' . $course_code . '" AND
status < > "incomplete" AND
session_id = ' . $session_id . '
ORDER BY exe_date DESC limit 1';
} else {
$sql_last_attempt = 'SELECT * FROM ' . $tbl_stats_exercices . '
WHERE exe_exo_id="' . $row['path'] . '" AND
exe_user_id="' . $student_id . '" AND
orig_lp_id = "' . $lp_id . '" AND
orig_lp_item_id = "' . $row['myid'] . '" AND
exe_cours_id="' . $course_code . '" AND
status < > "incomplete" AND
session_id = ' . $session_id . '
ORDER BY exe_date DESC limit 1';
}
$resultLastAttempt = Database::query($sql_last_attempt);
@ -499,8 +526,7 @@ if (is_array($list) && count($list) > 0) {
if ($row['item_type'] == 'sco') {
if (!empty($row['myviewmaxscore']) and $row['myviewmaxscore'] > 0) {
$maxscore = $row['myviewmaxscore'];
}
elseif ($row['myviewmaxscore'] === '') {
} elseif ($row['myviewmaxscore'] === '') {
$maxscore = 0;
} else {
$maxscore = $row['mymaxscore'];
@ -509,13 +535,13 @@ if (is_array($list) && count($list) > 0) {
if ($row['item_type'] == 'quiz') {
// Get score and total time from last attempt of a exercise en lp.
$sql = "SELECT score FROM $TBL_LP_ITEM_VIEW
WHERE c_id = $course_id AND lp_item_id = '".(int)$my_id."' and lp_view_id = '".(int)$my_lp_view_id. "'
WHERE c_id = $course_id AND lp_item_id = '" . (int) $my_id . "' AND lp_view_id = '" . (int) $my_lp_view_id . "'
ORDER BY view_count DESC limit 1";
$res_score = Database::query($sql);
$row_score = Database::fetch_array($res_score);
$sql = "SELECT SUM(total_time) as total_time FROM $TBL_LP_ITEM_VIEW
WHERE c_id = $course_id AND lp_item_id = '".(int)$my_id."' and lp_view_id = '".(int)$my_lp_view_id. "'";
WHERE c_id = $course_id AND lp_item_id = '" . (int) $my_id . "' AND lp_view_id = '" . (int) $my_lp_view_id . "'";
$res_time = Database::query($sql);
$row_time = Database::fetch_array($res_time);
@ -529,9 +555,12 @@ if (is_array($list) && count($list) > 0) {
//echo $subtotal_time ;
//$time = learnpathItem :: get_scorm_time('js', $subtotal_time);
// Selecting the max score from an attempt.
$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 AND q.c_id = $course_id )
$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 AND q.c_id = $course_id
)
WHERE exe_id ='$id_last_attempt' ) as t";
$result = Database::query($sql);
@ -621,7 +650,7 @@ if (is_array($list) && count($list) > 0) {
} else {
$output .= ($score == 0 ? '/' : ($maxscore == 0 ? $score : $score . '/' . $maxscore));
}
$output .= " < / div > < / td > " . ' < td colspan = "2" > < div class = "mystatus" > ' . $time . " < / div > < / td > < td > $correct_test_link< / td > " ;
$output .= ' < / div > < / td > < td colspan = "2" > < div class = "mystatus" > ' . $time .' < / div > < / td > < td > '. $correct_test_link.' < / td > ' ;
$output .= "< / tr > ";
}
@ -655,9 +684,19 @@ if (is_array($list) && count($list) > 0) {
} else {
$oddclass = 'row_even';
}
$output .= "< tr class = '$oddclass' > \n" . '< td > < / td > ' . "\n" . '< td > < / td > ' . "\n" . '< td > < / td > ' . "\n" . '< td > ' . $interaction['order_id'] . '< / td > ' . "\n" . '< td > ' . $interaction['id'] . '< / td > ' . "\n"
. '< td colspan = "2" > ' . $interaction['type'] . "< / td > \n"
. '< td > ' . urldecode($interaction['student_response']) . "< / td > \n" . '< td > ' . $interaction['result'] . "< / td > \n" . '< td > ' . $interaction['latency'] . "< / td > \n" . '< td > ' . $interaction['time'] . "< / td > \n< td > < / td > \n< / tr > \n";
$output .= '< tr class = "'.$oddclass.'" >
< td > < / td >
< td > < / td >
< td > < / td >
< td > '.$interaction['order_id'].'< / td >
< td > '.$interaction['id'].'< / td >
< td colspan = "2" > ' . $interaction['type'].'< / td >
< td > '.urldecode($interaction['student_response']).'< / td >
< td > '.$interaction['result'].'< / td >
< td > '.$interaction['latency'].'< / td >
< td > '.$interaction['time'].'< / td >
< td > < / td >
< / tr > ';
$counter++;
}
$list2 = learnpath :: get_iv_objectives_array($row['iv_id']);
@ -667,9 +706,18 @@ if (is_array($list) && count($list) > 0) {
} else {
$oddclass = 'row_even';
}
$output .= "< tr class = '$oddclass' > " . '< td > < / td > ' . '< td > < / td > ' . '< td > < / td > ' . '< td > ' . $interaction['order_id'] . '< / td > '.'< td colspan = "2" > ' . $interaction['objective_id'] . '< / td > '.
'< td colspan = "2" > ' . $interaction['status'] . "< / td > " .
'< td > ' . $interaction['score_raw'] . "< / td > " . '< td > ' . $interaction['score_max'] . "< / td > " . '< td > ' . $interaction['score_min'] . "< / td > \n< td > < / td > \n< / tr > ";
$output .= '< tr class = "'.$oddclass.'" >
< td > < / td >
< td > < / td >
< td > < / td >
< td > ' . $interaction['order_id'] . '< / td >
< td colspan = "2" > '.$interaction['objective_id'] . '< / td >
< td colspan = "2" > ' . $interaction['status'] . '< / td >
< td > ' . $interaction['score_raw'].'< / td >
< td > ' . $interaction['score_max'] .'< / td >
< td > ' . $interaction['score_min'].'< / td >
< td > < / td >
< / tr > ';
$counter++;
}
}
@ -725,9 +773,17 @@ if (is_array($list) && count($list) > 0) {
$my_lesson_status = get_lang($mylanglist['incomplete']);
}
$output .= '< tr class = "'.$oddclass.'" > < td > < / td > < td > '.$extend_attempt_link.'< / td > < td colspan = "3" > ' . get_lang('Attempt') . ' ' . $n . '< / td > '
. '< td colspan = "2" > ' . Display::label($my_lesson_status, $class_status).'< / td > < td colspan = "2" >
< div class = "mystatus" align = "center" > ' . $view_score . '< / div > < / td > < td colspan = "2" > < div class = "mystatus" > ' . $time_attemp . '< / div > < / td > ';
$output .= '< tr class = "' . $oddclass . '" >
< td > < / td >
< td > ' . $extend_attempt_link . '< / td >
< td colspan = "3" > ' . get_lang('Attempt') . ' ' . $n . '< / td >
< td colspan = "2" > ' . Display::label($my_lesson_status, $class_status) . '< / td >
< td colspan = "2" >
< div class = "mystatus" align = "center" > ' . $view_score . '< / div >
< / td >
< td colspan = "2" >
< div class = "mystatus" > ' . $time_attemp . '< / div >
< / td > ';
if ($origin != 'tracking') {
if (!$is_allowed_to_edit & & $result_disabled_ext_all) {
$output .= '< td > < img src = "' . api_get_path(WEB_IMG_PATH) . 'quiz_na.gif" alt = "' . get_lang('ShowAttempt') . '" title = "' . get_lang('ShowAttempt') . '" > < / td > ';
@ -816,11 +872,20 @@ if (($counter % 2) == 0) {
}
//if (empty($extend_all)) {
$output .= "< tr class = '$oddclass' > \n" . "< td > < / td > \n" . '< td colspan = "4" > < div class = "mystatus" > < i > ' . get_lang('AccomplishedStepsTotal') . "< / i > < / div > < / td > \n"
. '< td colspan = "2" > < / td > ' . "\n" . '< td colspan = "2" > < div class = "mystatus" align = "center" > ' . $final_score . "< / div > < / td > \n" . '< td colspan = "2" > < div class = "mystatus" > ' . $total_time . '< / div > < / td > < td > < / td > ' . "\n" . "< / tr > \n";
$output .= '< tr class = "'.$oddclass.'" >
< td > < / td >
< td colspan = "4" >
< div class = "mystatus" > < i > ' . get_lang('AccomplishedStepsTotal') .'< / i > < / div >
< / td >
< td colspan = "2" > < / td >
< td colspan = "2" >
< div class = "mystatus" align = "center" > ' . $final_score.'< / div >
< / td >
< td colspan = "2" > < div class = "mystatus" > ' . $total_time . '< / div > < / td > < td > < / td >
< / tr > ';
//}
$output .= "< / table > < / td > < / tr > < / table > ";
$output .= "< / table > ";
if (!empty($export_csv)) {
$temp = array(