You are here

public function Login::validatePaneForm in Commerce Core 8.2

Validates the pane form.

Parameters

array $pane_form: The pane form.

\Drupal\Core\Form\FormStateInterface $form_state: The form state of the parent form.

array $complete_form: The complete form structure.

Overrides CheckoutPaneBase::validatePaneForm

File

modules/checkout/src/Plugin/Commerce/CheckoutPane/Login.php, line 324

Class

Login
Provides the login pane.

Namespace

Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane

Code

public function validatePaneForm(array &$pane_form, FormStateInterface $form_state, array &$complete_form) {
  $values = $form_state
    ->getValue($pane_form['#parents']);
  $triggering_element = $form_state
    ->getTriggeringElement();
  $trigger = !empty($triggering_element['#op']) ? $triggering_element['#op'] : 'continue';
  switch ($trigger) {
    case 'continue':
      return;
    case 'login':
      $name_element = $pane_form['returning_customer']['name'];
      $username = $values['returning_customer']['name'];
      $password = trim($values['returning_customer']['password']);

      // Generate the "reset password" url.
      $query = !empty($username) ? [
        'name' => $username,
      ] : [];
      $password_url = Url::fromRoute('user.pass', [], [
        'query' => $query,
      ])
        ->toString();
      if (empty($username) || empty($password)) {
        $form_state
          ->setError($pane_form['returning_customer'], $this
          ->t('Unrecognized username or password. <a href=":url">Have you forgotten your password?</a>', [
          ':url' => $password_url,
        ]));
        return;
      }
      if (user_is_blocked($username)) {
        $form_state
          ->setError($name_element, $this
          ->t('The username %name has not been activated or is blocked.', [
          '%name' => $username,
        ]));
        return;
      }
      if (!$this->credentialsCheckFlood
        ->isAllowedHost($this->clientIp)) {
        $form_state
          ->setError($name_element, $this
          ->t('Too many failed login attempts from your IP address. This IP address is temporarily blocked. Try again later or <a href=":url">request a new password</a>.', [
          ':url' => $password_url,
        ]));
        $this->credentialsCheckFlood
          ->register($this->clientIp, $username);
        return;
      }
      elseif (!$this->credentialsCheckFlood
        ->isAllowedAccount($this->clientIp, $username)) {
        $form_state
          ->setError($name_element, $this
          ->t('Too many failed login attempts for this account. It is temporarily blocked. Try again later or <a href=":url">request a new password</a>.', [
          ':url' => $password_url,
        ]));
        $this->credentialsCheckFlood
          ->register($this->clientIp, $username);
        return;
      }
      $uid = $this->userAuth
        ->authenticate($username, $password);
      if (!$uid) {
        $this->credentialsCheckFlood
          ->register($this->clientIp, $username);
        $form_state
          ->setError($name_element, $this
          ->t('Unrecognized username or password. <a href=":url">Have you forgotten your password?</a>', [
          ':url' => $password_url,
        ]));
      }
      $form_state
        ->set('logged_in_uid', $uid);
      break;
    case 'register':
      $email = $values['register']['mail'];
      $username = $values['register']['name'];
      $password = trim($values['register']['password']);
      if (empty($email)) {
        $form_state
          ->setError($pane_form['register']['mail'], $this
          ->t('Email field is required.'));
        return;
      }
      if (empty($username)) {
        $form_state
          ->setError($pane_form['register']['name'], $this
          ->t('Username field is required.'));
        return;
      }
      if (empty($password)) {
        $form_state
          ->setError($pane_form['register']['password'], $this
          ->t('Password field is required.'));
        return;
      }

      /** @var \Drupal\user\UserInterface $account */
      $account = $this->entityTypeManager
        ->getStorage('user')
        ->create([
        'mail' => $email,
        'name' => $username,
        'pass' => $password,
        'status' => TRUE,
        'langcode' => $this->languageManager
          ->getCurrentLanguage()
          ->getId(),
        'preferred_langcode' => $this->languageManager
          ->getCurrentLanguage()
          ->getId(),
        'preferred_admin_langcode' => $this->languageManager
          ->getCurrentLanguage()
          ->getId(),
      ]);
      $form_display = EntityFormDisplay::collectRenderDisplay($account, 'register');
      $form_display
        ->extractFormValues($account, $pane_form['register'], $form_state);
      $form_display
        ->validateFormValues($account, $pane_form['register'], $form_state);

      // Manually flag violations of fields not handled by the form display.
      // This is necessary as entity form displays only flag violations for
      // fields contained in the display.
      // @see \Drupal\user\AccountForm::flagViolations
      $violations = $account
        ->validate();
      foreach ($violations
        ->getByFields([
        'name',
        'pass',
        'mail',
      ]) as $violation) {
        list($field_name) = explode('.', $violation
          ->getPropertyPath(), 2);
        $form_state
          ->setError($pane_form['register'][$field_name], $violation
          ->getMessage());
      }
      if (!$form_state
        ->hasAnyErrors()) {
        $account
          ->save();
        $form_state
          ->set('logged_in_uid', $account
          ->id());
      }
      break;
  }
}