diff --git a/main/admin/user_update_import.php b/main/admin/user_update_import.php index b0a89b0fd4..0df09f63ec 100644 --- a/main/admin/user_update_import.php +++ b/main/admin/user_update_import.php @@ -7,6 +7,8 @@ * @package chamilo.admin */ +use Ddeboer\DataImport\Reader\CsvReader; + /** * Validate the imported data. */ @@ -22,52 +24,35 @@ function validate_data($users) $errors = []; $usernames = []; - // 1. Check if mandatory fields are set. - $mandatory_fields = ['LastName', 'FirstName']; - - if (api_get_setting('registration', 'email') == 'true') { - $mandatory_fields[] = 'Email'; - } $classExistList = []; $usergroup = new UserGroup(); foreach ($users as $user) { - foreach ($mandatory_fields as $field) { - if (isset($user[$field])) { - if (empty($user[$field])) { - $user['error'] = get_lang($field.'Mandatory'); - $errors[] = $user; - } - } - } - // 2. Check username, first, check whether it is empty. if (isset($user['NewUserName'])) { if (!UserManager::is_username_empty($user['NewUserName'])) { // 2.1. Check whether username is too long. if (UserManager::is_username_too_long($user['NewUserName'])) { - $user['error'] = get_lang('UserNameTooLong'); - $errors[] = $user; + $errors[$user['UserName']][] = get_lang('UserNameTooLong'); } // 2.2. Check whether the username was used twice in import file. if (isset($usernames[$user['NewUserName']])) { - $user['error'] = get_lang('UserNameUsedTwice'); - $errors[] = $user; + $errors[$user['UserName']][] = get_lang('UserNameUsedTwice'); } $usernames[$user['UserName']] = 1; // 2.3. Check whether username is allready occupied. - if (!UserManager::is_username_available($user['NewUserName']) && $user['NewUserName'] != $user['UserName']) { - $user['error'] = get_lang('UserNameNotAvailable'); - $errors[] = $user; + if (!UserManager::is_username_available($user['NewUserName']) && + $user['NewUserName'] != $user['UserName'] + ) { + $errors[$user['UserName']][] = get_lang('UserNameNotAvailable'); } } } // 3. Check status. if (isset($user['Status']) && !api_status_exists($user['Status'])) { - $user['error'] = get_lang('WrongStatus'); - $errors[] = $user; + $errors[$user['UserName']][] = get_lang('WrongStatus'); } // 4. Check ClassId @@ -79,8 +64,7 @@ function validate_data($users) } $info = $usergroup->get($id); if (empty($info)) { - $user['error'] = sprintf(get_lang('ClassIdDoesntExists'), $id); - $errors[] = $user; + $errors[$user['UserName']][] = sprintf(get_lang('ClassIdDoesntExists'), $id); } else { $classExistList[] = $info['id']; } @@ -90,8 +74,7 @@ function validate_data($users) // 5. Check authentication source if (!empty($user['AuthSource'])) { if (!in_array($user['AuthSource'], $defined_auth_sources)) { - $user['error'] = get_lang('AuthSourceNotAvailable'); - $errors[] = $user; + $errors[$user['UserName']][] = get_lang('AuthSourceNotAvailable'); } } } @@ -99,74 +82,53 @@ function validate_data($users) return $errors; } -/** - * Add missing user-information (which isn't required, like password, username etc). - */ -function complete_missing_data($user) -{ - global $purification_option_for_usernames; - // 1. Create a username if necessary. - if (UserManager::is_username_empty($user['UserName'])) { - $user['UserName'] = UserManager::create_unique_username($user['FirstName'], $user['LastName']); - } else { - $user['UserName'] = UserManager::purify_username($user['UserName'], $purification_option_for_usernames); - } - // 2. Generate a password if necessary. - if (empty($user['Password'])) { - $user['Password'] = api_generate_password(); - } - // 3. Set status if not allready set. - if (empty($user['Status'])) { - $user['Status'] = 'user'; - } - // 4. Set authsource if not allready set. - if (empty($user['AuthSource'])) { - $user['AuthSource'] = PLATFORM_AUTH_SOURCE; - } - - return $user; -} - /** * Update users from the imported data. * - * @param array $users List of users + * @param array $users List of users. + * @param bool $resetPassword Optional. * * @return false|null - * - * @uses \global variable $inserted_in_course, which returns the list of courses the user was inserted in */ -function updateUsers($users) +function updateUsers($users, $resetPassword = false) { - global $insertedIn_course; - // Not all scripts declare the $inserted_in_course array (although they should). - if (!isset($inserted_in_course)) { - $inserted_in_course = []; - } $usergroup = new UserGroup(); - $send_mail = !empty($_POST['sendMail']) ? true : false; + if (is_array($users)) { foreach ($users as $user) { - $user = complete_missing_data($user); - $user['Status'] = api_status_key($user['Status']); - $userName = $user['UserName']; - $userInfo = api_get_user_info_from_username($userName); - $user_id = $userInfo['user_id']; - if ($user_id == 0) { - return false; + if (isset($user['Status'])) { + $user['Status'] = api_status_key($user['Status']); } + + $userInfo = api_get_user_info_from_username($user['UserName']); + + if (empty($userInfo)) { + continue; + } + + $user_id = $userInfo['user_id']; + $firstName = isset($user['FirstName']) ? $user['FirstName'] : $userInfo['firstname']; $lastName = isset($user['LastName']) ? $user['LastName'] : $userInfo['lastname']; $userName = isset($user['NewUserName']) ? $user['NewUserName'] : $userInfo['username']; $changePassMethod = 0; - $password = isset($user['Password']) ? $user['Password'] : ''; - if (!empty($password)) { - $changePassMethod = 2; - } - $authSource = isset($user['AuthSource']) ? $user['AuthSource'] : ''; - if ($changePassMethod === 2 && !empty($authSource) && $authSource != $userInfo['auth_source']) { - $changePassMethod = 3; + $password = null; + $authSource = $userInfo['auth_source']; + + if ($resetPassword) { + $changePassMethod = 1; + } else { + if (isset($user['Password'])) { + $changePassMethod = 2; + $password = $user['Password']; + } + + if (isset($user['AuthSource']) && $user['AuthSource'] != $authSource) { + $authSource = $user['AuthSource']; + $changePassMethod = 3; + } } + $email = isset($user['Email']) ? $user['Email'] : $userInfo['email']; $status = isset($user['Status']) ? $user['Status'] : $userInfo['status']; $officialCode = isset($user['OfficialCode']) ? $user['OfficialCode'] : $userInfo['official_code']; @@ -197,7 +159,7 @@ function updateUsers($users) null, $language, '', - '', + false, $changePassMethod ); if (!empty($user['Courses']) && !is_array($user['Courses'])) { @@ -208,7 +170,6 @@ function updateUsers($users) if (CourseManager::course_exists($course)) { CourseManager::subscribeUser($user_id, $course, $user['Status']); $course_info = CourseManager::get_course_information($course); - $inserted_in_course[$course] = $course_info['title']; } } } @@ -247,16 +208,28 @@ function updateUsers($users) * * @param string $file Path to the CSV-file * + * @throws Exception + * * @return array All userinformation read from the file */ function parse_csv_data($file) { - $users = Import :: csvToArray($file); - foreach ($users as $index => $user) { - if (isset($user['Courses'])) { - $user['Courses'] = explode('|', trim($user['Courses'])); + $file = new SplFileObject($file); + $csv = new CsvReader($file, ';'); + $csv->setHeaderRowNumber(0); + + if (!in_array('UserName', $csv->getColumnHeaders())) { + throw new Exception(get_lang("UserNameMandatory")); + } + + $users = []; + + foreach ($csv as $row) { + if (isset($row['Courses'])) { + $row['Courses'] = explode('|', trim($row['Courses'])); } - $users[$index] = $user; + + $users[] = $row; } return $users; @@ -297,106 +270,86 @@ $interbreadcrumb[] = ["url" => 'index.php', "name" => get_lang('PlatformAdmin')] set_time_limit(0); $extra_fields = UserManager::get_extra_fields(0, 0, 5, 'ASC', true); -$user_id_error = []; -$error_message = ''; -if (isset($_POST['formSent']) && $_POST['formSent'] && $_FILES['import_file']['size'] !== 0) { - $file_type = 'csv'; +$form = new FormValidator('user_update_import', 'post', api_get_self()); +$form->addElement('header', $tool_name); +$form->addFile('import_file', get_lang('ImportFileLocation'), ['accept' => 'text/csv', 'id' => 'import_file']); +$form->addCheckBox('reset_password', '', get_lang('AutoGeneratePassword')); + +if ($form->validate() && Security::check_token('post')) { Security::clear_token(); - $tok = Security::get_token(); - $allowed_file_mimetype = ['csv', 'xml']; - $error_kind_file = false; - $uploadInfo = pathinfo($_FILES['import_file']['name']); - $ext_import_file = $uploadInfo['extension']; - - if (in_array($ext_import_file, $allowed_file_mimetype)) { - if (strcmp($file_type, 'csv') === 0 && $ext_import_file == $allowed_file_mimetype[0]) { - $users = parse_csv_data($_FILES['import_file']['tmp_name']); - $errors = validate_data($users); - $error_kind_file = false; - } elseif (strcmp($file_type, 'xml') === 0 && $ext_import_file == $allowed_file_mimetype[1]) { - $users = parse_xml_data($_FILES['import_file']['tmp_name']); - $errors = validate_data($users); - $error_kind_file = false; - } else { - $error_kind_file = true; - } - } else { - $error_kind_file = true; + $formValues = $form->exportValues(); + + if (empty($_FILES['import_file']) || empty($_FILES['import_file']['size'])) { + header('Location: '.api_get_self()); + exit; } - // List user id with error. - $users_to_insert = $user_id_error = []; + $uploadInfo = pathinfo($_FILES['import_file']['name']); - if (is_array($errors)) { - foreach ($errors as $my_errors) { - $user_id_error[] = $my_errors['UserName']; - } - } + if ($uploadInfo['extension'] !== 'csv') { + Display::addFlash( + Display::return_message(get_lang('YouMustImportAFileAccordingToSelectedOption'), 'error') + ); - if (is_array($users)) { - foreach ($users as $my_user) { - if (!in_array($my_user['UserName'], $user_id_error)) { - $users_to_insert[] = $my_user; - } - } + header('Location: '.api_get_self()); + exit; } - $inserted_in_course = []; - if (strcmp($file_type, 'csv') === 0) { - updateUsers($users_to_insert); - } + try { + $users = parse_csv_data($_FILES['import_file']['tmp_name']); + } catch (Exception $exception) { + Display::addFlash( + Display::return_message($exception->getMessage(), 'error') + ); - if (count($errors) > 0) { - $see_message_import = get_lang('FileImportedJustUsersThatAreNotRegistered'); - } else { - $see_message_import = get_lang('FileImported'); + header('Location: '.api_get_self()); + exit; } - $warning_message = ''; - if (count($errors) != 0) { - $warning_message = ''; } - // if the warning message is too long then we display the warning message trough a session - if (!empty($warning_message)) { - Display::addFlash(Display::return_message($warning_message, 'warning', false)); - } + updateUsers($usersToUpdate, isset($formValues['reset_password'])); - if ($error_kind_file) { - Display::addFlash(Display::return_message(get_lang('YouMustImportAFileAccordingToSelectedOption'), 'error', false)); + if (empty($errors)) { + Display::addFlash( + Display::return_message(get_lang('FileImported'), 'success') + ); } else { - header('Location: '.api_get_path(WEB_CODE_PATH).'admin/user_list.php?sec_token='.$tok); - exit; + $warningMessage = ''; + + foreach ($errors as $errorUsername => $errorUserMessages) { + $warningMessage .= "$errorUsername"; + $warningMessage .= ''; + } + + Display::addFlash( + Display::return_message(get_lang('FileImportedJustUsersThatAreNotRegistered'), 'warning') + ); + Display::addFlash( + Display::return_message($warningMessage, 'warning', false) + ); } -} -Display::display_header($tool_name); -if (!empty($error_message)) { - echo Display::return_message($error_message, 'error'); + header('Location: '.api_get_self()); + exit; } -$form = new FormValidator('user_update_import', 'post', api_get_self()); -$form->addElement('header', $tool_name); -$form->addElement('hidden', 'formSent'); -$form->addElement('file', 'import_file', get_lang('ImportFileLocation')); +Display::display_header($tool_name); -$group = []; +$token = Security::get_token(); +$form->addHidden('sec_token', $token); $form->addButtonImport(get_lang('Import')); -$defaults['formSent'] = 1; -$defaults['sendMail'] = 0; -$defaults['file_type'] = 'csv'; -$form->setDefaults($defaults); $form->display(); $list = [];