diff --git a/main/tracking/exams.php b/main/tracking/exams.php
index 4a78f2911e..c3e510e6f4 100755
--- a/main/tracking/exams.php
+++ b/main/tracking/exams.php
@@ -14,7 +14,6 @@ require_once api_get_path(LIBRARY_PATH).'pear/Spreadsheet_Excel_Writer/Writer.ph
$toolTable = Database::get_course_table(TABLE_TOOL_LIST);
$quizTable = Database::get_course_table(TABLE_QUIZ_TEST);
-$exerciseStatsTable = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
$this_section = SECTION_TRACKING;
$is_allowedToTrack = $is_courseAdmin || $is_platformAdmin || $is_courseCoach || $is_sessionAdmin;
@@ -47,6 +46,12 @@ if ($global) {
$sessionId = api_get_session_id();
+if (empty($sessionId)) {
+ $sessionCondition = ' AND session_id = 0';
+} else {
+ $sessionCondition = api_get_session_condition($sessionId, true, true);
+}
+
$form = new FormValidator('search_simple', 'POST', '', '', null, false);
$form->addElement('text', 'score', get_lang('Percentage'));
if ($global) {
@@ -54,11 +59,12 @@ if ($global) {
} else {
// Get exam lists
$courseId = api_get_course_int_id();
+
$sql = "SELECT quiz.title, id FROM $quizTable AS quiz
WHERE
c_id = $courseId AND
- active='1' AND
- session_id = $sessionId
+ active='1'
+ $sessionCondition
ORDER BY quiz.title ASC";
$result = Database::query($sql);
@@ -169,8 +175,8 @@ $s_css_class = null;
if (!empty($courseList) && is_array($courseList)) {
foreach ($courseList as $courseInfo) {
- $global_row = $row_not_global = array();
$sessionList = SessionManager::get_session_by_course($courseInfo['code']);
+
$newSessionList = array();
if (!empty($sessionList)) {
foreach ($sessionList as $session) {
@@ -183,10 +189,20 @@ if (!empty($courseList) && is_array($courseList)) {
if ($global) {
$sql = "SELECT count(id) as count
FROM $quizTable AS quiz
- WHERE active='1' AND c_id = $courseId";
+ WHERE active='1' AND c_id = $courseId AND session_id = 0";
$result = Database::query($sql);
$countExercises = Database::store_result($result);
$exerciseCount = $countExercises[0]['count'];
+
+ $sql = "SELECT count(id) as count
+ FROM $quizTable AS quiz
+ WHERE active='1' AND c_id = $courseId AND session_id <> 0";
+ $result = Database::query($sql);
+ $countExercises = Database::store_result($result);
+ $exerciseSessionCount = $countExercises[0]['count'];
+
+ $exerciseCount = $exerciseCount + $exerciseCount *count($newSessionList) + $exerciseSessionCount;
+
// Add course and session list.
if ($exerciseCount == 0) {
$exerciseCount = 2;
@@ -210,256 +226,118 @@ if (!empty($courseList) && is_array($courseList)) {
WHERE c_id = $courseId AND active='1'
ORDER BY session_id, quiz.title ASC";
} else {
+ //$sessionCondition = api_get_session_condition($sessionId, true, false);
if (!empty($exerciseId)) {
$sql = "SELECT quiz.title, id, session_id
FROM $quizTable AS quiz
WHERE
c_id = $courseId AND
- active='1' AND
- id = $exerciseId AND
- session_id = $sessionId
+ active = '1' AND
+ id = $exerciseId
+ $sessionCondition
+
ORDER BY session_id, quiz.title ASC";
} else {
+
$sql = "SELECT quiz.title, id, session_id
FROM $quizTable AS quiz
WHERE
c_id = $courseId AND
- active='1' AND
- session_id = $sessionId
+ active='1'
+ $sessionCondition
ORDER BY session_id, quiz.title ASC";
}
}
$resultExercises = Database::query($sql);
- $i = 0;
if (Database::num_rows($resultExercises) > 0) {
- while ($exercise = Database::fetch_array($resultExercises)) {
- $sessionId = $exercise['session_id'];
-
- if (empty($sessionId)) {
- $students = CourseManager::get_student_list_from_course_code(
- $courseInfo['code'],
- false
- );
- } else {
- $students = CourseManager::get_student_list_from_course_code(
- $courseInfo['code'],
- true,
- $sessionId
- );
- }
-
- $totalStudents = count($students);
-
- $global_row[]= $courseInfo['title'];
-
- if (!$global) {
- $html .= "
";
- }
-
- if (!$global) {
- $html .= '| ';
- } else {
- $html .= ' | ';
- }
-
- $html .= $exercise['title'];
-
- if ($global && !empty($sessionId)) {
- $sessionName = isset($newSessionList[$sessionId]) ? $newSessionList[$sessionId] : null;
- $html .= Display::return_icon('star.png', get_lang('Session')).' ('.$sessionName.')';
- }
-
- $html .= ' | ';
-
- $global_row[] = $exercise['title'];
- $row_not_global['exercise'] = $exercise['title'];
-
- $taken = 0;
- $total_with_parameter = 0;
- $fail = 0;
- $not_taken = 0;
-
- $total_with_parameter_score = 0;
- $total_with_parameter_porcentage = 0;
-
- $student_result = array();
- foreach ($students as $student) {
- $studentId = isset($student['user_id']) ? $student['user_id'] : $student['id_user'];
- $sql = "SELECT COUNT(ex.exe_id) as count
- FROM $exerciseStatsTable AS ex
- WHERE
- ex.exe_cours_id = '".$courseInfo['code']."' AND
- ex.exe_exo_id = ".$exercise['id']." AND
- exe_user_id='".$studentId."' AND
- session_id = $sessionId
- ";
- $result = Database::query($sql);
- $attempts = Database::fetch_array($result);
-
- $sql = "SELECT exe_id, exe_result, exe_weighting
- FROM $exerciseStatsTable
- WHERE
- exe_user_id = ".$studentId." AND
- exe_cours_id = '".$courseInfo['code']."' AND
- exe_exo_id = ".$exercise['id']." AND
- session_id = $sessionId
- ORDER BY exe_result DESC
- LIMIT 1";
- $result = Database::query($sql);
- $score = 0;
- $weighting = 0;
- while ($scoreInfo = Database::fetch_array($result)) {
- $score = $score + $scoreInfo['exe_result'];
- $weighting = $weighting + $scoreInfo['exe_weighting'];
- }
+ $export_array_global = array();
- $percentageScore = 0;
- if ($weighting != 0) {
- $percentageScore = round(($score*100)/$weighting);
- }
-
- $weighting = 0;
-
- if ($i % 2 == 0) {
- $s_css_class = "row_odd";
- } else {
- $s_css_class = "row_even";
- }
- $i++;
-
- if ($attempts['count'] > 0 ) {
- $taken++;
- }
-
- if ($percentageScore >= $filter_score) {
- $total_with_parameter_score++;
- }
-
- $tempArray = array();
-
- if (!$global) {
- $userInfo = api_get_user_info($studentId);
-
- // User
- $userRow = '';
- $userRow .= $userInfo['complete_name'];
- $userRow .= ' | ';
-
- // Best result
-
- if (!empty($attempts['count'])) {
- $userRow .= '';
- $userRow .= $percentageScore;
- $tempArray[] = $percentageScore;
- $userRow .= ' | ';
-
- if ($percentageScore >= $filter_score) {
- $userRow .= '';
- $userRow .= get_lang('PassExam').' | ';
- $tempArray[] = get_lang('PassExam');
- } else {
- $userRow .= '';
- $userRow .= get_lang('ExamFail').' | ';
- $tempArray[] = get_lang('ExamFail');
- }
-
- $userRow .= '';
- $userRow .= $attempts['count'];
- $tempArray[] = $attempts['count'];
- $userRow .= ' | ';
- } else {
- $score = '-';
- $userRow .= '';
- $userRow .= '-';
- $tempArray[] = '-';
- $userRow .= ' | ';
-
- $userRow .= '';
- $userRow .= get_lang('NoAttempt');
- $tempArray[] = get_lang('NoAttempt');
- $userRow .= ' | ';
- $userRow .= '';
- $userRow .= 0;
- $tempArray[] = 0;
- $userRow .= ' | ';
+ while ($exercise = Database::fetch_array($resultExercises)) {
+ $exerciseSessionId = $exercise['session_id'];
+
+ if (empty($exerciseSessionId)) {
+
+ if ($global) {
+ // If the exercise was created in the base course.
+ // Load all sessions.
+ foreach ($newSessionList as $currentSessionId => $sessionName) {
+ $result = processStudentList(
+ $filter_score,
+ $global,
+ $exercise,
+ $courseInfo,
+ $currentSessionId,
+ $newSessionList
+ );
+
+ $html .= $result['html'];
+ $export_array_global = array_merge($export_array_global, $result['export_array_global']);
}
- $userRow .= '
';
- $student_result[$studentId] = array(
- 'html' => $userRow,
- 'score' => $score,
- 'array' => $tempArray,
- 'user' => $userInfo['complete_name']
+ // Load base course.
+ $result = processStudentList(
+ $filter_score,
+ $global,
+ $exercise,
+ $courseInfo,
+ 0,
+ $newSessionList
);
- }
- }
-
- if (!$global) {
- if (!empty($student_result)) {
- $student_result_empty = $student_result_content = array();
- foreach ($student_result as $row) {
- if ($row['score'] == '-') {
- $student_result_empty[] = $row;
- } else {
- $student_result_content[] = $row;
- }
- }
+ $html .= $result['html'];
+ $export_array_global = array_merge($export_array_global, $result['export_array_global']);
+ } else {
- // Sort only users with content
- usort($student_result_content, 'sort_user');
- $student_result = array_merge($student_result_content, $student_result_empty);
+ if (empty($sessionId)) {
+ // Load base course.
+ $result = processStudentList(
+ $filter_score,
+ $global,
+ $exercise,
+ $courseInfo,
+ 0,
+ $newSessionList
+ );
+
+ $html .= $result['html'];
+ $export_array_global = array_merge(
+ $export_array_global,
+ $result['export_array_global']
+ );
+ } else {
- foreach ($student_result as $row) {
- $html .= $row['html'];
- $row_not_global['results'][]= $row['array'];
- $row_not_global['users'][] = $row['user'];
+ $result = processStudentList(
+ $filter_score,
+ $global,
+ $exercise,
+ $courseInfo,
+ $sessionId,
+ $newSessionList
+ );
+
+ $html .= $result['html'];
+ $export_array_global = array_merge(
+ $export_array_global,
+ $result['export_array_global']
+ );
}
- $export_array[] = $row_not_global;
- $row_not_global = array();
- }
- }
-
- if ($global) {
- // Exam taken
- $html .= '';
- $html .= $taken;
- $global_row[]= $taken;
- $html .= ' | ';
-
- // Exam NOT taken
- $html .= '';
- $html .= $not_taken = $totalStudents - $taken;
- $global_row[]= $not_taken;
- $html .= ' | ';
-
- // Exam pass
- if (!empty($total_with_parameter_score)) {
- $html .= '';
- } else {
- $html .= ' | ';
}
- $html .= $total_with_parameter_score;
- $global_row[]= $total_with_parameter_score;
- $html .= ' | ';
-
- // Exam fail
- $html .= '';
-
- $html .= $fail = $taken - $total_with_parameter_score;
- $global_row[]= $fail;
- $html .= ' | ';
-
- $html .= '';
- $html .= $totalStudents;
- $global_row[]= $totalStudents;
+ } else {
+ // If the exercise only exists in this session.
+
+ $result = processStudentList(
+ $filter_score,
+ $global,
+ $exercise,
+ $courseInfo,
+ $exerciseSessionId,
+ $newSessionList
+ );
- $html .= ' | ';
- $html .= '';
- $export_array_global[] = $global_row;
- $global_row = array();
+ $html .= $result['html'];
+ $export_array_global = array_merge($export_array_global, $result['export_array_global']);
}
}
} else {
@@ -587,4 +465,232 @@ function export_complete_report_xls($filename, $array)
$workbook->close();
exit;
}
+
+function processStudentList($filter_score, $global, $exercise, $courseInfo, $sessionId, $newSessionList)
+{
+ $exerciseStatsTable = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+
+ if (empty($sessionId)) {
+ $students = CourseManager::get_student_list_from_course_code(
+ $courseInfo['code'],
+ false
+ );
+ } else {
+ $students = CourseManager::get_student_list_from_course_code(
+ $courseInfo['code'],
+ true,
+ $sessionId
+ );
+ }
+
+ $html = null;
+
+ $totalStudents = count($students);
+
+ if (!$global) {
+ $html .= "";
+ }
+
+ if (!$global) {
+ $html .= '| ';
+ } else {
+ $html .= ' | ';
+ }
+
+ $html .= $exercise['title'];
+
+ if ($global && !empty($sessionId)) {
+ $sessionName = isset($newSessionList[$sessionId]) ? $newSessionList[$sessionId] : null;
+ $html .= Display::return_icon('star.png', get_lang('Session')).' ('.$sessionName.')';
+ }
+
+ $html .= ' | ';
+
+ $globalRow = array(
+ $courseInfo['title'],
+ $exercise['title']
+ );
+
+ $total_with_parameter_score = 0;
+ $taken = 0;
+ $export_array_global = array();
+ $studentResult = array();
+
+ foreach ($students as $student) {
+ $studentId = isset($student['user_id']) ? $student['user_id'] : $student['id_user'];
+ $sql = "SELECT COUNT(ex.exe_id) as count
+ FROM $exerciseStatsTable AS ex
+ WHERE
+ ex.exe_cours_id = '".$courseInfo['code']."' AND
+ ex.exe_exo_id = ".$exercise['id']." AND
+ exe_user_id='".$studentId."' AND
+ session_id = $sessionId
+ ";
+ $result = Database::query($sql);
+ $attempts = Database::fetch_array($result);
+
+ $sql = "SELECT exe_id, exe_result, exe_weighting
+ FROM $exerciseStatsTable
+ WHERE
+ exe_user_id = ".$studentId." AND
+ exe_cours_id = '".$courseInfo['code']."' AND
+ exe_exo_id = ".$exercise['id']." AND
+ session_id = $sessionId
+ ORDER BY exe_result DESC
+ LIMIT 1";
+ $result = Database::query($sql);
+ $score = 0;
+ $weighting = 0;
+ while ($scoreInfo = Database::fetch_array($result)) {
+ $score = $score + $scoreInfo['exe_result'];
+ $weighting = $weighting + $scoreInfo['exe_weighting'];
+ }
+
+ $percentageScore = 0;
+
+ if ($weighting != 0) {
+ $percentageScore = round(($score*100)/$weighting);
+ }
+
+ if ($attempts['count'] > 0 ) {
+ $taken++;
+ }
+
+ if ($percentageScore >= $filter_score) {
+ $total_with_parameter_score++;
+ }
+
+ $tempArray = array();
+
+ if (!$global) {
+ $userInfo = api_get_user_info($studentId);
+
+ // User
+ $userRow = '';
+ $userRow .= $userInfo['complete_name'];
+ $userRow .= ' | ';
+
+ // Best result
+
+ if (!empty($attempts['count'])) {
+ $userRow .= '';
+ $userRow .= $percentageScore;
+ $tempArray[] = $percentageScore;
+ $userRow .= ' | ';
+
+ if ($percentageScore >= $filter_score) {
+ $userRow .= '';
+ $userRow .= get_lang('PassExam').' | ';
+ $tempArray[] = get_lang('PassExam');
+ } else {
+ $userRow .= '';
+ $userRow .= get_lang('ExamFail').' | ';
+ $tempArray[] = get_lang('ExamFail');
+ }
+
+ $userRow .= '';
+ $userRow .= $attempts['count'];
+ $tempArray[] = $attempts['count'];
+ $userRow .= ' | ';
+ } else {
+ $score = '-';
+ $userRow .= '';
+ $userRow .= '-';
+ $tempArray[] = '-';
+ $userRow .= ' | ';
+
+ $userRow .= '';
+ $userRow .= get_lang('NoAttempt');
+ $tempArray[] = get_lang('NoAttempt');
+ $userRow .= ' | ';
+ $userRow .= '';
+ $userRow .= 0;
+ $tempArray[] = 0;
+ $userRow .= ' | ';
+ }
+ $userRow .= '
';
+
+ $studentResult[$studentId] = array(
+ 'html' => $userRow,
+ 'score' => $score,
+ 'array' => $tempArray,
+ 'user' => $userInfo['complete_name']
+ );
+ }
+ }
+
+ $row_not_global['exercise'] = $exercise['title'];
+
+ if (!$global) {
+ if (!empty($studentResult)) {
+ $studentResultEmpty = $studentResultContent = array();
+ foreach ($studentResult as $row) {
+ if ($row['score'] == '-') {
+ $studentResultEmpty[] = $row;
+ } else {
+ $studentResultContent[] = $row;
+ }
+ }
+
+ // Sort only users with content
+ usort($studentResultContent, 'sort_user');
+ $studentResult = array_merge($studentResultContent, $studentResultEmpty);
+
+ foreach ($studentResult as $row) {
+ $html .= $row['html'];
+ $row_not_global['results'][] = $row['array'];
+ $row_not_global['users'][] = $row['user'];
+ }
+ $export_array[] = $row_not_global;
+ }
+ }
+
+
+ if ($global) {
+ // Exam taken
+ $html .= '';
+ $html .= $taken;
+ $globalRow[]= $taken;
+ $html .= ' | ';
+
+ // Exam NOT taken
+ $html .= '';
+ $html .= $not_taken = $totalStudents - $taken;
+ $globalRow[]= $not_taken;
+ $html .= ' | ';
+
+ // Exam pass
+ if (!empty($total_with_parameter_score)) {
+ $html .= '';
+ } else {
+ $html .= ' | ';
+ }
+
+ $html .= $total_with_parameter_score;
+ $globalRow[]= $total_with_parameter_score;
+ $html .= ' | ';
+
+ // Exam fail
+ $html .= '';
+
+ $html .= $fail = $taken - $total_with_parameter_score;
+ $globalRow[]= $fail;
+ $html .= ' | ';
+
+ $html .= '';
+ $html .= $totalStudents;
+ $globalRow[]= $totalStudents;
+
+ $html .= ' | ';
+
+ $html .= '';
+ $export_array_global[] = $globalRow;
+ }
+
+ return array(
+ 'html' => $html,
+ 'export_array_global' => $export_array_global,
+ 'total_students' => $totalStudents
+ );
+}
Display :: display_footer();