|
| 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(); |
0 commit comments