entity; // This form is used for two cases: // - Self-register (route = 'user.register'). // - Admin-create (route = 'user.admin_create'). // If the current user has permission to create users then it must be the // second case. $admin = $account->access('create'); // Pass access information to the submit handler. Running an access check // inside the submit function interferes with form processing and breaks // hook_form_alter(). $form['administer_users'] = [ '#type' => 'value', '#value' => $admin, ]; $form['#attached']['library'][] = 'core/drupal.form'; // For non-admin users, populate the form fields using data from the // browser. if (!$admin) { $form['#attributes']['data-user-info-from-browser'] = TRUE; } // Because the user status has security implications, users are blocked by // default when created programmatically and need to be actively activated // if needed. When administrators create users from the user interface, // however, we assume that they should be created as activated by default. if ($admin) { $account->activate(); } // Start with the default user account fields. $form = parent::form($form, $form_state); return $form; } /** * {@inheritdoc} */ protected function actions(array $form, FormStateInterface $form_state) { $element = parent::actions($form, $form_state); $element['submit']['#value'] = $this->t('Create new account'); return $element; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $admin = $form_state->getValue('administer_users'); if (!\Drupal::config('user.settings')->get('verify_mail') || $admin) { $pass = $form_state->getValue('pass'); } else { $pass = \Drupal::service('password_generator')->generate(); } // Remove unneeded values. $form_state->cleanValues(); $form_state->setValue('pass', $pass); $form_state->setValue('init', $form_state->getValue('mail')); parent::submitForm($form, $form_state); } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $account = $this->entity; $pass = $account->getPassword(); $admin = $form_state->getValue('administer_users'); $notify = !$form_state->isValueEmpty('notify'); // Save has no return value so this cannot be tested. // Assume save has gone through correctly. $account->save(); $form_state->set('user', $account); $form_state->setValue('uid', $account->id()); $this->logger('user')->info('New user: %name %email.', ['%name' => $form_state->getValue('name'), '%email' => '<' . $form_state->getValue('mail') . '>', 'type' => $account->toLink($this->t('Edit'), 'edit-form')->toString()]); // Add plain text password into user account to generate mail tokens. $account->password = $pass; // New administrative account without notification. if ($admin && !$notify) { $this->messenger()->addStatus($this->t('Created a new user account for %name. No email has been sent.', [':url' => $account->toUrl()->toString(), '%name' => $account->getAccountName()])); } // No email verification required; log in user immediately. elseif (!$admin && !\Drupal::config('user.settings')->get('verify_mail') && $account->isActive()) { _user_mail_notify('register_no_approval_required', $account); user_login_finalize($account); $this->messenger()->addStatus($this->t('Registration successful. You are now logged in.')); $form_state->setRedirect(''); } // No administrator approval required. elseif ($account->isActive() || $notify) { if (!$account->getEmail() && $notify) { $this->messenger()->addStatus($this->t('The new user %name was created without an email address, so no welcome message was sent.', [':url' => $account->toUrl()->toString(), '%name' => $account->getAccountName()])); } else { $op = $notify ? 'register_admin_created' : 'register_no_approval_required'; if (_user_mail_notify($op, $account)) { if ($notify) { $this->messenger()->addStatus($this->t('A welcome message with further instructions has been emailed to the new user %name.', [':url' => $account->toUrl()->toString(), '%name' => $account->getAccountName()])); } else { $this->messenger()->addStatus($this->t('A welcome message with further instructions has been sent to your email address.')); $form_state->setRedirect(''); } } } } // Administrator approval required. else { _user_mail_notify('register_pending_approval', $account); $this->messenger()->addStatus($this->t('Thank you for applying for an account. Your account is currently pending approval by the site administrator.
In the meantime, a welcome message with further instructions has been sent to your email address.')); $form_state->setRedirect(''); } } }