Merge pull request #4635 from AngelFQC/BT20575

Tracking: Duplicated users report: Allow export to Excel and CSV
pull/4638/head
Nicolas Ducoulombier 3 years ago committed by GitHub
commit 82c3fdb15f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      main/admin/statistics/index.php
  2. 15
      main/inc/lib/TrackingCourseLog.php
  3. 24
      main/inc/lib/sortable_table.class.php
  4. 82
      main/inc/lib/statistics.lib.php
  5. 11
      main/inc/lib/usermanager.lib.php

@ -1856,12 +1856,30 @@ switch ($report) {
'url' => 'index.php',
];
$additionalExtraFieldsInfo = TrackingCourseLog::getAdditionalProfileExtraFields();
$frmFields = TrackingCourseLog::displayAdditionalProfileFields([], api_get_self());
$table = Statistics::returnDuplicatedUsersTable($additionalExtraFieldsInfo);
if (isset($_GET['action_table'])) {
$data = $table->toArray(true, true);
if ('export_excel' === $_GET['action_table']) {
Export::arrayToXls($data);
} elseif ('export_csv' === $_GET['action_table']) {
Export::arrayToCsv($data);
}
exit;
}
$htmlHeadXtra[] = '<script>'.UserManager::getScriptFunctionForActiveFilter().'</script>';
$content .= Display::page_subheader2(get_lang('DuplicatedUsers'));
$content .= Display::return_message(get_lang('ThisReportOnlyListsUsersThatHaveTheSameFirstnameAndLastname'));
$content .= Statistics::returnDuplicatedUsersTable();
$content .= $frmFields;
$content .= $table->return_table();
break;
}

@ -359,6 +359,21 @@ class TrackingCourseLog
];
}
public static function getAdditionalProfileExtraFields(): array
{
$additionalProfileField = $_GET['additional_profile_field'] ?? [];
$additionalExtraFieldsInfo = [];
$objExtraField = new ExtraField('user');
foreach ($additionalProfileField as $fieldId) {
$additionalExtraFieldsInfo[$fieldId] = $objExtraField->getFieldInfoByFieldId($fieldId);
}
return $additionalExtraFieldsInfo;
}
public static function displayAdditionalProfileFields(array $exclude = [], $formAction = null): string
{
$formAction = $formAction ?: 'courseLog.php';

@ -355,11 +355,31 @@ class SortableTable extends HTML_Table
echo $this->return_table();
}
public function toArray()
public function toArray($applyFilters = false, $stripTags = false)
{
$headers = array_column($this->getHeaders(), 'label');
return array_merge([$headers], $this->table_data);
if ($stripTags) {
$headers = array_map('strip_tags', $headers);
}
if ($applyFilters) {
$data = [];
foreach ($this->table_data as $row) {
$filtered = $this->filter_data($row);
if ($stripTags) {
$filtered = array_map('strip_tags', $filtered);
}
$data[] = $filtered;
}
} else {
$data = $this->table_data;
}
return array_merge([$headers], $data);
}
/**

@ -1785,28 +1785,16 @@ class Statistics
return $results;
}
public static function returnDuplicatedUsersTable(): string
public static function returnDuplicatedUsersTable(array $additionalExtraFieldsInfo): SortableTableFromArray
{
$formFields = TrackingCourseLog::displayAdditionalProfileFields([], api_get_self());
$additionalProfileField = $_GET['additional_profile_field'] ?? [];
$additionalExtraFieldsInfo = [];
$objExtraField = new ExtraField('user');
foreach ($additionalProfileField as $fieldId) {
$additionalExtraFieldsInfo[$fieldId] = $objExtraField->getFieldInfoByFieldId($fieldId);
}
$usersInfo = Statistics::getDuplicatedUsers($additionalExtraFieldsInfo);
$column = 0;
$table = new SortableTableFromArray(array_values($usersInfo));
$table = new SortableTableFromArray($usersInfo);
$table->set_additional_parameters([
'report' => 'duplicated_users',
'additional_profile_field' => $additionalProfileField,
'additional_profile_field' => array_keys($additionalExtraFieldsInfo),
]);
$table->set_header($column++, get_lang('Id'));
@ -1848,16 +1836,39 @@ class Statistics
$table->set_header($column++, $fieldInfo['display_text']);
}
$table->set_header($column, get_lang('Active'));
$table->set_header($column++, get_lang('Active'));
$table->set_column_filter(
$column - 1,
function ($value) {
if ('1' == $value) {
return get_lang('Active');
}
if ('0' == $value) {
return get_lang('Inactive');
}
return get_lang('ActionNotAllowed');
}
);
$table->set_header($column, get_lang('Actions'));
$table->set_column_filter(
$column,
[UserManager::class, 'getActiveFilterForTable']
);
$table->setHideColumn(0);
$table->actionButtons = [
'export_excel' => [
'label' => get_lang('ExportAsXLS'),
'icon' => Display::return_icon('export_excel.png'),
],
'export_csv' => [
'label' => get_lang('ExportAsCSV'),
'icon' => Display::return_icon('export_csv.png'),
],
];
return $formFields
.PHP_EOL
.$table->return_table();
return $table;
}
/**
@ -1921,39 +1932,42 @@ class Statistics
while ($rowUser = Database::fetch_assoc($result)) {
$studentId = $rowUser['id'];
$usersInfo[$studentId] = [];
$usersInfo[$studentId][] = $rowUser['id'];
$studentInfo = [];
$studentInfo[] = $rowUser['id'];
if (api_is_western_name_order()) {
$usersInfo[$studentId][] = $rowStat['firstname'];
$usersInfo[$studentId][] = $rowStat['lastname'];
$studentInfo[] = $rowStat['firstname'];
$studentInfo[] = $rowStat['lastname'];
} else {
$usersInfo[$studentId][] = $rowStat['lastname'];
$usersInfo[$studentId][] = $rowStat['firstname'];
$studentInfo[] = $rowStat['lastname'];
$studentInfo[] = $rowStat['firstname'];
}
$usersInfo[$studentId][] = $rowUser['email'];
$usersInfo[$studentId][] = $rowUser['registration_date'];
$usersInfo[$studentId][] = Tracking::get_first_connection_date(
$studentInfo[] = $rowUser['email'];
$studentInfo[] = $rowUser['registration_date'];
$studentInfo[] = Tracking::get_first_connection_date(
$studentId,
DATE_TIME_FORMAT_LONG
);
$usersInfo[$studentId][] = Tracking::get_last_connection_date(
$studentInfo[] = Tracking::get_last_connection_date(
$studentId,
true,
false,
DATE_TIME_FORMAT_LONG
);
$usersInfo[$studentId][] = $rowUser['status'];
$usersInfo[$studentId][] = Tracking::count_course_per_student($studentId);
$usersInfo[$studentId][] = Tracking::countSessionsPerStudent($studentId);
$studentInfo[] = $rowUser['status'];
$studentInfo[] = Tracking::count_course_per_student($studentId);
$studentInfo[] = Tracking::countSessionsPerStudent($studentId);
foreach ($additionalExtraFieldsInfo as $fieldInfo) {
$extraValue = $objExtraValue->get_values_by_handler_and_field_id($studentId, $fieldInfo['id'], true);
$usersInfo[$studentId][] = $extraValue['value'] ?? null;
$studentInfo[] = $extraValue['value'] ?? null;
}
$usersInfo[$studentId][] = $rowUser['active'];
$studentInfo[] = $rowUser['active']; // once to show status
$studentInfo[] = $rowUser['active']; // twice to show actions
$usersInfo[] = $studentInfo;
}
}

@ -7847,24 +7847,27 @@ SQL;
}
if ('edit' === $action) {
$langAccountExpired = get_lang('AccountExpired');
return Display::return_icon(
$image.'.png',
get_lang('AccountExpired'),
$langAccountExpired,
[],
ICON_SIZE_TINY
);
).'<span class="sr-only" aria-hidden="true">'.$langAccountExpired.'</span>';
}
if ($row['0'] != api_get_user_id()) {
$langAction = get_lang(ucfirst($action));
// you cannot lock yourself out otherwise you could disable all the
// accounts including your own => everybody is locked out and nobody
// can change it anymore.
return Display::return_icon(
$image.'.png',
get_lang(ucfirst($action)),
$langAction,
['onclick' => 'active_user(this);', 'id' => 'img_'.$row['0'], 'style' => 'cursor: pointer;'],
ICON_SIZE_TINY
);
).'<span class="sr-only" aria-hidden="true">'.$langAction.'</span>';
}
return '';

Loading…
Cancel
Save