Skip to content

Commit 11d61b7

Browse files
committed
Merge remote-tracking branch 'origin/1.11.x' into 1.11.x
2 parents 68ad7d9 + 6e9152b commit 11d61b7

File tree

16 files changed

+597
-17
lines changed

16 files changed

+597
-17
lines changed

main/admin/index.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@
147147
'url' => 'usergroups.php',
148148
'label' => get_lang('Classes'),
149149
];
150+
$items[] = [
151+
'class' => 'item-user-advanced_edit',
152+
'url' => 'user_advanced_edit.php',
153+
'label' => get_lang('AdvancedUserEdition'),
154+
];
150155
if (api_get_configuration_value('show_link_request_hrm_user')) {
151156
$items[] = [
152157
'class' => 'item-user-linking-requests',
@@ -177,6 +182,11 @@
177182
'label' => get_lang('Classes'),
178183
],
179184
];
185+
$items[] = [
186+
'class' => 'item-user-advanced_edit',
187+
'url' => 'user_advanced_edit.php',
188+
'label' => get_lang('AdvancedUserEdition'),
189+
];
180190

181191
if (api_is_session_admin()) {
182192
if ('true' === api_get_setting('limit_session_admin_role')) {

main/admin/user_advanced_edit.php

Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
1+
<?php
2+
3+
/* For licensing terms, see /license.txt */
4+
5+
$cidReset = true;
6+
require_once __DIR__.'/../inc/global.inc.php';
7+
8+
api_protect_admin_script(true);
9+
10+
$this_section = SECTION_PLATFORM_ADMIN;
11+
$tool_name = get_lang('AdvancedUserEdition');
12+
$message = '';
13+
14+
// Secure GET parameters
15+
$parameters = [];
16+
if (!empty($_GET)) {
17+
foreach ($_GET as $key => $value) {
18+
$parameters[$key] = Security::remove_XSS($value);
19+
}
20+
}
21+
22+
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
23+
24+
// Toolbar actions
25+
$toolbarActions = '';
26+
27+
// Advanced search form
28+
$form = new FormValidator('advancedSearch', 'get', '', '', [], FormValidator::LAYOUT_HORIZONTAL);
29+
$form->addElement('header', '', get_lang('AdvancedSearch'));
30+
$form->addText('keywordUsername', get_lang('LoginName'), false);
31+
$form->addText('keywordEmail', get_lang('Email'), false);
32+
$form->addText('keywordFirstname', get_lang('FirstName'), false);
33+
$form->addText('keywordLastname', get_lang('LastName'), false);
34+
$form->addText('keywordOfficialCode', get_lang('OfficialCode'), false);
35+
36+
$statusOptions = [
37+
'%' => get_lang('All'),
38+
STUDENT => get_lang('Student'),
39+
COURSEMANAGER => get_lang('Teacher'),
40+
DRH => get_lang('Drh'),
41+
SESSIONADMIN => get_lang('SessionsAdmin'),
42+
PLATFORM_ADMIN => get_lang('Administrator')
43+
];
44+
$form->addElement('select', 'keywordStatus', get_lang('Profile'), $statusOptions);
45+
46+
$activeGroup = [];
47+
$activeGroup[] = $form->createElement('checkbox', 'keywordActive', '', get_lang('Active'));
48+
$activeGroup[] = $form->createElement('checkbox', 'keywordInactive', '', get_lang('Inactive'));
49+
$form->addGroup($activeGroup, '', get_lang('ActiveAccount'), null, false);
50+
$form->addButtonSearch(get_lang('SearchUsers'), 'filter');
51+
52+
// Search filters
53+
$searchFilters = [
54+
'keywordFirstname' => $_GET['keywordFirstname'] ?? '',
55+
'keywordLastname' => $_GET['keywordLastname'] ?? '',
56+
'keywordUsername' => $_GET['keywordUsername'] ?? '',
57+
'keywordEmail' => $_GET['keywordEmail'] ?? '',
58+
'keywordOfficialCode' => $_GET['keywordOfficialCode'] ?? '',
59+
'keywordStatus' => $_GET['keywordStatus'] ?? '',
60+
'keywordActive' => $_GET['keywordActive'] ?? '',
61+
'keywordInactive' => $_GET['keywordInactive'] ?? '',
62+
];
63+
64+
$users = [];
65+
if (isset($_GET['filter'])) {
66+
$users = UserManager::searchUsers($searchFilters);
67+
}
68+
69+
$fieldSelector = '';
70+
$jqueryReadyContent = '';
71+
$extraUserField = new ExtraField('user');
72+
if (!empty($users)) {
73+
$extraFields = $extraUserField->get_all(['filter = ?' => 1], 'option_order');
74+
75+
$editableFields = [
76+
'firstname' => get_lang('FirstName'),
77+
'lastname' => get_lang('LastName'),
78+
'email' => get_lang('Email'),
79+
'phone' => get_lang('PhoneNumber'),
80+
'official_code' => get_lang('OfficialCode'),
81+
'status' => get_lang('Profile'),
82+
'active' => get_lang('ActiveAccount'),
83+
'password' => get_lang('Password')
84+
];
85+
86+
foreach ($extraFields as $field) {
87+
$editableFields[$field['variable']] = ucfirst($field['variable']);
88+
}
89+
90+
$form->addElement('select', 'editableFields', get_lang('FieldsToEdit'), $editableFields, [
91+
'multiple' => 'multiple',
92+
'size' => 7
93+
]);
94+
$form->addElement('submit', 'filter', get_lang('Filter'));
95+
}
96+
97+
$tableResult = '';
98+
if (!empty($users)) {
99+
$selectedFields = $_GET['editableFields'] ?? [];
100+
101+
foreach ($users as &$user) {
102+
$userData = api_get_user_info($user['id']);
103+
if ($userData) {
104+
$user = array_merge($user, $userData);
105+
}
106+
107+
$extraFieldValues = new ExtraFieldValue('user');
108+
$userExtraFields = $extraFieldValues->getAllValuesByItem($user['id']);
109+
110+
$formattedExtraFields = [];
111+
foreach ($userExtraFields as $extraField) {
112+
$formattedExtraFields[$extraField['variable']] = $extraField['value'];
113+
}
114+
115+
$user['extra_fields'] = $formattedExtraFields;
116+
}
117+
unset($user);
118+
119+
$userTable = new SortableTable('users', null, null, 0, 50);
120+
$userTable->set_header(0, get_lang('ID'));
121+
$userTable->set_header(1, get_lang('Username'));
122+
123+
foreach ($selectedFields as $field) {
124+
$userTable->set_header(count($userTable->headers), ucfirst($field));
125+
}
126+
127+
$userTable->set_header(count($userTable->headers), get_lang('Actions'));
128+
129+
foreach ($users as $user) {
130+
$row = [$user['id'], $user['username']];
131+
132+
foreach ($selectedFields as $field) {
133+
$value = isset($user[$field]) ? htmlspecialchars($user[$field]) : '';
134+
135+
$extraFieldTypes = [];
136+
foreach ($extraFields as $extraField) {
137+
$extraFieldTypes[$extraField['variable']] = $extraField['field_type'];
138+
}
139+
140+
if (isset($user['extra_fields'][$field])) {
141+
$fieldType = $extraFieldTypes[$field] ?? ExtraField::FIELD_TYPE_TEXT;
142+
$value = htmlspecialchars($user['extra_fields'][$field]);
143+
144+
switch ($fieldType) {
145+
case ExtraField::FIELD_TYPE_TEXTAREA:
146+
$row[] = '<textarea name="extra_'.$field.'['.$user['id'].']" class="form-control">'.$value.'</textarea>';
147+
break;
148+
149+
case ExtraField::FIELD_TYPE_SELECT:
150+
$fieldHtml = '<select name="extra_'.$field.'['.$user['id'].']" class="form-control">';
151+
foreach ($extraField['options'] as $option) {
152+
$selected = ($option['option_value'] == $value) ? 'selected' : '';
153+
$fieldHtml .= '<option value="'.$option['option_value'].'" '.$selected.'>'.$option['display_text'].'</option>';
154+
}
155+
$fieldHtml .= '</select>';
156+
$row[] = $fieldHtml;
157+
break;
158+
159+
case ExtraField::FIELD_TYPE_CHECKBOX:
160+
$checked = ($value == '1') ? 'checked' : '';
161+
$row[] = '<input type="checkbox" name="extra_'.$field.'['.$user['id'].']" value="1" '.$checked.'>';
162+
break;
163+
164+
case ExtraField::FIELD_TYPE_RADIO:
165+
$fieldHtml = '';
166+
foreach ($extraField['options'] as $option) {
167+
$checked = ($option['option_value'] == $value) ? 'checked' : '';
168+
$fieldHtml .= '<label><input type="radio" name="extra_'.$field.'['.$user['id'].']" value="'.$option['option_value'].'" '.$checked.'> '.$option['display_text'].'</label>';
169+
}
170+
$row[] = $fieldHtml;
171+
break;
172+
173+
case ExtraField::FIELD_TYPE_TAG:
174+
175+
$extraTagField = $extraUserField->get_handler_field_info_by_field_variable($field);
176+
$formattedValue = UserManager::get_user_tags_to_string(
177+
$user['id'],
178+
$extraTagField['id'],
179+
false
180+
);
181+
182+
$row[] = '<input type="text" name="extra_'.$field.'['.$user['id'].']" value="'.$formattedValue.'" class="form-control">'.
183+
'<small>'.get_lang('KeywordTip').'</small>';
184+
break;
185+
186+
case ExtraField::FIELD_TYPE_DOUBLE_SELECT:
187+
if (is_array($value) && isset($value["extra_{$field}"]) && isset($value["extra_{$field}_second"])) {
188+
$formattedValue = $value["extra_{$field}"] . ',' . $value["extra_{$field}_second"];
189+
} else {
190+
$formattedValue = '';
191+
}
192+
$row[] = '<input type="text" name="extra_'.$field.'['.$user['id'].']" value="'.$formattedValue.'" class="form-control">'.
193+
'<small>'.get_lang('KeywordTip').'</small>';
194+
break;
195+
196+
default:
197+
$row[] = '<input type="text" name="extra_'.$field.'['.$user['id'].']" value="'.$value.'" class="form-control">';
198+
break;
199+
}
200+
}
201+
else {
202+
if ($field === 'password') {
203+
$row[] = '<input type="password" name="'.$field.'['.$user['id'].']" value="" class="form-control" placeholder="'.get_lang('Password').'">';
204+
}
205+
elseif ($field === 'status') {
206+
$statusOptions = [
207+
STUDENT => get_lang('Student'),
208+
COURSEMANAGER => get_lang('Teacher'),
209+
DRH => get_lang('Drh'),
210+
SESSIONADMIN => get_lang('SessionsAdmin'),
211+
PLATFORM_ADMIN => get_lang('Administrator')
212+
];
213+
$select = '<select name="status['.$user['id'].']" class="form-control">';
214+
foreach ($statusOptions as $key => $label) {
215+
$selected = ($key == $user['status']) ? 'selected' : '';
216+
$select .= '<option value="'.$key.'" '.$selected.'>'.$label.'</option>';
217+
}
218+
$select .= '</select>';
219+
$row[] = $select;
220+
}
221+
elseif ($field === 'active') {
222+
$checkedActive = ($user['active'] == 1) ? 'checked' : '';
223+
$checkedInactive = ($user['active'] == 0) ? 'checked' : '';
224+
$row[] = '<label><input type="radio" name="active['.$user['id'].']" value="1" '.$checkedActive.'> '.get_lang('Active').'</label>
225+
<label><input type="radio" name="active['.$user['id'].']" value="0" '.$checkedInactive.'> '.get_lang('Inactive').'</label>';
226+
}
227+
else {
228+
$row[] = '<input type="text" name="'.$field.'['.$user['id'].']" value="'.$value.'" class="form-control">';
229+
}
230+
}
231+
}
232+
233+
$row[] = '<button class="btn btn-primary saveUser" data-user-id="'.$user['id'].'">'.get_lang('SaveOne').'</button>';
234+
235+
$userTable->addRow($row);
236+
}
237+
238+
$tableResult = $userTable->return_table();
239+
}
240+
241+
$htmlHeadXtra[] = '<script>
242+
$(document).ready(function() {
243+
244+
function getUserData(userId) {
245+
let userData = { user_id: userId };
246+
247+
$("input[name$=\'[" + userId + "]\'], select[name$=\'[" + userId + "]\'], textarea[name$=\'[" + userId + "]\']").each(function() {
248+
let fieldName = $(this).attr("name").replace("[" + userId + "]", "");
249+
userData[fieldName] = $(this).val();
250+
});
251+
252+
$("input[type=\'radio\'][name$=\'[" + userId + "]\']:checked").each(function() {
253+
let fieldName = $(this).attr("name").replace("[" + userId + "]", "");
254+
userData[fieldName] = $(this).val();
255+
});
256+
257+
$("input[type=\'checkbox\'][name$=\'[" + userId + "]\']:checked").each(function() {
258+
let fieldName = $(this).attr("name").replace("[" + userId + "]", "");
259+
userData[fieldName] = "1";
260+
});
261+
262+
$("input[name^=\'extra_[" + userId + "]\'], select[name^=\'extra_[" + userId + "]\'], textarea[name^=\'extra_[" + userId + "]\']").each(function() {
263+
let fieldName = $(this).attr("name").replace("extra_[" + userId + "]", "extra_");
264+
265+
if ($(this).hasClass("tags-input")) {
266+
userData[fieldName] = $(this).val().split(",");
267+
}
268+
else if ($(this).hasClass("doubleselect-input")) {
269+
let values = $(this).val().split(",");
270+
if (values.length === 2) {
271+
userData[fieldName] = values[0];
272+
userData[fieldName + "_second"] = values[1];
273+
}
274+
}
275+
else {
276+
userData[fieldName] = $(this).val();
277+
}
278+
});
279+
280+
return userData;
281+
}
282+
283+
$(".saveUser").click(function() {
284+
let userId = $(this).data("user-id");
285+
if (!userId) {
286+
return;
287+
}
288+
289+
let userData = getUserData(userId);
290+
291+
$.post("'.api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php", {
292+
a: "update_users",
293+
users: JSON.stringify([userData])
294+
}, function(response) {
295+
alert(response.message);
296+
}, "json");
297+
});
298+
299+
$("#saveAll").click(function() {
300+
let usersData = [];
301+
302+
$(".saveUser").each(function() {
303+
let userId = $(this).data("user-id");
304+
let userData = getUserData(userId);
305+
if (userData) usersData.push(userData);
306+
});
307+
308+
if (usersData.length === 0) {
309+
return;
310+
}
311+
312+
$.post("'.api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php", {
313+
a: "update_users",
314+
users: JSON.stringify(usersData)
315+
}, function(response) {
316+
alert(response.message);
317+
}, "json");
318+
});
319+
320+
});
321+
</script>';
322+
323+
$formContent = $form->returnForm();
324+
325+
// Render page
326+
$tpl = new Template($tool_name);
327+
$tpl->assign('actions', $toolbarActions);
328+
$tpl->assign('message', $message);
329+
$tpl->assign('content', $formContent . $fieldSelector . $tableResult . (!empty($users) ? '<button class="btn btn-success" id="saveAll">'.get_lang('SaveAll').'</button>' : ''));
330+
$tpl->display_one_col_template();

main/gradebook/index.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
continue;
4545
}
4646

47-
$exerciseId = $data['id'];
47+
$exerciseId = $data['iid'];
4848
$result = $exercise->read($exerciseId);
4949
if ($result) {
5050
$exercise->generateStats($exerciseId, api_get_course_info(), api_get_session_id());

0 commit comments

Comments
 (0)