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()]);