@ -22,7 +22,7 @@ $language_file[] = 'tracking';
$language_file[] = 'scorm';
//$cidReset = true; //TODO: delete this line bug 457
// including the global Dokeos file
require '../inc/global.inc.php';
require_once '../inc/global.inc.php';
// the section (for the tabs)
//$this_section = "session_my_space";
@ -131,161 +131,12 @@ if (isset($_GET['additional_profile_field']) && is_numeric($_GET['additional_pro
$user_array[] = $key;
}
//fetching only the user that are loaded NOT ALL user in the portal
$additional_user_profile_info = get_addtional_profile_information_of_field_by_user($_GET['additional_profile_field'],$user_array);
$additional_user_profile_info = TrackingCourseLog:: get_addtional_profile_information_of_field_by_user($_GET['additional_profile_field'],$user_array);
}
function count_item_resources() {
$table_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$table_user = Database :: get_main_table(TABLE_MAIN_USER);
$sql = "SELECT count(tool) AS total_number_of_items FROM $table_item_property track_resource, $table_user user" .
" WHERE track_resource.insert_user_id = user.user_id";
if (isset($_GET['keyword'])) {
$keyword = Database::escape_string(trim($_GET['keyword']));
$sql .= " AND (user.username LIKE '%".$keyword."%' OR lastedit_type LIKE '%".$keyword."%' OR tool LIKE '%".$keyword."%')";
}
$sql .= " AND tool IN ('document', 'learnpath', 'quiz', 'glossary', 'link', 'course_description')";
$res = Database::query($sql, __FILE__, __LINE__);
$obj = Database::fetch_object($res);
return $obj->total_number_of_items;
}
function get_item_resources_data($from, $number_of_items, $column, $direction) {
global $dateTimeFormatLong;
$table_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$table_user = Database :: get_main_table(TABLE_MAIN_USER);
$table_session = Database :: get_main_table(TABLE_MAIN_SESSION);
$sql = "SELECT
tool as col0,
lastedit_type as col1,
ref as ref,
user.username as col3,
insert_date as col5,
visibility as col6
FROM $table_item_property track_resource, $table_user user
WHERE track_resource.insert_user_id = user.user_id ";
if (isset($_GET['keyword'])) {
$keyword = Database::escape_string(trim($_GET['keyword']));
$sql .= " AND (user.username LIKE '%".$keyword."%' OR lastedit_type LIKE '%".$keyword."%' OR tool LIKE '%".$keyword."%') ";
}
$sql .= " AND tool IN ('document', 'learnpath', 'quiz', 'glossary', 'link', 'course_description')";
if ($column == 0) { $column = '0'; }
if ($column != '' & & $direction != '') {
if ($column != 2 & & $column != 4) {
$sql .= " ORDER BY col$column $direction";
}
} else {
$sql .= " ORDER BY col5 DESC ";
}
$sql .= " LIMIT $from, $number_of_items ";
$res = Database::query($sql, __FILE__, __LINE__) or die(mysql_error());
$resources = array ();
while ($row = Database::fetch_array($res)) {
$ref = $row['ref'];
$table_name = get_tool_name_table($row['col0']);
$table_tool = Database :: get_course_table($table_name['table_name']);
$id = $table_name['id_tool'];
$query = "SELECT session.id, session.name, user.username FROM $table_tool tool, $table_session session, $table_user user" .
" WHERE tool.session_id = session.id AND session.id_coach = user.user_id AND tool.$id = $ref";
$recorset = Database::query($query, __FILE__, __LINE__);
if (!empty($recorset)) {
$obj = Database::fetch_object($recorset);
$name_session = '';
$coach_name = '';
if (!empty($obj)) {
$name_session = $obj->name;
$coach_name = $obj->username;
}
$url_tool = api_get_path(WEB_CODE_PATH).$table_name['link_tool'];
$row[0] = '';
if ($row['col6'] != 2) {
$row[0] = '< a href = "'.$url_tool.'?'.api_get_cidreq().'&'.$obj->id.'" > '.api_ucfirst($row['col0']).'< / a > ';
} else {
$row[0] = api_ucfirst($row['col0']);
}
$row[1] = get_lang($row[1]);
$row[5] = api_ucfirst(format_locale_date($dateTimeFormatLong, strtotime($row['col5'])));
$row[4] = '';
if ($table_name['table_name'] == 'document') {
$condition = 'tool.title as title';
$query_document = "SELECT $condition FROM $table_tool tool" .
" WHERE id = $ref";
$rs_document = Database::query($query_document, __FILE__, __LINE__) or die(mysql_error());
$obj_document = Database::fetch_object($rs_document);
$row[4] = $obj_document->title;
}
$row2 = $name_session;
if (!empty($coach_name)) {
$row2 .= '< br / > '.get_lang('Coach').': '.$coach_name;
}
$row[2] = $row2;
$resources[] = $row;
}
}
return $resources;
}
function get_tool_name_table($tool) {
switch ($tool) {
case 'document':
$table_name = TABLE_DOCUMENT;
$link_tool = 'document/document.php';
$id_tool = 'id';
break;
case 'learnpath':
$table_name = TABLE_LP_MAIN;
$link_tool = 'newscorm/lp_controller.php';
$id_tool = 'id';
break;
case 'quiz':
$table_name = TABLE_QUIZ_TEST;
$link_tool = 'exercice/exercice.php';
$id_tool = 'id';
break;
case 'glossary':
$table_name = TABLE_GLOSSARY;
$link_tool = 'glossary/index.php';
$id_tool = 'glossary_id';
break;
case 'link':
$table_name = TABLE_LINK;
$link_tool = 'link/link.php';
$id_tool = 'id';
break;
case 'course_description':
$table_name = TABLE_COURSE_DESCRIPTION;
$link_tool = 'course_description/';
$id_tool = 'id';
break;
default:
$table_name = $tool;
break;
}
return array('table_name' => $table_name,
'link_tool' => $link_tool,
'id_tool' => $id_tool);
}
@ -315,7 +166,7 @@ if($_GET['studentlist'] == 'false') {
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 > ';
}
if($_GET['studentlist'] == 'true' || empty($_GET['studentlist'])) {
echo display_additional_profile_fields();
echo TrackingCourseLog:: display_additional_profile_fields();
}
echo '< / div > ';
@ -660,7 +511,7 @@ if ($_GET['studentlist'] == 'false') {
$course_code = $_course['id'];
$user_ids = array_keys($a_students);
$table = new SortableTable('users_tracking', 'get_number_of_users', 'get_user_data', (api_is_western_name_order() xor api_sort_by_first_name()) ? 3 : 2);
$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['studentlist'] = Security::remove_XSS($_GET['studentlist']);
@ -747,7 +598,7 @@ if ($_GET['studentlist'] == 'false') {
$form->display();
echo '< / div > ';
$table = new SortableTable('resources', 'count_item_resources', 'get_item_resources_data', 5, 20, 'DESC');
$table = new SortableTable('resources', array('TrackingCourseLog', 'count_item_resources') , array('TrackingCourseLog', 'get_item_resources_data') , 5, 20, 'DESC');
$parameters = array();
if (isset($_GET['keyword'])) {
@ -769,246 +620,4 @@ if ($_GET['studentlist'] == 'false') {
?>
< / table >
<?php
Display::display_footer();
/**
* Display all the additionally defined user profile fields
* This function will only display the fields, not the values of the field because it does not act as a filter
* but it adds an additional column instead.
*
* @author Patrick Cool < patrick.cool @ UGent . be > , Ghent University, Belgium
* @since October 2009
* @version 1.8.7
*/
function display_additional_profile_fields() {
// getting all the extra profile fields that are defined by the platform administrator
$extra_fields = UserManager :: get_extra_fields(0,50,5,'ASC');
// creating the form
$return = '< form action = "courseLog.php" method = "get" name = "additional_profile_field_form" id = "additional_profile_field_form" > ';
// the select field with the additional user profile fields (= this is where we select the field of which we want to see
// the information the users have entered or selected.
$return .= '< select name = "additional_profile_field" > ';
$return .= '< option value = "-" > '.get_lang('SelectFieldToAdd').'< / option > ';
foreach ($extra_fields as $key=>$field) {
// show only extra fields that are visible, added by J.Montoya
if ($field[6]==1) {
if ($field[0] == $_GET['additional_profile_field'] ) {
$selected = 'selected="selected"';
} else {
$selected = '';
}
$return .= '< option value = "'.$field[0].'" ' . $ selected . ' > '.$field[3].'< / option > ';
}
}
$return .= '< / select > ';
// the form elements for the $_GET parameters (because the form is passed through GET
foreach ($_GET as $key=>$value){
if ($key < > 'additional_profile_field') {
$return .= '< input type = "hidden" name = "'.$key.'" value = "'.Security::Remove_XSS($value).'" / > ';
}
}
// the submit button
$return .= '< button class = "save" type = "submit" > '.get_lang('AddAdditionalProfileField').'< / button > ';
$return .= '< / form > ';
return $return;
}
/**
* This function gets all the information of a certrain ($field_id) additional profile field.
* It gets the information of all the users so that it can be displayed in the sortable table or in the csv or xls export
*
* @author Patrick Cool < patrick.cool @ UGent . be > , Ghent University, Belgium
* @since October 2009
* @version 1.8.7
*/
function get_addtional_profile_information_of_field($field_id){
// Database table definition
$table_user = Database::get_main_table(TABLE_MAIN_USER);
$table_user_field_values = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
$sql = "SELECT user.user_id, field.field_value FROM $table_user user, $table_user_field_values field
WHERE user.user_id = field.user_id
AND field.field_id='".intval($field_id)."'";
$result = api_sql_query($sql,__FILE__,__LINE__);
while($row = Database::fetch_array($result))
{
$return[$row['user_id']][] = $row['field_value'];
}
return $return;
}
/**
* This function gets all the information of a certrain ($field_id) additional profile field for a specific list of users is more efficent than get_addtional_profile_information_of_field() function
* It gets the information of all the users so that it can be displayed in the sortable table or in the csv or xls export
*
* @author Julio Montoya < gugli100 @ gmail . com >
* @param int field id
* @param array list of user ids
* @return array
* @since Nov 2009
* @version 1.8.6.2
*/
function get_addtional_profile_information_of_field_by_user($field_id, $users) {
// Database table definition
$table_user = Database::get_main_table(TABLE_MAIN_USER);
$table_user_field_values = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES);
$result_extra_field = UserManager::get_extra_field_information($field_id);
if (!empty($users)) {
if ($result_extra_field['field_type'] == USER_FIELD_TYPE_TAG ) {
foreach($users as $user_id) {
$user_result = UserManager::get_user_tags($user_id, $field_id);
$tag_list = array();
foreach($user_result as $item) {
$tag_list[] = $item['tag'];
}
$return[$user_id][] = implode(', ',$tag_list);
}
} else {
$new_user_array = array();
foreach($users as $user_id) {
$new_user_array[]= "'".$user_id."'";
}
$users = implode(',',$new_user_array);
//selecting only the necessary information NOT ALL the user list
$sql = "SELECT user.user_id, field.field_value FROM $table_user user INNER JOIN $table_user_field_values field
ON (user.user_id = field.user_id)
WHERE field.field_id=".intval($field_id)." AND user.user_id IN ($users)";
$result = api_sql_query($sql,__FILE__,__LINE__);
while($row = Database::fetch_array($result)) {
// get option value for field type double select by id
if (!empty($row['field_value'])) {
if ($result_extra_field['field_type'] == USER_FIELD_TYPE_DOUBLE_SELECT) {
$id_double_select = explode(';',$row['field_value']);
if (is_array($id_double_select)) {
$value1 = $result_extra_field['options'][$id_double_select[0]]['option_value'];
$value2 = $result_extra_field['options'][$id_double_select[1]]['option_value'];
$row['field_value'] = ($value1.';'.$value2);
}
}
}
// get other value from extra field
$return[$row['user_id']][] = $row['field_value'];
}
}
}
return $return;
}
/**
* count the number of students in this course (used for SortableTable)
*/
function count_student_in_course() {
global $nbStudents;
return $nbStudents;
}
function sort_users($a, $b) {
return strcmp(trim(api_strtolower($a[$_SESSION['tracking_column']])), trim(api_strtolower($b[$_SESSION['tracking_column']])));
}
function sort_users_desc($a, $b) {
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]=' ';
}
}
$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;
}
Display::display_footer();