parent
c340760360
commit
6cb4af9195
@ -0,0 +1,457 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
use ChamiloSession as Session; |
||||||
|
|
||||||
|
require_once __DIR__.'/../inc/global.inc.php'; |
||||||
|
|
||||||
|
api_protect_course_script(); |
||||||
|
|
||||||
|
$sessionId = api_get_session_id(); |
||||||
|
$courseId = api_get_course_int_id(); |
||||||
|
|
||||||
|
// Access restrictions. |
||||||
|
$is_allowedToTrack = Tracking::isAllowToTrack($sessionId); |
||||||
|
|
||||||
|
if (!$is_allowedToTrack) { |
||||||
|
api_not_allowed(true); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
$action = isset($_GET['action']) ? $_GET['action'] : null; |
||||||
|
$lps = learnpath::getLpList($courseId); |
||||||
|
Session::write('lps', $lps); |
||||||
|
|
||||||
|
/** |
||||||
|
* Prepares the shared SQL query for the user table. |
||||||
|
* See get_user_data() and get_number_of_users(). |
||||||
|
* |
||||||
|
* @param bool $getCount Whether to count, or get data |
||||||
|
* |
||||||
|
* @return string SQL query |
||||||
|
*/ |
||||||
|
function prepare_user_sql_query($getCount) |
||||||
|
{ |
||||||
|
$sql = ''; |
||||||
|
$user_table = Database::get_main_table(TABLE_MAIN_USER); |
||||||
|
$admin_table = Database::get_main_table(TABLE_MAIN_ADMIN); |
||||||
|
|
||||||
|
if ($getCount) { |
||||||
|
$sql .= "SELECT COUNT(u.id) AS total_number_of_items FROM $user_table u"; |
||||||
|
} else { |
||||||
|
$sql .= 'SELECT u.id AS col0, u.official_code AS col2, '; |
||||||
|
|
||||||
|
if (api_is_western_name_order()) { |
||||||
|
$sql .= 'u.firstname AS col3, u.lastname AS col4, '; |
||||||
|
} else { |
||||||
|
$sql .= 'u.lastname AS col3, u.firstname AS col4, '; |
||||||
|
} |
||||||
|
|
||||||
|
$sql .= " u.username AS col5, |
||||||
|
u.email AS col6, |
||||||
|
u.status AS col7, |
||||||
|
u.active AS col8, |
||||||
|
u.registration_date AS col9, |
||||||
|
u.last_login as col10, |
||||||
|
u.id AS col11, |
||||||
|
u.expiration_date AS exp, |
||||||
|
u.password |
||||||
|
FROM $user_table u"; |
||||||
|
} |
||||||
|
|
||||||
|
// adding the filter to see the user's only of the current access_url |
||||||
|
if ((api_is_platform_admin() || api_is_session_admin()) && api_get_multiple_access_url()) { |
||||||
|
$access_url_rel_user_table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); |
||||||
|
$sql .= " INNER JOIN $access_url_rel_user_table url_rel_user |
||||||
|
ON (u.id=url_rel_user.user_id)"; |
||||||
|
} |
||||||
|
|
||||||
|
$keywordList = [ |
||||||
|
'keyword_firstname', |
||||||
|
'keyword_lastname', |
||||||
|
'keyword_username', |
||||||
|
'keyword_email', |
||||||
|
'keyword_officialcode', |
||||||
|
'keyword_status', |
||||||
|
'keyword_active', |
||||||
|
'keyword_inactive', |
||||||
|
'check_easy_passwords', |
||||||
|
]; |
||||||
|
|
||||||
|
$keywordListValues = []; |
||||||
|
$atLeastOne = false; |
||||||
|
foreach ($keywordList as $keyword) { |
||||||
|
$keywordListValues[$keyword] = null; |
||||||
|
if (isset($_GET[$keyword]) && !empty($_GET[$keyword])) { |
||||||
|
$keywordListValues[$keyword] = $_GET[$keyword]; |
||||||
|
$atLeastOne = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($atLeastOne == false) { |
||||||
|
$keywordListValues = []; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($_GET['keyword']) && !empty($_GET['keyword'])) { |
||||||
|
$keywordFiltered = Database::escape_string("%".$_GET['keyword']."%"); |
||||||
|
$sql .= " WHERE ( |
||||||
|
u.firstname LIKE '$keywordFiltered' OR |
||||||
|
u.lastname LIKE '$keywordFiltered' OR |
||||||
|
concat(u.firstname, ' ', u.lastname) LIKE '$keywordFiltered' OR |
||||||
|
concat(u.lastname,' ',u.firstname) LIKE '$keywordFiltered' OR |
||||||
|
u.username LIKE '$keywordFiltered' OR |
||||||
|
u.official_code LIKE '$keywordFiltered' OR |
||||||
|
u.email LIKE '$keywordFiltered' |
||||||
|
) |
||||||
|
"; |
||||||
|
} elseif (isset($keywordListValues) && !empty($keywordListValues)) { |
||||||
|
$query_admin_table = ''; |
||||||
|
$keyword_admin = ''; |
||||||
|
|
||||||
|
if (isset($keywordListValues['keyword_status']) && |
||||||
|
$keywordListValues['keyword_status'] == PLATFORM_ADMIN |
||||||
|
) { |
||||||
|
$query_admin_table = " , $admin_table a "; |
||||||
|
$keyword_admin = ' AND a.user_id = u.id '; |
||||||
|
$keywordListValues['keyword_status'] = '%'; |
||||||
|
} |
||||||
|
|
||||||
|
$keyword_extra_value = ''; |
||||||
|
$sql .= " $query_admin_table |
||||||
|
WHERE ( |
||||||
|
u.firstname LIKE '".Database::escape_string("%".$keywordListValues['keyword_firstname']."%")."' AND |
||||||
|
u.lastname LIKE '".Database::escape_string("%".$keywordListValues['keyword_lastname']."%")."' AND |
||||||
|
u.username LIKE '".Database::escape_string("%".$keywordListValues['keyword_username']."%")."' AND |
||||||
|
u.email LIKE '".Database::escape_string("%".$keywordListValues['keyword_email']."%")."' AND |
||||||
|
u.status LIKE '".Database::escape_string($keywordListValues['keyword_status'])."' "; |
||||||
|
if (!empty($keywordListValues['keyword_officialcode'])) { |
||||||
|
$sql .= " AND u.official_code LIKE '".Database::escape_string("%".$keywordListValues['keyword_officialcode']."%")."' "; |
||||||
|
} |
||||||
|
|
||||||
|
$sql .= " |
||||||
|
$keyword_admin |
||||||
|
$keyword_extra_value |
||||||
|
"; |
||||||
|
|
||||||
|
if (isset($keywordListValues['keyword_active']) && |
||||||
|
!isset($keywordListValues['keyword_inactive']) |
||||||
|
) { |
||||||
|
$sql .= ' AND u.active = 1'; |
||||||
|
} elseif (isset($keywordListValues['keyword_inactive']) && |
||||||
|
!isset($keywordListValues['keyword_active']) |
||||||
|
) { |
||||||
|
$sql .= ' AND u.active = 0'; |
||||||
|
} |
||||||
|
$sql .= ' ) '; |
||||||
|
} |
||||||
|
|
||||||
|
$preventSessionAdminsToManageAllUsers = api_get_setting('prevent_session_admins_to_manage_all_users'); |
||||||
|
if (api_is_session_admin() && $preventSessionAdminsToManageAllUsers === 'true') { |
||||||
|
$sql .= ' AND u.creator_id = '.api_get_user_id(); |
||||||
|
} |
||||||
|
|
||||||
|
$variables = Session::read('variables_to_show', []); |
||||||
|
if (!empty($variables)) { |
||||||
|
$extraField = new ExtraField('user'); |
||||||
|
$extraFieldResult = []; |
||||||
|
$extraFieldHasData = []; |
||||||
|
foreach ($variables as $variable) { |
||||||
|
if (isset($_GET['extra_'.$variable])) { |
||||||
|
if (is_array($_GET['extra_'.$variable])) { |
||||||
|
$values = $_GET['extra_'.$variable]; |
||||||
|
} else { |
||||||
|
$values = [$_GET['extra_'.$variable]]; |
||||||
|
} |
||||||
|
|
||||||
|
if (empty($values)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
$info = $extraField->get_handler_field_info_by_field_variable( |
||||||
|
$variable |
||||||
|
); |
||||||
|
|
||||||
|
if (empty($info)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
foreach ($values as $value) { |
||||||
|
if (empty($value)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if ($info['field_type'] == ExtraField::FIELD_TYPE_TAG) { |
||||||
|
$result = $extraField->getAllUserPerTag( |
||||||
|
$info['id'], |
||||||
|
$value |
||||||
|
); |
||||||
|
$result = empty($result) ? [] : array_column( |
||||||
|
$result, |
||||||
|
'user_id' |
||||||
|
); |
||||||
|
} else { |
||||||
|
$result = UserManager::get_extra_user_data_by_value( |
||||||
|
$variable, |
||||||
|
$value |
||||||
|
); |
||||||
|
} |
||||||
|
$extraFieldHasData[] = true; |
||||||
|
if (!empty($result)) { |
||||||
|
$extraFieldResult = array_merge( |
||||||
|
$extraFieldResult, |
||||||
|
$result |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($extraFieldHasData)) { |
||||||
|
$sql .= " AND (u.id IN ('".implode("','", $extraFieldResult)."')) "; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// adding the filter to see the user's only of the current access_url |
||||||
|
if ((api_is_platform_admin() || api_is_session_admin()) && |
||||||
|
api_get_multiple_access_url() |
||||||
|
) { |
||||||
|
$sql .= ' AND url_rel_user.access_url_id = '.api_get_current_access_url_id(); |
||||||
|
} |
||||||
|
|
||||||
|
return $sql; |
||||||
|
} |
||||||
|
|
||||||
|
function getCount() |
||||||
|
{ |
||||||
|
$sessionId = api_get_session_id(); |
||||||
|
$courseCode = api_get_course_id(); |
||||||
|
|
||||||
|
if (empty($sessionId)) { |
||||||
|
// Registered students in a course outside session. |
||||||
|
$count = CourseManager::get_student_list_from_course_code( |
||||||
|
$courseCode, |
||||||
|
false, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
true |
||||||
|
); |
||||||
|
} else { |
||||||
|
// Registered students in session. |
||||||
|
$count = CourseManager::get_student_list_from_course_code( |
||||||
|
$courseCode, |
||||||
|
true, |
||||||
|
$sessionId, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
true |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return $count; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the users to display on the current page (fill the sortable-table). |
||||||
|
* |
||||||
|
* @param int offset of first user to recover |
||||||
|
* @param int Number of users to get |
||||||
|
* @param int Column to sort on |
||||||
|
* @param string Order (ASC,DESC) |
||||||
|
* |
||||||
|
* @return array Users list |
||||||
|
* |
||||||
|
* @see SortableTable#get_table_data($from) |
||||||
|
*/ |
||||||
|
function getData($from, $numberOfItems, $column, $direction) |
||||||
|
{ |
||||||
|
$sessionId = api_get_session_id(); |
||||||
|
$courseCode = api_get_course_id(); |
||||||
|
$courseId = api_get_course_int_id(); |
||||||
|
|
||||||
|
$lps = Session::read('lps'); |
||||||
|
|
||||||
|
if (empty($sessionId)) { |
||||||
|
// Registered students in a course outside session. |
||||||
|
$students = CourseManager::get_student_list_from_course_code( |
||||||
|
$courseCode, |
||||||
|
false, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
false, |
||||||
|
$from, |
||||||
|
$numberOfItems |
||||||
|
); |
||||||
|
} else { |
||||||
|
// Registered students in session. |
||||||
|
$students = CourseManager::get_student_list_from_course_code( |
||||||
|
$courseCode, |
||||||
|
true, |
||||||
|
$sessionId, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
null, |
||||||
|
false, |
||||||
|
$from, |
||||||
|
$numberOfItems |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
$useNewTable = Tracking::minimumTimeAvailable($sessionId, $courseId); |
||||||
|
|
||||||
|
$users = []; |
||||||
|
foreach ($students as $student) { |
||||||
|
$user = []; |
||||||
|
$userId = $student['id']; |
||||||
|
$user[] = $student['firstname']; |
||||||
|
$user[] = $student['lastname']; |
||||||
|
$user[] = $student['username']; |
||||||
|
|
||||||
|
$lpTimeList = []; |
||||||
|
if ($useNewTable) { |
||||||
|
$lpTimeList = Tracking::getCalculateTime($userId, $courseId, $sessionId); |
||||||
|
} |
||||||
|
foreach ($lps as $lp) { |
||||||
|
$lpId = $lp['id']; |
||||||
|
$progress = Tracking::get_avg_student_progress( |
||||||
|
$userId, |
||||||
|
$courseCode, |
||||||
|
[$lpId], |
||||||
|
$sessionId |
||||||
|
); |
||||||
|
|
||||||
|
if ($useNewTable) { |
||||||
|
$time = isset($lpTimeList[TOOL_LEARNPATH][$lpId]) ? $lpTimeList[TOOL_LEARNPATH][$lpId] : 0; |
||||||
|
} else { |
||||||
|
$time = Tracking::get_time_spent_in_lp( |
||||||
|
$userId, |
||||||
|
$courseCode, |
||||||
|
[$lpId], |
||||||
|
$sessionId |
||||||
|
); |
||||||
|
} |
||||||
|
$time = api_time_to_hms($time); |
||||||
|
|
||||||
|
$first = Tracking::getFirstConnectionTimeInLp( |
||||||
|
$userId, |
||||||
|
$courseCode, |
||||||
|
$lpId, |
||||||
|
$sessionId |
||||||
|
); |
||||||
|
|
||||||
|
$first = api_convert_and_format_date( |
||||||
|
$first, |
||||||
|
DATE_TIME_FORMAT_LONG |
||||||
|
); |
||||||
|
|
||||||
|
$last = Tracking::get_last_connection_time_in_lp( |
||||||
|
$userId, |
||||||
|
$courseCode, |
||||||
|
$lpId, |
||||||
|
$sessionId |
||||||
|
); |
||||||
|
$last = api_convert_and_format_date( |
||||||
|
$last, |
||||||
|
DATE_TIME_FORMAT_LONG |
||||||
|
); |
||||||
|
|
||||||
|
$score = Tracking::getAverageStudentScore( |
||||||
|
$userId, |
||||||
|
$courseCode, |
||||||
|
[$lpId], |
||||||
|
$sessionId |
||||||
|
); |
||||||
|
|
||||||
|
if (is_numeric($score)) { |
||||||
|
$score = $score.'%'; |
||||||
|
} |
||||||
|
|
||||||
|
$user[] = $progress; |
||||||
|
$user[] = $first; |
||||||
|
$user[] = $last; |
||||||
|
$user[] = $time; |
||||||
|
$user[] = $score; |
||||||
|
} |
||||||
|
|
||||||
|
$users[] = $user; |
||||||
|
} |
||||||
|
|
||||||
|
return $users; |
||||||
|
} |
||||||
|
|
||||||
|
$interbreadcrumb[] = [ |
||||||
|
'url' => api_get_path(WEB_CODE_PATH).'tracking/courseLog.php?'.api_get_cidreq(), |
||||||
|
'name' => get_lang('Tracking'), |
||||||
|
]; |
||||||
|
|
||||||
|
$tool_name = get_lang('CourseLPsGenericStats'); |
||||||
|
|
||||||
|
$headers = []; |
||||||
|
$headers[] = get_lang('FirstName'); |
||||||
|
$headers[] = get_lang('LastName'); |
||||||
|
$headers[] = get_lang('Username'); |
||||||
|
foreach ($lps as $lp) { |
||||||
|
$lpName = $lp['name']; |
||||||
|
$headers[] = get_lang('Progress').': '.$lpName; |
||||||
|
$headers[] = get_lang('FirstAccess').': '.$lpName; |
||||||
|
$headers[] = get_lang('LastAccess').': '.$lpName; |
||||||
|
$headers[] = get_lang('Time').': '.$lpName; |
||||||
|
$headers[] = get_lang('Score').': '.$lpName; |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($action)) { |
||||||
|
switch ($action) { |
||||||
|
case 'export': |
||||||
|
$data = getData(0, 100000, null, null); |
||||||
|
$data = array_merge([$headers], $data); |
||||||
|
$name = api_get_course_id().'_'.get_lang('Learnpath').'_'.get_lang('Export'); |
||||||
|
Export::arrayToXls($data, $name); |
||||||
|
exit; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$actionsLeft = TrackingCourseLog::actionsLeft('lp'); |
||||||
|
$actionsCenter = ''; |
||||||
|
$actionsRight = Display::url( |
||||||
|
Display::return_icon('export_excel.png', get_lang('ExportAsXLS'), null, ICON_SIZE_MEDIUM), |
||||||
|
api_get_self().'?action=export&'.api_get_cidreq() |
||||||
|
); |
||||||
|
|
||||||
|
// Create a sortable table with user-data |
||||||
|
$parameters = []; |
||||||
|
$parameters['sec_token'] = Security::get_token(); |
||||||
|
$parameters['cidReq'] = api_get_course_id(); |
||||||
|
$parameters['id_session'] = api_get_session_id(); |
||||||
|
|
||||||
|
$table = new SortableTable( |
||||||
|
'lps', |
||||||
|
'getCount', |
||||||
|
'getData' |
||||||
|
); |
||||||
|
$table->set_additional_parameters($parameters); |
||||||
|
$column = 0; |
||||||
|
foreach ($headers as $header) { |
||||||
|
$lpName = $lp['name']; |
||||||
|
$table->set_header($column++, $header, false); |
||||||
|
} |
||||||
|
|
||||||
|
$tableToString = $table->return_table(); |
||||||
|
$toolbarActions = Display::toolbarAction( |
||||||
|
'toolbarUser', |
||||||
|
[$actionsLeft, $actionsCenter, $actionsRight], |
||||||
|
[4, 4, 4] |
||||||
|
); |
||||||
|
|
||||||
|
$tpl = new Template($tool_name); |
||||||
|
$tpl->assign('actions', $toolbarActions); |
||||||
|
$tpl->assign('content', $tableToString); |
||||||
|
$tpl->display_one_col_template(); |
Loading…
Reference in new issue