added filter by session id for reporting about courses, sessions and users - partial BT#570

skala
Cristian Fasanando 15 years ago
parent 5a24416d01
commit 5a9642a033
  1. 121
      main/gradebook/lib/be/category.class.php
  2. 19
      main/inc/lib/attendance.lib.php
  3. 43
      main/inc/lib/events.lib.inc.php
  4. 956
      main/inc/lib/tracking.lib.php
  5. 4
      main/inc/local.inc.php
  6. 6
      main/mySpace/access_details.php
  7. 149
      main/mySpace/index.php
  8. 896
      main/mySpace/myStudents.php
  9. 84
      main/mySpace/myspace.lib.php
  10. 3
      main/mySpace/student.php
  11. 21
      main/newscorm/learnpathList.class.php
  12. 129
      main/tracking/courseLog.php
  13. 4
      main/tracking/courseLogCSV.php

@ -211,8 +211,11 @@ class Category implements GradebookItem
$sql .= ' visible = '.$visible;
$paramcount ++;
}
$result = Database::query($sql);
$allcat = Category::create_category_objects_from_sql_result($result);
$result = Database::query($sql);
if (Database::num_rows($result) > 0) {
$allcat = Category::create_category_objects_from_sql_result($result);
}
return $allcat;
}
@ -451,47 +454,58 @@ class Category implements GradebookItem
* @return array (score sum, weight sum)
* or null if no scores available
*/
public function calc_score ($stud_id = null) {
public function calc_score ($stud_id = null, $course_code = '', $session_id = null) {
// get appropriate subcategories, evaluations and links
$cats = $this->get_subcategories($stud_id);
$evals = $this->get_evaluations($stud_id);
$links = $this->get_links($stud_id);
if (!empty($course_code)) {
$cats = $this->get_subcategories($stud_id, $course_code, $session_id);
$evals = $this->get_evaluations($stud_id, false, $course_code);
$links = $this->get_links($stud_id, false, $course_code);
} else {
$cats = $this->get_subcategories($stud_id);
$evals = $this->get_evaluations($stud_id);
$links = $this->get_links($stud_id);
}
// calculate score
$rescount = 0;
$ressum = 0;
$weightsum = 0;
foreach ($cats as $cat) {
$catres = $cat->calc_score ($stud_id); // recursive call
if (isset($catres) && $cat->get_weight() != 0) {
$catweight = $cat->get_weight();
$rescount++;
$weightsum += $catweight;
$ressum += (($catres[0]/$catres[1]) * $catweight);
if (!empty($cats)) {
foreach ($cats as $cat) {
$catres = $cat->calc_score ($stud_id); // recursive call
if (isset($catres) && $cat->get_weight() != 0) {
$catweight = $cat->get_weight();
$rescount++;
$weightsum += $catweight;
$ressum += (($catres[0]/$catres[1]) * $catweight);
}
}
}
foreach ($evals as $eval) {
$evalres = $eval->calc_score ($stud_id);
if (isset($evalres) && $eval->get_weight() != 0) {
$evalweight = $eval->get_weight();
$rescount++;
$weightsum += $evalweight;
$ressum += (($evalres[0]/$evalres[1]) * $evalweight);
if (!empty($evals)) {
foreach ($evals as $eval) {
$evalres = $eval->calc_score ($stud_id);
if (isset($evalres) && $eval->get_weight() != 0) {
$evalweight = $eval->get_weight();
$rescount++;
$weightsum += $evalweight;
$ressum += (($evalres[0]/$evalres[1]) * $evalweight);
}
}
}
if (!empty($links)) {
foreach ($links as $link) {
$linkres = $link->calc_score ($stud_id);
if (isset($linkres) && $link->get_weight() != 0) {
$linkweight = $link->get_weight();
$link_res_denom = ($linkres[1]==0) ? 1 : $linkres[1];
$rescount++;
$weightsum += $linkweight;
$ressum += (($linkres[0]/$link_res_denom) * $linkweight);
$linkres = $link->calc_score ($stud_id);
if (isset($linkres) && $link->get_weight() != 0) {
$linkweight = $link->get_weight();
$link_res_denom = ($linkres[1]==0) ? 1 : $linkres[1];
$rescount++;
$weightsum += $linkweight;
$ressum += (($linkres[0]/$link_res_denom) * $linkweight);
}
}
}
@ -926,11 +940,13 @@ class Category implements GradebookItem
$crsindcats = Category::load(null,$creator,'0',$cat_id,
api_is_allowed_to_create_course() ? null : 1);
foreach ($crsindcats as $crsindcat) {
if ($crsindcat->has_evaluations_with_results_for_student($stud_id)) {
$cats[] = $crsindcat;
if (!empty($crsindcats)) {
foreach ($crsindcats as $crsindcat) {
if ($crsindcat->has_evaluations_with_results_for_student($stud_id)) {
$cats[] = $crsindcat;
}
}
}
return $cats;
}
@ -992,17 +1008,20 @@ class Category implements GradebookItem
* @param int $stud_id student id (default: all students)
* @param boolean $recursive process subcategories (default: no recursion)
*/
public function get_evaluations ($stud_id = null, $recursive = false) {
public function get_evaluations ($stud_id = null, $recursive = false, $course_code = '') {
$evals = array();
if (empty($course_code)) {
$course_code = api_get_course_id();
}
// 1 student
if (isset($stud_id)) {
// special case: this is the root
if ($this->id == 0) {
$evals = Evaluation::get_evaluations_with_result_for_student(0,$stud_id);
} else {
//added api_get_course_id()
$evals = Evaluation::load(null,null,api_get_course_id(),$this->id,
$evals = Evaluation::load(null,null,$course_code,$this->id,
api_is_allowed_to_create_course() ? null : 1);
}
} else {// all students
@ -1014,7 +1033,7 @@ class Category implements GradebookItem
}
// inside a course
elseif (isset($this->course_code) && !empty($this->course_code)) {
$evals = Evaluation::load(null, null, api_get_course_id(), $this->id, null);
$evals = Evaluation::load(null, null, $course_code, $this->id, null);
}else { // course independent
$evals = Evaluation::load(null, api_get_user_id(), null, $this->id, null);
@ -1024,17 +1043,19 @@ class Category implements GradebookItem
//platform admin
elseif (api_is_platform_admin()) {
$evals = Evaluation::load(null, null, api_get_course_id(), $this->id, null);
$evals = Evaluation::load(null, null, $course_code, $this->id, null);
}
}
if ($recursive) {
$subcats = $this->get_subcategories($stud_id);
foreach ($subcats as $subcat) {
$subevals = $subcat->get_evaluations($stud_id, true);
//$this->debugprint($subevals);
$evals = array_merge($evals, $subevals);
if (!empty($subcats)) {
foreach ($subcats as $subcat) {
$subevals = $subcat->get_evaluations($stud_id, true);
//$this->debugprint($subevals);
$evals = array_merge($evals, $subevals);
}
}
}
return $evals;
@ -1046,16 +1067,20 @@ class Category implements GradebookItem
* @param int $stud_id student id (default: all students)
* @param boolean $recursive process subcategories (default: no recursion)
*/
public function get_links ($stud_id = null, $recursive = false) {
public function get_links ($stud_id = null, $recursive = false, $course_code = '') {
$links = array();
if (empty($course_code)) {
$course_code = api_get_course_id();
}
// no links in root or course independent categories
if ($this->id == 0) {
;
}
// 1 student $stud_id
elseif (isset($stud_id)) {
$links = LinkFactory::load(null,null,null,null,empty($this->course_code)?null:api_get_course_id(),$this->id,
$links = LinkFactory::load(null,null,null,null,empty($this->course_code)?null:$course_code,$this->id,
api_is_allowed_to_create_course() ? null : 1);
}
// all students -> only for course/platform admin
@ -1065,9 +1090,11 @@ class Category implements GradebookItem
if ($recursive) {
$subcats = $this->get_subcategories($stud_id);
foreach ($subcats as $subcat) {
$sublinks = $subcat->get_links($stud_id, false);
$links = array_merge($links, $sublinks);
if (!empty($subcats)) {
foreach ($subcats as $subcat) {
$sublinks = $subcat->get_links($stud_id, false);
$links = array_merge($links, $sublinks);
}
}
}
return $links;

@ -46,18 +46,24 @@ class Attendance
* @param int session id (optional)
* @return array attendances list
*/
function get_attendances_list($course_code = '', $session_id = 0) {
function get_attendances_list($course_code = '', $session_id = null) {
// initializing database table and variables
$tbl_attendance = Database :: get_course_table(TABLE_ATTENDANCE);
$session_id = intval($session_id);
$tbl_attendance = Database :: get_course_table(TABLE_ATTENDANCE);
$data = array();
if (!empty($course_code)) {
$course_info = api_get_course_info($course_code);
$tbl_attendance = Database :: get_course_table(TABLE_ATTENDANCE, $course_info['dbName']);
}
$condition_session = '';
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = ' WHERE session_id = '.$session_id;
}
// get attendance data
$sql = "SELECT * FROM $tbl_attendance WHERE session_id='$session_id'";
$sql = "SELECT * FROM $tbl_attendance $condition_session ";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0){
while ($row = Database::fetch_array($rs)) {
@ -519,9 +525,10 @@ class Attendance
/**
* Get results of faults average by course
* @param int user id
* @param int Session id (optional)
* @return array results containing number of faults, total done attendance, porcent of faults and color depend on result (red, orange)
*/
public function get_faults_average_by_course($user_id, $course_code) {
public function get_faults_average_by_course($user_id, $course_code, $session_id = null) {
// Database tables and variables
@ -530,7 +537,7 @@ class Attendance
$user_id = intval($user_id);
$results = array();
$total_faults = $total_weight = $porcent = 0;
$attendances_by_course = $this->get_attendances_list($course_code);
$attendances_by_course = $this->get_attendances_list($course_code, $session_id);
foreach ($attendances_by_course as $attendance) {
// get total faults and total weight

@ -148,11 +148,13 @@ function event_access_course()
$sql = "INSERT INTO ".$TABLETRACK_ACCESS."
(access_user_id,
access_cours_code,
access_date)
access_date,
access_session_id)
VALUES
(".$user_id.",
'".$_cid."',
FROM_UNIXTIME(".$reallyNow."))";
FROM_UNIXTIME(".$reallyNow."),
'".$id_session."')";
$res = Database::query($sql);
// added for "what's new" notification
$sql = " UPDATE $TABLETRACK_LASTACCESS
@ -261,30 +263,28 @@ function event_access_tool($tool, $id_session=0)
*/
function event_download($doc_url)
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_DOWNLOADS;
global $_configuration, $_user, $_cid;
$tbl_stats_downloads = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_DOWNLOADS);
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
if (!$_configuration['tracking_enabled']) {
return 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
if ($_user['user_id']) {
$user_id = "'".$_user['user_id']."'";
} else {
$user_id = "0";
}
$sql = "INSERT INTO ".$TABLETRACK_DOWNLOADS."
$sql = "INSERT INTO $tbl_stats_downloads
(
down_user_id,
down_cours_id,
down_doc_path,
down_date
down_date,
down_session_id
)
VALUES
@ -292,7 +292,8 @@ function event_download($doc_url)
".$user_id.",
'".$_cid."',
'".htmlspecialchars($doc_url, ENT_QUOTES)."',
FROM_UNIXTIME(".$reallyNow.")
FROM_UNIXTIME(".$reallyNow."),
'".api_get_session_id()."'
)";
$res = Database::query($sql);
return 1;
@ -326,13 +327,15 @@ function event_upload($doc_id)
( upload_user_id,
upload_cours_id,
upload_work_id,
upload_date
upload_date,
updload_session_id
)
VALUES (
".$user_id.",
'".$_cid."',
'".$doc_id."',
FROM_UNIXTIME(".$reallyNow.")
FROM_UNIXTIME(".$reallyNow."),
'".api_get_session_id()."'
)";
$res = Database::query($sql);
return 1;
@ -346,9 +349,7 @@ function event_upload($doc_id)
*/
function event_link($link_id)
{
global $_configuration;
global $_user;
global $_cid;
global $_configuration, $_user, $_cid;
global $TABLETRACK_LINKS;
// if tracking is disabled record nothing
@ -368,14 +369,16 @@ function event_link($link_id)
( links_user_id,
links_cours_id,
links_link_id,
links_date
links_date,
links_session_id
)
VALUES
(
".$user_id.",
'".$_cid."',
'".Database::escape_string($link_id)."',
FROM_UNIXTIME(".$reallyNow.")
FROM_UNIXTIME(".$reallyNow."),
'".api_get_session_id()."'
)";
$res = Database::query($sql);
return 1;

File diff suppressed because it is too large Load Diff

@ -810,8 +810,8 @@ if (isset($cidReset) && $cidReset) { // course session data refresh requested or
//We add a new record in the course tracking table
$course_tracking_table = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$time = api_get_datetime();
$sql="INSERT INTO $course_tracking_table(course_code, user_id, login_course_date, logout_course_date, counter)" .
"VALUES('".$_course['sysCode']."', '".$_user['user_id']."', '$time', '$time', '1')";
$sql="INSERT INTO $course_tracking_table(course_code, user_id, login_course_date, logout_course_date, counter, session_id)" .
"VALUES('".$_course['sysCode']."', '".$_user['user_id']."', '$time', '$time', '1', ".intval($_SESSION['id_session']).")";
Database::query($sql);
}

@ -31,10 +31,12 @@ $this_section = "session_my_space";
/* MAIN */
$user_id = Security::remove_XSS($_REQUEST['student']);
$user_id = intval($_REQUEST['student']);
$course_code = Security::remove_XSS($_REQUEST['course']);
$session_id = intval($_GET['id_session']);
$connections = MySpace::get_connections_to_course($user_id, $course_code, $session_id);
$connections = MySpace::get_connections_to_course($user_id, $course_code);
if (api_is_xml_http_request()) {
$type = Security::remove_XSS($_GET['type']);
$main_year = $main_month_year = $main_day = array();

@ -74,6 +74,28 @@ function rsort_users($a, $b) {
return api_strcmp(trim(api_strtolower($b[$_SESSION['tracking_column']])), trim(api_strtolower($a[$_SESSION['tracking_column']])));
}
function count_sessions_coached() {
global $nb_sessions;
return $nb_sessions;
}
function sort_sessions($a, $b) {
global $tracking_column;
if ($a[$tracking_column] > $b[$tracking_column]) {
return 1;
} else {
return -1;
}
}
function rsort_sessions($a, $b) {
global $tracking_column;
if ($b[$tracking_column] > $a[$tracking_column]) {
return 1;
} else {
return -1;
}
}
/**************************
* MAIN CODE
@ -81,47 +103,47 @@ function rsort_users($a, $b) {
$is_coach = api_is_coach();
$is_platform_admin = api_is_platform_admin();
$is_drh = api_is_drh();
$view = isset($_GET['view']) ? $_GET['view'] : 'teacher';
// get views
$views = array('admin', 'teacher', 'coach', 'drh');
$view = 'teacher';
if (isset($_GET['view']) && in_array($_GET['view'], $views)) {
$view = $_GET['view'];
}
$menu_items = array();
$nb_teacher_courses = 0;
global $_configuration;
// interbreadcrumbs
if (api_is_allowed_to_create_course()) {
$sql_nb_cours = "SELECT course_rel_user.course_code, course.title
FROM $tbl_course_user as course_rel_user
INNER JOIN $tbl_course as course
ON course.code = course_rel_user.course_code
WHERE course_rel_user.user_id='".$_user['user_id']."' AND course_rel_user.status='1'
ORDER BY course.title";
if ($_configuration['multiple_access_urls'] == true) {
$tbl_course_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$sql_nb_cours = " SELECT course_rel_user.course_code, course.title
FROM $tbl_course_user as course_rel_user
INNER JOIN $tbl_course as course
ON course.code = course_rel_user.course_code
INNER JOIN $tbl_course_rel_access_url course_rel_url
ON (course_rel_url.course_code= course.code)
WHERE access_url_id = $access_url_id AND course_rel_user.user_id='".$_user['user_id']."' AND course_rel_user.status='1'
ORDER BY course.title";
}
$session_id = intval($_GET['session_id']);
if (!empty($session_id)) {
$courses = Tracking::get_courses_followed_by_coach($_user['user_id'], $session_id);
} else {
$courses = CourseManager::get_course_list_of_user_as_course_admin($_user['user_id']);
}
$result_nb_cours = Database::query($sql_nb_cours);
$courses = Database::store_result($result_nb_cours);
$nb_teacher_courses = count($courses);
$sessions = Tracking::get_sessions_coached_by_user($_user['user_id']);
$nb_sessions = count($sessions);
if ($nb_teacher_courses) {
if (!$is_coach && !$is_platform_admin) {
$view = 'teacher';
}
if ($view == 'teacher') {
if ($view == 'teacher' && empty($session_id)) {
$menu_items[] = get_lang('TeacherInterface');
$title = get_lang('YourCourseList');
} else {
$title = get_lang('YourCourseList');
} else {
if (!empty($session_id)) {
$session_name = api_get_session_name($session_id);
$title = ucfirst($session_name);
}
$menu_items[] = '<a href="'.api_get_self().'?view=teacher">'.get_lang('TeacherInterface').'</a>';
}
}
@ -140,7 +162,7 @@ if ($is_coach) {
}
if ($is_platform_admin) {
if (!$is_coach && $nb_teacher_courses == 0) {
if ((!$is_coach || !$is_drh) && $nb_teacher_courses == 0) {
$view = 'admin';
}
if ($view == 'admin') {
@ -151,14 +173,15 @@ if ($is_platform_admin) {
}
}
if (api_is_drh()) {
$view = 'drh_students';
if ($is_drh) {
$view = 'drh';
$menu_items[] = get_lang('Students');
$menu_items[] = '<a href="teachers.php">'.get_lang('Trainers').'</a>';
$menu_items[] = '<a href="course.php">'.get_lang('Courses').'</a>';
$menu_items[] = '<a href="session.php">'.get_lang('Sessions').'</a>';
}
// actions menu
echo '<div class="actions-title" style ="font-size:10pt;">';
$nb_menu_items = count($menu_items);
if ($nb_menu_items > 1) {
@ -179,7 +202,7 @@ if ($view == 'admin') {
echo '</div>';
echo '<h4>'.$title.'</h4>';
if (api_is_drh() && $view == 'drh_students') {
if ($is_drh && $view == 'drh') {
// get data for human resources manager
$students = array_keys(UserManager::get_users_followed_by_drh($_user['user_id'], STUDENT));
$courses_of_the_platform = CourseManager :: get_real_course_list();
@ -193,7 +216,7 @@ if ($is_coach && $view == 'coach') {
$courses = Tracking :: get_courses_followed_by_coach($_user['user_id']);
}
if ($view == 'coach' || $view == 'drh_students') {
if ($view == 'coach' || $view == 'drh') {
$nb_students = count($students);
$total_time_spent = 0;
@ -205,15 +228,8 @@ if ($view == 'coach' || $view == 'drh_students') {
foreach ($students as $student_id) {
// inactive students
$last_connection_date = Tracking :: get_last_connection_date($student_id, true, true);
if ($last_connection_date != false) {
/*
list($last_connection_date, $last_connection_hour) = explode(' ', $last_connection_date);
$last_connection_date = explode('-', $last_connection_date);
$last_connection_hour = explode(':', $last_connection_hour);
$last_connection_hour[0];
$last_connection_time = mktime($last_connection_hour[0], $last_connection_hour[1], $last_connection_hour[2], $last_connection_date[1], $last_connection_date[2], $last_connection_date[0]);
*/
if (time() - (3600 * 24 * 7) > $last_connection_time) {
if ($last_connection_date !== false) {
if (time() - (3600 * 24 * 7) > $last_connection_date) {
$nb_inactive_students++;
}
} else {
@ -480,6 +496,57 @@ if (api_is_allowed_to_create_course() && $view == 'teacher') {
);
$table->display();
}
// display sessions
if ($nb_sessions > 0 && !isset($_GET['session_id'])) {
echo '<h4>'.get_lang('Sessions').'</h4>';
$table = new SortableTable('tracking_sessions', 'count_sessions_coached');
$table->set_header(0, get_lang('Title'));
$table->set_header(1, get_lang('Date'));
$table->set_header(2, get_lang('NbCoursesPerSession'));
$table->set_header(3, get_lang('Details'), false);
$all_data = array();
foreach ($sessions as $session) {
$count_courses_in_session = count(Tracking::get_courses_followed_by_coach($_user['user_id'], $session['id']));
$row = array();
$row[] = $session['name'];
if ($session['date_start'] != '0000-00-00' && $session['date_end'] != '0000-00-00') {
$row[] = get_lang('From').' '.format_locale_date(get_lang('DateFormatLongWithoutDay'), strtotime($session['date_start'])).' '.get_lang('To').' '.format_locale_date(get_lang('DateFormatLongWithoutDay'), strtotime($session['date_end']));
} else {
$row[] = ' - ';
}
$row[] = $count_courses_in_session;
$row[] = '<a href="'.api_get_self().'?session_id='.$session['id'].'"><img src="'.api_get_path(WEB_IMG_PATH).'2rightarrow.gif" border="0" /></a>';
$all_data[] = $row;
}
if (!isset($tracking_column)) {
$tracking_column = 0;
}
if ($_GET['tracking_direction'] == 'DESC') {
usort($all_data, 'rsort_sessions');
} else {
usort($all_data, 'sort_sessions');
}
if ($export_csv) {
usort($csv_content, 'sort_sessions');
}
foreach ($all_data as $row) {
$table -> addRow($row);
}
$table -> setColAttributes(1, array('align' => 'center'));
$table -> setColAttributes(2, array('align' => 'center'));
$table -> setColAttributes(3, array('align' => 'center'));
$table -> display();
}
}
if ($is_platform_admin && $view == 'admin') {

File diff suppressed because it is too large Load Diff

@ -49,23 +49,30 @@ class MySpace {
/**
* Gets the connections to a course as an array of login and logout time
*
* @param int unknown_type $user_id
* @param string unknown_type $course_code
* @return unknown
* @param int User ud
* @param string Course code
* @param int Session id (optional, default = 0)
* @return array Conections
*/
function get_connections_to_course($user_id, $course_code) {
function get_connections_to_course($user_id, $course_code, $session_id = 0) {
// Database table definitions
$tbl_track_course = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$tbl_main = Database :: get_main_table(TABLE_MAIN_COURSE);
$sql_query = 'SELECT visual_code as course_code FROM '.$tbl_main.' c WHERE code="'.Database::escape_string($course_code).'";';
// protect data
$user_id = intval($user_id);
$course_code = Database::escape_string($course_code);
$session_id = intval($session_id);
$sql_query = 'SELECT visual_code as course_code FROM '.$tbl_main.' c WHERE code="'.$course_code.'";';
$result = Database::query($sql_query);
$row_query = Database::fetch_array($result, 'ASSOC');
$course_true = isset($row_query['course_code']) ? $row_query['course_code']: $course_code;
$sql = 'SELECT login_course_date, logout_course_date FROM ' . $tbl_track_course . '
WHERE user_id = ' . intval($user_id) . '
AND course_code="' . Database::escape_string($course_true) . '" ORDER BY login_course_date ASC';
WHERE user_id = '.$user_id.'
AND course_code="'.$course_true.'" AND session_id = '.$session_id.' ORDER BY login_course_date ASC';
$rs = Database::query($sql);
$connections = array();
@ -492,20 +499,25 @@ class MySpace {
*/
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;
global $courses, $csv_content, $charset, $session_id;
// definition database tables
$tbl_course = Database :: get_main_table(TABLE_MAIN_COURSE);
$tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
$tbl_session_course_user = Database :: get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$a_course_students = array();
$course_data = array();
$arr_course = $courses;
foreach ($arr_course as &$cours) {
$cours = "'{$cours[course_code]}'";
$courses_code = array_keys($courses);
foreach ($courses_code as &$code) {
$code = "'$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).")";
WHERE course.code IN (".implode(',',$courses_code).")";
if (!in_array($direction, array('ASC','DESC'))) $direction = 'ASC';
$column = intval($column);
@ -520,32 +532,31 @@ class MySpace {
$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);
// students directly subscribed to the course
if (empty($session_id)) {
$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'";
} else {
$sql = "SELECT id_user as user_id FROM $tbl_session_course_user srcu WHERE srcu. course_code='$course_code' AND id_session = '$session_id' AND srcu.status<>2";
}
$rs = Database::query($sql);
$users = array();
while ($row = Database::fetch_array($rs)) {
$users[] = $row['user_id'];
}
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_assignments_in_course = Tracking::count_student_assignments($users, $course_code, $session_id);
$avg_messages_in_course = Tracking::count_student_messages($users, $course_code, $session_id);
$avg_progress_in_course = Tracking::get_avg_student_progress($users, $course_code, array(), $session_id);
$avg_score_in_course = Tracking :: get_avg_student_score($users, $course_code, array(), $session_id);
$avg_score_in_exercise = Tracking::get_avg_student_exercise_score($users, $course_code, 0, $session_id);
$avg_time_spent_in_course = Tracking::get_time_spent_on_the_course($users, $course_code, $session_id);
$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_time_spent_in_course = api_time_to_hms($avg_time_spent_in_course / $nb_students_in_course);
} else {
$avg_time_spent_in_course = null;
$avg_progress_in_course = null;
@ -563,8 +574,9 @@ class MySpace {
$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>';
//set the "from" value to know if I access the Reporting by the chamilo tab or the course link
$table_row[] = '<center><a href="../tracking/courseLog.php?cidReq='.$course_code.'&studentlist=true&from=myspace&id_session='.$session_id.'"><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,

@ -114,7 +114,7 @@ if ($isCoach || api_is_platform_admin() || api_is_drh()) {
}
}
$menu_items[] = get_lang('Students');
$menu_items[] = '<a href="index.php?view=drh_students">'.get_lang('Students').'</a>';
$menu_items[] = '<a href="teachers.php">'.get_lang('Trainers').'</a>';
$menu_items[] = '<a href="course.php">'.get_lang('Courses').'</a>';
$menu_items[] = '<a href="session.php">'.get_lang('Sessions').'</a>';
@ -134,6 +134,7 @@ if ($isCoach || api_is_platform_admin() || api_is_drh()) {
echo '<a href="'.api_get_self().'?export=csv"><img align="absbottom" src="../img/excel.gif">&nbsp;'.get_lang('ExportAsCSV').'</a>';
}
echo '</div>';
echo '<h4>'.get_lang('YourStudentsList').'</h4>';
} else {
echo '<div align="left" style="float:left"><h4>'.$title.'</h4></div>
<div align="right">

@ -24,20 +24,27 @@ class learnpathList {
* (only displays) items if he has enough permissions to view them.
* @param integer User ID
* @param string Optional course code (otherwise we use api_get_course_id())
* @param int Optional session id (otherwise we use api_get_session_id())
* @return void
*/
function learnpathList($user_id,$course_code='') {
if(!empty($course_code)){
//proceed with course code given
}else{
$course_code = api_get_course_id();
$lp_table = Database::get_course_table(TABLE_LP_MAIN);
function learnpathList($user_id, $course_code='', $session_id = null) {
if (!empty($course_code)){
$course_info = api_get_course_info($course_code);
$lp_table = Database::get_course_table(TABLE_LP_MAIN, $course_info['dbName']);
} else{
$course_code = api_get_course_id();
$lp_table = Database::get_course_table(TABLE_LP_MAIN);
}
$this->course_code = $course_code;
$this->user_id = $user_id;
//condition for the session
$session_id = api_get_session_id();
if (isset($session_id)) {
$session_id = intval($session_id);
} else {
$session_id = api_get_session_id();
}
$condition_session = api_get_session_condition($session_id, false);
$sql = "SELECT * FROM $lp_table $condition_session ORDER BY display_order ASC, name ASC";

@ -59,9 +59,11 @@ require api_get_path(SYS_CODE_PATH).'resourcelinker/resourcelinker.inc.php';
// starting the output buffering when we are exporting the information
$export_csv = isset($_GET['export']) && $_GET['export'] == 'csv' ? true : false;
$session_id = intval($_REQUEST['id_session']);
if ($export_csv) {
if (isset($_REQUEST['id_session']) && $_REQUEST['id_session'] != 0 ) {
$_SESSION['id_session'] = intval($_REQUEST['id_session']);
if (!empty($session_id)) {
$_SESSION['id_session'] = $session_id;
}
ob_start();
}
@ -71,7 +73,7 @@ $csv_content = array();
if (!empty($_GET['scormcontopen'])) {
$tbl_lp = Database::get_course_table(TABLE_LP_MAIN);
$contopen = (int) $_GET['scormcontopen'];
$sql = "SELECT default_encoding FROM $tbl_lp WHERE id = ".$contopen;
$sql = "SELECT default_encoding FROM $tbl_lp WHERE id = $contopen AND session_id = $session_id";
$res = Database::query($sql);
$row = Database::fetch_array($res);
$lp_charset = $row['default_encoding'];
@ -134,13 +136,6 @@ if (isset($_GET['additional_profile_field']) && is_numeric($_GET['additional_pro
$additional_user_profile_info = TrackingCourseLog::get_addtional_profile_information_of_field_by_user($_GET['additional_profile_field'],$user_array);
}
/*
==============================================================================
MAIN CODE
@ -163,7 +158,7 @@ if($_GET['studentlist'] == 'false') {
if (isset($_GET['additional_profile_field'])) {
$addional_param ='additional_profile_field='.intval($_GET['additional_profile_field']);
}
echo '<a href="'.api_get_self().'?'.api_get_cidreq().'&id_session='.api_get_session_id().'&export=csv&'.$addional_param.'">'.Display::return_icon('csv.gif',get_lang('ExportAsCSV')).get_lang('ExportAsCSV').'</a>';
echo '<a href="'.api_get_self().'?'.api_get_cidreq().'&export=csv&'.$addional_param.'">'.Display::return_icon('csv.gif',get_lang('ExportAsCSV')).get_lang('ExportAsCSV').'</a>';
}
if($_GET['studentlist'] == 'true' || empty($_GET['studentlist'])) {
echo TrackingCourseLog::display_additional_profile_fields();
@ -172,6 +167,8 @@ echo '</div>';
if ($_GET['studentlist'] == 'false') {
$course_code = api_get_course_id();
echo'<br /><br />';
// learning path tracking
@ -179,7 +176,7 @@ if ($_GET['studentlist'] == 'false') {
<h4>'.Display::return_icon('scormbuilder.gif',get_lang('AverageProgressInLearnpath')).get_lang('AverageProgressInLearnpath').'</h4>
<table class="data_table">';
$list = new LearnpathList($student);
$list = new LearnpathList($student, $course_code, $session_id);
$flat_list = $list->get_flat_list();
if ($export_csv) {
@ -193,7 +190,7 @@ if ($_GET['studentlist'] == 'false') {
$lp_avg_progress = 0;
foreach ($a_students as $student_id => $student) {
// get the progress in learning pathes
$lp_avg_progress += learnpath::get_db_progress($lp_id, $student_id);
$lp_avg_progress += Tracking::get_avg_student_progress($student_id, $course_code, array($lp_id), $session_id);
}
if ($nbStudents > 0) {
$lp_avg_progress = $lp_avg_progress / $nbStudents;
@ -228,7 +225,7 @@ if ($_GET['studentlist'] == 'false') {
<table class="data_table">';
$sql = "SELECT id, title
FROM $TABLEQUIZ WHERE active <> -1";
FROM $TABLEQUIZ WHERE active <> -1 AND session_id = $session_id";
$rs = Database::query($sql);
if ($export_csv) {
@ -238,43 +235,13 @@ if ($_GET['studentlist'] == 'false') {
}
if (Database::num_rows($rs) > 0) {
// gets course actual administrators
$sql = "SELECT user.user_id FROM $table_user user, $TABLECOURSUSER course_user
WHERE course_user.user_id=user.user_id AND course_user.course_code='".api_get_course_id()."' AND course_user.status <> '1' AND course_user.relation_type<>".COURSE_RELATION_TYPE_RRHH." ";
$res = Database::query($sql);
$student_ids = array();
while($row = Database::fetch_row($res)) {
$student_ids[] = $row[0];
}
$student_ids = array_keys($a_students);
$count_students = count($student_ids);
while ($quiz = Database::fetch_array($rs)) {
$quiz_avg_score = 0;
if ($count_students > 0) {
foreach ($student_ids as $student_id) {
// get the scorn in exercises
$sql = 'SELECT exe_result , exe_weighting
FROM '.$TABLETRACK_EXERCISES.'
WHERE exe_exo_id = '.$quiz['id'].'
AND exe_user_id = '.(int)$student_id.'
AND exe_cours_id = "'.api_get_course_id().'"
AND orig_lp_id = 0
AND orig_lp_item_id = 0
ORDER BY exe_date DESC';
$rsAttempt = Database::query($sql);
$nb_attempts = 0;
$avg_student_score = 0;
while ($attempt = Database::fetch_array($rsAttempt)) {
$nb_attempts++;
$exe_weight = $attempt['exe_weighting'];
if ($exe_weight > 0) {
$avg_student_score += round(($attempt['exe_result'] / $exe_weight * 100), 2);
}
}
if ($nb_attempts > 0) {
$avg_student_score = $avg_student_score / $nb_attempts;
}
foreach ($student_ids as $student_id) {
$avg_student_score = Tracking::get_avg_student_exercise_score($student_id, $course_code, $quiz['id'], $session_id);
$quiz_avg_score += $avg_student_score;
}
}
@ -296,14 +263,13 @@ if ($_GET['studentlist'] == 'false') {
echo '</table></div>';
echo '<div class="clear"></div>';
// forums tracking
// forums tracking
echo '<div class="report_section">
<h4>'.Display::return_icon('forum.gif', get_lang('Forum')).get_lang('Forum').'&nbsp;-&nbsp;<a href="../forum/index.php?cidReq='.$_course['id'].'">'.get_lang('SeeDetail').'</a></h4>
<table class="data_table">';
$count_number_of_posts_by_course = Tracking :: count_number_of_posts_by_course($_course['id']);
$count_number_of_forums_by_course = Tracking :: count_number_of_forums_by_course($_course['id']);
$count_number_of_threads_by_course = Tracking :: count_number_of_threads_by_course($_course['id']);
$count_number_of_posts_by_course = Tracking :: count_number_of_posts_by_course($course_code, $session_id);
$count_number_of_forums_by_course = Tracking :: count_number_of_forums_by_course($course_code, $session_id);
$count_number_of_threads_by_course = Tracking :: count_number_of_threads_by_course($course_code, $session_id);
if ($export_csv) {
$csv_content[] = array(get_lang('Forum'), '');
$csv_content[] = array(get_lang('ForumForumsNumber', ''), $count_number_of_forums_by_course);
@ -321,7 +287,7 @@ if ($_GET['studentlist'] == 'false') {
echo '<div class="report_section">
<h4>'.Display::return_icon('chat.gif',get_lang('Chat')).get_lang('Chat').'</h4>
<table class="data_table">';
$chat_connections_during_last_x_days_by_course = Tracking :: chat_connections_during_last_x_days_by_course($_course['id'], 7);
$chat_connections_during_last_x_days_by_course = Tracking::chat_connections_during_last_x_days_by_course($course_code, 7, $session_id);
if ($export_csv) {
$csv_content[] = array(get_lang('Chat', ''), '');
$csv_content[] = array(sprintf(get_lang('ChatConnectionsDuringLastXDays', ''), '7'), $chat_connections_during_last_x_days_by_course);
@ -335,29 +301,24 @@ if ($_GET['studentlist'] == 'false') {
echo '<div class="report_section">
<h4>'.Display::return_icon('acces_tool.gif', get_lang('ToolsMostUsed')).get_lang('ToolsMostUsed').'</h4>
<table class="data_table">';
$sql = "SELECT access_tool, COUNT(DISTINCT access_user_id),count( access_tool ) as count_access_tool
FROM $TABLETRACK_ACCESS
WHERE access_tool IS NOT NULL
AND access_cours_code = '$_cid'
GROUP BY access_tool
ORDER BY count_access_tool DESC
LIMIT 0, 3";
$rs = Database::query($sql);
$tools_most_used = Tracking::get_tools_most_used_by_course($course_code, $session_id);
if ($export_csv) {
$temp = array(get_lang('ToolsMostUsed'), '');
$csv_content[] = $temp;
}
while ($row = Database::fetch_array($rs)) {
echo ' <tr>
<td>'.get_lang(ucfirst($row['access_tool'])).'</td>
<td align="right">'.$row['count_access_tool'].' '.get_lang('Clicks').'</td>
</tr>';
if ($export_csv) {
$temp = array(get_lang(ucfirst($row['access_tool']), ''), $row['count_access_tool'].' '.get_lang('Clicks', ''));
$csv_content[] = $temp;
if (!empty($tools_most_used)) {
foreach ($tools_most_used as $row) {
echo ' <tr>
<td>'.get_lang(ucfirst($row['access_tool'])).'</td>
<td align="right">'.$row['count_access_tool'].' '.get_lang('Clicks').'</td>
</tr>';
if ($export_csv) {
$temp = array(get_lang(ucfirst($row['access_tool']), ''), $row['count_access_tool'].' '.get_lang('Clicks', ''));
$csv_content[] = $temp;
}
}
}
@ -377,13 +338,7 @@ if ($_GET['studentlist'] == 'false') {
<h4>'.Display::return_icon('documents.gif',get_lang('DocumentsMostDownloaded')).'&nbsp;'.get_lang('DocumentsMostDownloaded').$link.'</h4>
<table class="data_table">';
$sql = "SELECT down_doc_path, COUNT(DISTINCT down_user_id), COUNT(down_doc_path) as count_down
FROM $TABLETRACK_DOWNLOADS
WHERE down_cours_id = '$_cid'
GROUP BY down_doc_path
ORDER BY count_down DESC
LIMIT 0, $num";
$rs = Database::query($sql);
$documents_most_downloaded = Tracking::get_documents_most_downloaded_by_course($course_code, $session_id, $num);
if ($export_csv) {
$temp = array(get_lang('DocumentsMostDownloaded', ''), '');
@ -391,8 +346,8 @@ if ($_GET['studentlist'] == 'false') {
$csv_content[] = $temp;
}
if (Database::num_rows($rs) > 0) {
while($row = Database::fetch_array($rs)) {
if (!empty($documents_most_downloaded)) {
foreach ($documents_most_downloaded as $row) {
echo ' <tr>
<td>'.$row['down_doc_path'].'</td>
<td align="right">'.$row['count_down'].' '.get_lang('Clicks').'</td>
@ -418,14 +373,7 @@ if ($_GET['studentlist'] == 'false') {
<h4>'.Display::return_icon('link.gif',get_lang('LinksMostClicked')).'&nbsp;'.get_lang('LinksMostClicked').'</h4>
<table class="data_table">';
$sql = "SELECT cl.title, cl.url,count(DISTINCT sl.links_user_id), count(cl.title) as count_visits
FROM $TABLETRACK_LINKS AS sl, $TABLECOURSE_LINKS AS cl
WHERE sl.links_link_id = cl.id
AND sl.links_cours_id = '$_cid'
GROUP BY cl.title, cl.url
ORDER BY count_visits DESC
LIMIT 0, 3";
$rs = Database::query($sql);
$links_most_visited = Tracking::get_links_most_visited_by_course($course_code, $session_id);
if ($export_csv) {
$temp = array(get_lang('LinksMostClicked'),'');
@ -433,8 +381,8 @@ if ($_GET['studentlist'] == 'false') {
$csv_content[] = $temp;
}
if (Database::num_rows($rs) > 0) {
while ($row = Database::fetch_array($rs)) {
if (!empty($links_most_visited)) {
foreach ($links_most_visited as $row) {
echo ' <tr>
<td>'.$row['title'].'</td>
<td align="right">'.$row['count_visits'].' '.get_lang('Clicks').'</td>
@ -514,8 +462,9 @@ if ($_GET['studentlist'] == 'false') {
$table = new SortableTable('users_tracking', array('TrackingCourseLog','get_number_of_users'), array('TrackingCourseLog','get_user_data'), (api_is_western_name_order() xor api_sort_by_first_name()) ? 3 : 2);
$parameters['cidReq'] = Security::remove_XSS($_GET['cidReq']);
$parameters['id_session'] = $session_id;
$parameters['studentlist'] = Security::remove_XSS($_GET['studentlist']);
$parameters['from'] = Security::remove_XSS($_GET['myspace']);
$parameters['from'] = Security::remove_XSS($_GET['myspace']);
$table->set_additional_parameters($parameters);

@ -187,12 +187,12 @@ if($is_allowedToTrack && $_configuration['tracking_enabled'])
//--------------------------------BEGIN first/last access
// first access
$sql = "SELECT access_date FROM $TABLETRACK_ACCESS_2 WHERE `access_user_id` = '".$results[$j][0]."' AND `access_cours_code` = '".$_course['official_code']."' AND `access_tool` = 'learnpath' ORDER BY access_id ASC LIMIT 1";
$sql = "SELECT access_date FROM $TABLETRACK_ACCESS_2 WHERE access_user_id = '".$results[$j][0]."' AND access_cours_code = '".$_course['official_code']."' AND access_tool = 'learnpath' AND access_session_id = '".api_get_session_id()."' ORDER BY access_id ASC LIMIT 1";
$first_access = getOneResult($sql);
$first_access = empty($first_access) ? "-" : date('d.m.y',strtotime($first_access));
// last access
$sql = "SELECT access_date FROM $TABLETRACK_ACCESS WHERE `access_user_id` = '".$results[$j][0]."' AND `access_cours_code` = '".$_course['official_code']."' AND `access_tool` = 'learnpath'";
$sql = "SELECT access_date FROM $TABLETRACK_ACCESS WHERE access_user_id = '".$results[$j][0]."' AND access_cours_code = '".$_course['official_code']."' AND access_tool = 'learnpath'";
$last_access = getOneResult($sql);
$last_access = empty($last_access) ? "-" : date('d.m.y',strtotime($last_access));
//--------------------------------END first/last access

Loading…
Cancel
Save