Admin: Optimize users export to CSV/XML by displacing query complexity - refs BT#20899

pull/4863/head
Yannick Warnier 2 years ago
parent 7e40ef3a95
commit 81886b211a
  1. 26
      main/admin/user_export.php
  2. 52
      main/inc/lib/extra_field.lib.php

@ -183,20 +183,24 @@ if ($form->validate()) {
}
}
$studentData = UserManager::get_extra_user_data(
$user['UserId'],
true,
false
);
foreach ($studentData as $key => $value) {
$key = substr($key, 6);
if (is_array($value)) {
$user[$key] = $value['extra_'.$key];
$data[$user['UserId']] = $user;
}
foreach ($extra_fields as $fieldInfo) {
$extraField = new ExtraField('user');
$default = $extraField->getDefaultValueByFieldId($fieldInfo[0]);
$fieldValues = $extraField->getAllValuesByFieldId($fieldInfo[0]);
foreach ($data as $userId => &$values) {
if (isset($fieldValues[$userId])) {
if (is_array($fieldValues[$userId])) {
$values['extra_'.$fieldInfo[1]] = $fieldValues[$userId];
} else {
$values[$fieldInfo[1]] = $fieldValues[$userId];
}
} else {
$user[$key] = $value;
$values[$fieldInfo[1]] = $default;
}
}
$data[] = $user;
}
switch ($file_type) {

@ -77,6 +77,7 @@ class ExtraField extends Model
public $pageUrl;
public $extraFieldType = 0;
public $table;
public $table_field_options;
public $table_field_values;
public $table_field_tag;
@ -3618,4 +3619,55 @@ JAVASCRIPT;
}
);
}
/**
* For one given field ID, get all the item_id + value
*
* @param int $fieldId
*
* @return array
*/
public function getAllValuesByFieldId(int $fieldId)
{
$type = $this->get_field_type_by_id($fieldId);
$sql = "SELECT item_id, value FROM ".$this->table_field_values." WHERE field_id = $fieldId";
$res = Database::query($sql);
$values = [];
if (Database::num_rows($res) > 0) {
while ($row = Database::fetch_array($res)) {
if (is_null($row['value'])) {
// If the entry exists but is NULL, consider it an empty string (to reproduce the behaviour of UserManager::get_extra_user_data()
$values[$row['item_id']] = '';
} else {
if ($type == UserManager::USER_FIELD_TYPE_SELECT_MULTIPLE) {
$values[$row['item_id']] = explode(';', $row['value']);
} else {
$values[$row['item_id']] = $row['value'];
}
}
}
}
return $values;
}
/**
* Gets the default value for one specific field
*
* @param int $fieldId Field ID
*
* @return mixed Default value for the field (could be null, or usually a string)
*/
public function getDefaultValueByFieldId(int $fieldId)
{
$sql = "SELECT default_value FROM $this->table WHERE id = $fieldId";
$res = Database::query($sql);
if (Database::num_rows($res) > 0) {
$row = Database::fetch_array($res);
return $row['default_value'];
}
return null;
}
}

Loading…
Cancel
Save