diff --git a/modules/order/src/Form/CustomerFormTrait.php b/modules/order/src/Form/CustomerFormTrait.php index 422bbfbe..a5ad3c41 100644 --- a/modules/order/src/Form/CustomerFormTrait.php +++ b/modules/order/src/Form/CustomerFormTrait.php @@ -5,7 +5,6 @@ namespace Drupal\commerce_order\Form; use Drupal\commerce_order\Entity\OrderInterface; use Drupal\Component\Utility\Html; use Drupal\Core\Form\FormStateInterface; -use Drupal\user\Entity\User; /** * Provides a form for selecting the order's customer (uid and mail fields). @@ -14,6 +13,13 @@ use Drupal\user\Entity\User; */ trait CustomerFormTrait { + /** + * The user storage. + * + * @var \Drupal\Core\Entity\EntityStorageInterface + */ + protected $userStorage; + /** * Builds the customer form. * @@ -123,25 +129,45 @@ trait CustomerFormTrait { } /** - * Submit handler for the customer select form. + * Validation handler for the customer select form. * * @param array $form * The parent form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. */ - public function submitCustomerForm(array &$form, FormStateInterface $form_state) { + public function validateCustomerForm(array &$form, FormStateInterface $form_state) { $values = $form_state->getValues(); - if ($values['customer_type'] == 'existing') { - $values['mail'] = User::load($values['uid'])->getEmail(); - } - else { - $user = User::create([ + if (isset($values['mail']) && $values['customer_type'] == 'new') { + $user = $this->userStorage->create([ 'name' => $values['mail'], 'mail' => $values['mail'], 'pass' => ($values['generate']) ? user_password() : $values['pass'], 'status' => TRUE, ]); + $form_state->set('customer', $user); + $violations = $user->validate(); + foreach ($violations as $violation) { + $form_state->setErrorByName(str_replace('.', '][', $violation->getPropertyPath()), $violation->getMessage()); + } + } + } + + /** + * Submit handler for the customer select form. + * + * @param array $form + * An associative array containing the structure of the parent form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + */ + public function submitCustomerForm(array &$form, FormStateInterface $form_state) { + $values = $form_state->getValues(); + if ($values['customer_type'] == 'existing') { + $values['mail'] = $this->userStorage->load($values['uid'])->getEmail(); + } + else { + $user = $form_state->get('customer'); $user->save(); $values['uid'] = $user->id(); diff --git a/modules/order/src/Form/OrderAddForm.php b/modules/order/src/Form/OrderAddForm.php index 9e1e9215..239d16a4 100644 --- a/modules/order/src/Form/OrderAddForm.php +++ b/modules/order/src/Form/OrderAddForm.php @@ -30,6 +30,13 @@ class OrderAddForm extends FormBase { */ protected $storeStorage; + /** + * The user storage. + * + * @var \Drupal\Core\Entity\EntityStorageInterface + */ + protected $userStorage; + /** * Constructs a new OrderAddForm object. * @@ -39,6 +46,7 @@ class OrderAddForm extends FormBase { public function __construct(EntityTypeManagerInterface $entity_type_manager) { $this->orderStorage = $entity_type_manager->getStorage('commerce_order'); $this->storeStorage = $entity_type_manager->getStorage('commerce_store'); + $this->userStorage = $entity_type_manager->getStorage('user'); } /** @@ -115,6 +123,13 @@ class OrderAddForm extends FormBase { return $form; } + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state) { + $this->validateCustomerForm($form, $form_state); + } + /** * {@inheritdoc} */ diff --git a/modules/order/src/Form/OrderReassignForm.php b/modules/order/src/Form/OrderReassignForm.php index d1b9de40..754e57b7 100644 --- a/modules/order/src/Form/OrderReassignForm.php +++ b/modules/order/src/Form/OrderReassignForm.php @@ -115,6 +115,13 @@ class OrderReassignForm extends FormBase { return $form; } + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state) { + $this->validateCustomerForm($form, $form_state); + } + /** * {@inheritdoc} */ diff --git a/modules/order/tests/src/FunctionalJavascript/OrderAdminTest.php b/modules/order/tests/src/FunctionalJavascript/OrderAdminTest.php index 864e6c98..ef4ac164 100644 --- a/modules/order/tests/src/FunctionalJavascript/OrderAdminTest.php +++ b/modules/order/tests/src/FunctionalJavascript/OrderAdminTest.php @@ -463,4 +463,23 @@ class OrderAdminTest extends OrderWebDriverTestBase { $this->assertSession()->pageTextContains('Access denied'); } + /** + * Tests creating a new customer with same email used by an existing customer. + */ + public function testCreateOrderNewCustomer() { + $email = 'guest@example.com'; + $this->createUser(['mail' => $email]); + + $this->drupalGet('/admin/commerce/orders'); + $this->getSession()->getPage()->clickLink('Create a new order'); + $this->getSession()->getPage()->selectFieldOption('customer_type', 'new'); + $this->assertSession()->assertWaitOnAjaxRequest(); + $edit = [ + 'customer_type' => 'new', + 'mail' => $email, + ]; + $this->submitForm($edit, t('Create')); + $this->assertSession()->pageTextContains('The email address guest@example.com is already taken.'); + } + }