View source  
  <?php
namespace Drupal\logintoboggan\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\logintoboggan\Utility\LogintobogganUtility;
use Drupal\user\RegisterForm;
use Drupal\Core\Url;
class LogintobogganRegister extends RegisterForm {
  
  public function form(array $form, FormStateInterface $form_state) {
    $user = $this
      ->currentUser();
    
    $account = $this->entity;
    $admin = $user
      ->hasPermission('administer users');
    
    $form['administer_users'] = [
      '#type' => 'value',
      '#value' => $admin,
    ];
    $form['#attached']['library'][] = 'core/drupal.form';
    
    if (!$admin) {
      $form['#attributes']['data-user-info-from-browser'] = TRUE;
    }
    
    if ($admin) {
      $account
        ->activate();
    }
    
    $form = parent::form($form, $form_state, $account);
    
    $mail_confirm = $this
      ->config('logintoboggan.settings')
      ->get('confirm_email_at_registration');
    
    if ($mail_confirm) {
      $form['account']['conf_mail'] = [
        '#type' => 'textfield',
        '#title' => $this
          ->t('Confirm e-mail address'),
        '#weight' => -28,
        '#maxlength' => 64,
        '#description' => $this
          ->t('Please re-type your e-mail address to confirm it is accurate.'),
        '#required' => TRUE,
      ];
      
      $form['account']['name']['#weight'] = -30;
      $form['account']['mail']['#weight'] = -29;
    }
    $pass = $this
      ->config('user.settings')
      ->get('user_email_verification');
    $min_pass = \Drupal::config('logintoboggan.settings')
      ->get('minimum_password_length', 0);
    if ($pass && $min_pass > 0) {
      $form['account']['pass']['#description'] = isset($form['account']['pass']['#description']) ? $form['account']['pass']['#description'] . " " : "";
      $form['account']['pass']['#description'] .= $this
        ->t('Password must be at least %length characters.', [
        '%length' => $min_pass,
      ]);
    }
    return $form;
  }
  
  protected function actions(array $form, FormStateInterface $form_state) {
    $element = parent::actions($form, $form_state);
    $element['submit']['#value'] = $this
      ->t('Create new account');
    return $element;
  }
  
  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 = user_password();
    }
    
    $form_state
      ->cleanValues();
    $form_state
      ->setValue('pass', $pass);
    $form_state
      ->setValue('init', $form_state
      ->getValue('mail'));
    parent::submitForm($form, $form_state);
  }
  
  public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);
    
    if ($this
      ->config('logintoboggan.settings')
      ->get('confirm_email_at_registration') && $form_state
      ->hasValue('conf_mail')) {
      if ($form_state
        ->getValue('mail') != $form_state
        ->getValue('conf_mail')) {
        $form_state
          ->setErrorByName('conf_mail', $this
          ->t('Your e-mail address and confirmed e-mail address must match.'));
      }
    }
  }
  
  public function save(array $form, FormStateInterface $form_state) {
    $account = $this->entity;
    $admin = $form_state
      ->getValue('administer_users');
    $notify = !$form_state
      ->isValueEmpty('notify');
    
    $account
      ->save();
    $form_state
      ->set('user', $account);
    $form_state
      ->setValue('uid', $account
      ->id());
    $this
      ->logger('user')
      ->notice('New user: %name %email.', [
      '%name' => $form_state
        ->getValue('name'),
      '%email' => '<' . $form_state
        ->getValue('mail') . '>',
      'type' => $account
        ->link($this
        ->t('Edit'), 'edit-form'),
    ]);
    $immediate = \Drupal::config('logintoboggan.settings')
      ->get('immediate_login_on_register');
    
    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() && $immediate == '1') {
      user_login_finalize($account);
      
      _user_mail_notify('register_no_approval_required', $account);
      $this
        ->messenger()
        ->addStatus($this
        ->t('Registration successful.'));
      $redirect_setting = \Drupal::config('logintoboggan.settings')
        ->get('redirect_on_register');
      $redirect_on_register = !empty($redirect_setting) ? $redirect_setting : '/';
      $redirect = LogintobogganUtility::processRedirect($redirect_on_register, $account);
      $form_state
        ->setRedirectUrl($redirect);
    }
    elseif ($account
      ->isActive() || $notify) {
      if (!$account
        ->getEmail() && $notify) {
        $this
          ->messenger()
          ->addMessage($this
          ->t('The new user <a href=":url">%name</a> was created
         without an email address so no welcome message was sent', [
          ':url' => Url::fromRoute('entity.user.edit_form', [
            'user' => $account
              ->id(),
          ])
            ->toString(),
          '%name' => $account
            ->get('name')->value,
        ]));
      }
      else {
        $op = $notify ? 'register_admin_created' : 'register_no_approval_required';
        if (_user_mail_notify($op, $account)) {
          if ($notify) {
            $this
              ->messenger()
              ->addMessage($this
              ->t('A welcome message with further instructions
             has been emailed to the new user <a href=":url">%name</a>.', [
              ':url' => Url::fromRoute('entity.user.edit_form', [
                'user' => $account
                  ->id(),
              ])
                ->toString(),
              '%name' => $account
                ->get('name')->value,
            ]));
          }
          else {
            $this
              ->messenger()
              ->addMessage($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()
        ->addMessage($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>');
    }
  }
}