Same filename and directory in other branches
  1. 8.9.x core/modules/user/src/RegisterForm.php
  2. 9 core/modules/user/src/RegisterForm.php

Namespace

Drupal\user

File

core/modules/user/src/RegisterForm.php
View source
<?php

namespace Drupal\user;

use Drupal\Core\Form\FormStateInterface;

/**
 * Form handler for the user register forms.
 *
 * @internal
 */
class RegisterForm extends AccountForm {

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {

    /** @var \Drupal\user\UserInterface $account */
    $account = $this->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 <a href=":url">%name</a>. No email has been sent.', [
        ':url' => $account
          ->toUrl()
          ->toString(),
        '%name' => $account
          ->getAccountName(),
      ]));
    }
    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('<front>');
    }
    elseif ($account
      ->isActive() || $notify) {
      if (!$account
        ->getEmail() && $notify) {
        $this
          ->messenger()
          ->addStatus($this
          ->t('The new user <a href=":url">%name</a> 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 <a href=":url">%name</a>.', [
              ':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('<front>');
          }
        }
      }
    }
    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.<br />In the meantime, a welcome message with further instructions has been sent to your email address.'));
      $form_state
        ->setRedirect('<front>');
    }
  }

}

Classes

Namesort descending Description
RegisterForm Form handler for the user register forms.