diff --git a/modules/checkout/commerce_checkout.module b/modules/checkout/commerce_checkout.module index a792b11b34..6ae4e5269d 100644 --- a/modules/checkout/commerce_checkout.module +++ b/modules/checkout/commerce_checkout.module @@ -25,6 +25,7 @@ function commerce_checkout_theme() { 'commerce_checkout_completion_message' => [ 'variables' => [ 'order_entity' => NULL, + 'completion_messages' => NULL, 'payment_instructions' => NULL, ], ], diff --git a/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessage.php b/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessage.php index fef9352aff..a0094251b9 100644 --- a/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessage.php +++ b/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessage.php @@ -2,6 +2,8 @@ namespace Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane; +use Drupal\commerce_checkout\Plugin\Commerce\CheckoutFlow\CheckoutFlowInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; /** @@ -15,14 +17,79 @@ */ class CompletionMessage extends CheckoutPaneBase { + /** + * @var \Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane\CompletionMessages + */ + private $completionMessags; + + /** + * {@inheritdoc} + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, CheckoutFlowInterface $checkout_flow, EntityTypeManagerInterface $entity_type_manager) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $checkout_flow, $entity_type_manager); + $this->completionMessags = new CompletionMessages(); + } + /** * {@inheritdoc} */ public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form) { + $this->preparePaneForm(); + $pane_form['#theme'] = 'commerce_checkout_completion_message'; $pane_form['#order_entity'] = $this->order; + $pane_form['#completion_messages'] = $this->completionMessags; return $pane_form; } + /** + * Prepares the necessary data for the completion messages. + */ + public function preparePaneForm() { + $this->populateCompletionMessages(); + } + + /** + * Gets the completion messages. + */ + private function populateCompletionMessages() { + $this->populateCompletionMessagesWithAnonymousMessage(); + $this->populateCompletionMessagesWithAuthenticatedMessage(); + + $this->allowOthersToModifyMessages(); + } + + /** + * Gets the default completion message. + */ + private function populateCompletionMessagesWithAnonymousMessage() { + if (\Drupal::currentUser()->isAnonymous()) { + $this->completionMessags->addMessage($this->t('Your order number is @number.', ['@number' => $this->order->id()])); + $this->completionMessags->addMessage($this->t('You can view your order on your account page when logged in.')); + } + } + + /** + * Populate the completion messages with the logged in message. + */ + private function populateCompletionMessagesWithAuthenticatedMessage() { + if (\Drupal::currentUser()->isAuthenticated()) { + $this->completionMessags->addMessage( + $this->t( + 'Your order number is %order_number_with_link.', + ['%order_number_with_link' => $this->order->toLink($this->order->id())] + ) + ); + } + } + + /** + * Allow other modules to alter the messages. + */ + private function allowOthersToModifyMessages() { + \Drupal::moduleHandler() + ->alter('checkout_completion_messages', $this->completionMessags, $this->order); + } + } diff --git a/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessages.php b/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessages.php new file mode 100644 index 0000000000..51af9655a4 --- /dev/null +++ b/modules/checkout/src/Plugin/Commerce/CheckoutPane/CompletionMessages.php @@ -0,0 +1,86 @@ +position = 0; + } + + /** + * Adds a message to the array. + * + * @param \Drupal\Core\StringTranslation\TranslatableMarkup $message + * The message to add. + */ + public function addMessage(TranslatableMarkup $message) { + $this->messages[] = $message; + } + + /** + * Gets the current message. + * + * @return \Drupal\Core\StringTranslation\TranslatableMarkup + * The current message. + */ + public function current() { + return $this->messages[$this->position]; + } + + /** + * {@inheritdoc} + */ + public function next() { + ++$this->position; + } + + /** + * {@inheritdoc} + */ + public function key() { + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function valid() { + return isset($this->messages[$this->position]); + } + + /** + * {@inheritdoc} + */ + public function rewind() { + $this->position = 0; + } + + /** + * {@inheritdoc} + */ + public function count() { + return count($this->messages); + } + +} diff --git a/modules/checkout/templates/commerce-checkout-completion-message.html.twig b/modules/checkout/templates/commerce-checkout-completion-message.html.twig index 5c8727f8bc..2b6fb3e9c0 100644 --- a/modules/checkout/templates/commerce-checkout-completion-message.html.twig +++ b/modules/checkout/templates/commerce-checkout-completion-message.html.twig @@ -11,6 +11,10 @@ */ #}
+ {% for message in completion_messages %} + {{ message }}
+ {% endfor %} + {{ 'Your order number is @number.'|t({'@number': order_entity.getOrderNumber}) }}
{{ 'You can view your order on your account page when logged in.'|t }}
diff --git a/modules/checkout/tests/src/Functional/CheckoutOrderTest.php b/modules/checkout/tests/src/Functional/CheckoutOrderTest.php index 7ed0ccbc54..ad4d8c296a 100644 --- a/modules/checkout/tests/src/Functional/CheckoutOrderTest.php +++ b/modules/checkout/tests/src/Functional/CheckoutOrderTest.php @@ -162,7 +162,7 @@ public function testGuestOrderCheckout() { $this->assertSession()->pageTextContains('Billing information'); $this->assertSession()->pageTextContains('Order Summary'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $this->assertSession()->pageTextContains('0 items'); // Test second order. $this->drupalGet($this->product->toUrl()->toString()); @@ -198,7 +198,7 @@ public function testGuestOrderCheckout() { $this->assertCheckoutProgressStep('Review'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 2. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 2.'); $this->assertSession()->pageTextContains('0 items'); } diff --git a/modules/checkout/tests/src/Kernel/CompletionMessagesTest.php b/modules/checkout/tests/src/Kernel/CompletionMessagesTest.php new file mode 100644 index 0000000000..6ad9f65221 --- /dev/null +++ b/modules/checkout/tests/src/Kernel/CompletionMessagesTest.php @@ -0,0 +1,52 @@ +completionMessages = new CompletionMessages(); + } + + /** + * Tests add message method. + */ + public function testAddMessage() { + $this->completionMessages->addMessage(t('Message 1')); + $this->completionMessages->addMessage(t('Message 2')); + + $this->assertCount(2, $this->completionMessages); + } + + /** + * Tests the messages iterator. + */ + public function testMessagesIterator() { + $this->completionMessages->addMessage(t('Message 1')); + $this->completionMessages->addMessage(t('Message 2')); + + $this->assertEquals('Message 1', $this->completionMessages->current()->render()); + $this->completionMessages->next(); + $this->assertEquals('Message 2', $this->completionMessages->current()->render()); + } + +} diff --git a/modules/payment/tests/src/FunctionalJavascript/PaymentCheckoutTest.php b/modules/payment/tests/src/FunctionalJavascript/PaymentCheckoutTest.php index 31221e0d97..9e1619afa4 100644 --- a/modules/payment/tests/src/FunctionalJavascript/PaymentCheckoutTest.php +++ b/modules/payment/tests/src/FunctionalJavascript/PaymentCheckoutTest.php @@ -266,7 +266,7 @@ public function testCheckoutWithExistingPaymentMethod() { $this->assertSession()->pageTextContains('Frederick Pabst'); $this->assertSession()->pageTextContains('Pabst Blue Ribbon Dr'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $order = Order::load(1); $this->assertEquals('onsite', $order->get('payment_gateway')->target_id); @@ -317,7 +317,7 @@ public function testCheckoutWithNewPaymentMethod() { $this->assertSession()->pageTextContains('Johnny Appleseed'); $this->assertSession()->pageTextContains('123 New York Drive'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $order = Order::load(1); $this->assertEquals('onsite', $order->get('payment_gateway')->target_id); @@ -360,7 +360,7 @@ public function testCheckoutWithDeclinedPaymentMethod() { $this->assertSession()->pageTextContains('Visa ending in 1111'); $this->assertSession()->pageTextContains('Expires 2/2020'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextNotContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextNotContains('Your order number is 1.'); $this->assertSession()->pageTextContains('We encountered an error processing your payment method. Please verify your details and try again.'); $this->assertSession()->addressEquals('checkout/1/order_information'); @@ -393,7 +393,7 @@ public function testCheckoutWithOffsiteRedirectPost() { $this->assertSession()->pageTextContains('Johnny Appleseed'); $this->assertSession()->pageTextContains('123 New York Drive'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $order = Order::load(1); $this->assertEquals('offsite', $order->get('payment_gateway')->target_id); @@ -440,7 +440,7 @@ public function testCheckoutWithOffsiteRedirectGet() { $this->assertSession()->pageTextContains('Johnny Appleseed'); $this->assertSession()->pageTextContains('123 New York Drive'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $order = Order::load(1); $this->assertEquals('offsite', $order->get('payment_gateway')->target_id); @@ -483,7 +483,7 @@ public function testFailedCheckoutWithOffsiteRedirectGet() { $this->assertSession()->pageTextContains('Johnny FAIL'); $this->assertSession()->pageTextContains('123 New York Drive'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextNotContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextNotContains('Your order number is 1.'); $this->assertSession()->pageTextContains('We encountered an unexpected error processing your payment. Please try again later.'); $this->assertSession()->addressEquals('checkout/1/order_information'); @@ -516,7 +516,7 @@ public function testCheckoutWithManual() { $this->assertSession()->pageTextContains('Johnny Appleseed'); $this->assertSession()->pageTextContains('123 New York Drive'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $this->assertSession()->pageTextContains('Sample payment instructions.'); $order = Order::load(1); $this->assertEquals('manual', $order->get('payment_gateway')->target_id); diff --git a/modules/promotion/tests/src/FunctionalJavascript/CouponRedemptionPaneTest.php b/modules/promotion/tests/src/FunctionalJavascript/CouponRedemptionPaneTest.php index 83cfd3a6d8..fb18d8ed1c 100644 --- a/modules/promotion/tests/src/FunctionalJavascript/CouponRedemptionPaneTest.php +++ b/modules/promotion/tests/src/FunctionalJavascript/CouponRedemptionPaneTest.php @@ -235,7 +235,7 @@ public function testCheckout() { $this->assertSession()->pageTextContains('$899.10'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $order_storage = $this->container->get('entity_type.manager')->getStorage('commerce_order'); $order_storage->resetCache([$this->cart->id()]); @@ -259,7 +259,7 @@ public function testCheckoutWithMainSubmit() { $this->assertSession()->pageTextContains('$899.10'); $this->submitForm([], 'Pay and complete purchase'); - $this->assertSession()->pageTextContains('Your order number is 1. You can view your order on your account page when logged in.'); + $this->assertSession()->pageTextContains('Your order number is 1.'); $order_storage = $this->container->get('entity_type.manager')->getStorage('commerce_order'); $order_storage->resetCache([$this->cart->id()]);