acquia_commercemanager-8.x-1.122/modules/acm/src/Form/CommerceUserRegistrationForm.php

modules/acm/src/Form/CommerceUserRegistrationForm.php
<?php

namespace Drupal\acm\Form;

use Drupal\acm_cart\CartStorageInterface;
use Drupal\acm\Connector\APIWrapperInterface;
use Drupal\acm\User\CommerceUserSession;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountProxy;
use Drupal\Core\Url;
use Drupal\user\UserAuthInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class CommerceUserRegistrationForm.
 *
 * @package Drupal\acm\Form
 */
class CommerceUserRegistrationForm extends FormBase {

  /**
   * Module handler service.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * API Wrapper object.
   *
   * @var \Drupal\acm\Connector\APIWrapperInterface
   */
  protected $apiWrapper;

  /**
   * The user authentication object.
   *
   * @var \Drupal\user\UserAuthInterface
   */
  protected $userAuth;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountProxy
   */
  protected $currentUser;

  /**
   * The shopping cart.
   *
   * @var \Drupal\acm_cart\CartStorageInterface
   */
  protected $cartStorage;

  /**
   * Constructor.
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler.
   * @param \Drupal\acm\Connector\APIWrapperInterface $api_wrapper
   *   ApiWrapper object.
   * @param \Drupal\user\UserAuthInterface $user_auth
   *   The user authentication object.
   * @param \Drupal\Core\Session\AccountProxy $current_user
   *   The current user.
   * @param \Drupal\acm_cart\CartStorageInterface $cart_storage
   *   The cart storage.
   */
  public function __construct(ModuleHandlerInterface $module_handler, APIWrapperInterface $api_wrapper, UserAuthInterface $user_auth, AccountProxy $current_user, CartStorageInterface $cart_storage) {
    $this->moduleHandler = $module_handler;
    $this->apiWrapper = $api_wrapper;
    $this->userAuth = $user_auth;
    $this->currentUser = $current_user;
    $this->cartStorage = $cart_storage;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler'),
      $container->get('acm.api'),
      $container->get('acm.auth'),
      $container->get('acm.current_user'),
      $container->get('acm_cart.cart_storage')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'commerce_user_registration_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['title'] = [
      '#type' => 'acm_title_select',
      '#title' => $this->t('Title'),
      '#empty_option' => $this->t('Select'),
      '#required' => TRUE,
    ];

    $form['firstname'] = [
      '#type' => 'textfield',
      '#title' => $this->t('First Name'),
      '#required' => TRUE,
    ];

    $form['lastname'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Last Name'),
      '#required' => TRUE,
    ];

    $form['email'] = [
      '#type' => 'email',
      '#title' => $this->t('Email'),
      '#required' => TRUE,
    ];

    $form['email_confirm'] = [
      '#type' => 'email',
      '#title' => $this->t('Confirm Email'),
      '#required' => TRUE,
    ];

    $form['password'] = [
      '#type' => 'password_confirm',
      '#required' => TRUE,
    ];

    $form['dob'] = [
      '#type' => 'date',
      '#title' => $this->t('Date of Birth'),
    ];

    $form['actions'] = [
      '#type' => 'actions',
    ];

    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#button_type' => 'primary',
      '#value' => $this->t('Create account & sign in'),
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $values = $form_state->getValues();
    $email = $values['email'];

    // Account for email confirm being optional.
    if (!isset($values['email_confirm'])) {
      return;
    }

    $email_confirm = $values['email_confirm'];
    if (strlen($email) > 0 || strlen($email_confirm) > 0) {
      if (strcmp($email, $email_confirm)) {
        $form_state->setErrorByName('email_confirm', $this->t('The specified emails do not match.'));
      }
    }

    // Show an error message if the user already exists in the system.
    $existingCustomer = $this->apiWrapper->silentRequest('getCustomer', [$email]);

    if (!empty($existingCustomer)) {
      $form_state->setError(
        $form['email'],
        t('You already have an account with this email address. Please use a different email address or <a href="@url">sign in</a> to your account.', [
          '@url' => Url::fromRoute('acm.external_user_login')->toString(),
        ]
        )
      );
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $values = $form_state->getValues();
    $password = $values['password'];
    $customer_fields = [
      'firstname' => $values['firstname'],
      'lastname' => $values['lastname'],
      'email' => $values['email'],
      'password' => $password,
      'title' => $values['title'],
      'dob' => $values['dob'],
    ];

    // Create customer and get/save access token to log them in.
    try {
      $customer = $this->apiWrapper->createCustomer($customer_fields);
      if ($customer && $token = $this->userAuth->authenticate($customer['email'], $password)) {
        $account = new CommerceUserSession($customer);
        $account->setAccessToken($token);
        $this->currentUser->setAccount($account);
        $this->logger('acm')->notice('Commerce session opened for %name.', ['%name' => $account->getUsername()]);

        // Convert the guest cart after login.
        $customer_id = $account->id();
        $this->cartStorage->convertGuestCart($customer_id);

        if ($this->moduleHandler->moduleExists('acm_customer')) {
          $form_state->setRedirect('acm_customer.view_page', [
            'page' => 'profile',
          ]);
        }
        else {
          $form_state->setRedirect('<front>');
        }
      }
    }
    catch (\Exception $e) {
      $this->logger('acm')->error($e->getMessage());
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc