I am attempting to develop a module that will send an email to a customer in my Commerce 2 store when that customer’s order’s status is updated to "Completed". I am basing my module off of the example shown in the handbook (https://docs.drupalcommerce.org/commerce2/developer-guide/orders/workflows/react-to-workflow-transitions)
Here’s what I have so far:
File: /modules/custom/tracking_number_email/tracking_number_email.info.yml
name: Commerce Tracking Number Email
type: module
description: Uses an event subscriber to send an email with tracking number to customer after order status has been updated.
package: Commerce
core: 8.x
File: /modules/custom/tracking_number_email/tracking_number_email.services.yml
services:
tracking_number_email.order_fulfillment_subscriber:
class: Drupaltracking_number_emailEventSubscriberOrderFulfillmentSubscriber
arguments: ['@language_manager', '@plugin.manager.mail']
tags:
- { name: event_subscriber }
File: /modules/custom/tracking_number_email/src/EventSubscriber/TrackingNumberEmail.php
<?php
namespace Drupaltracking_number_emailEventSubscriber;
use Drupalstate_machineEventWorkflowTransitionEvent;
use DrupalCoreLanguageLanguageManagerInterface;
use DrupalCoreMailMailManagerInterface;
use DrupalCoreStringTranslationStringTranslationTrait;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
/**
* Sends an email when the order transitions to Fulfillment.
*/
class OrderFulfillmentSubscriber implements EventSubscriberInterface {
use StringTranslationTrait;
/**
* The language manager.
*
* @var DrupalCoreLanguageLanguageManagerInterface
*/
protected $languageManager;
/**
* The mail manager.
*
* @var DrupalCoreMailMailManagerInterface
*/
protected $mailManager;
/**
* Constructs a new OrderFulfillmentSubscriber object.
*
* @param DrupalCoreLanguageLanguageManagerInterface $language_manager
* The language manager.
* @param DrupalCoreMailMailManagerInterface $mail_manager
* The mail manager.
*/
public function __construct(
LanguageManagerInterface $language_manager,
MailManagerInterface $mail_manager
) {
$this->languageManager = $language_manager;
$this->mailManager = $mail_manager;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events = [
'commerce_order.fulfill.post_transition' => ['sendEmail', -100],
];
return $events;
}
/**
* Sends the email.
*
* @param Drupalstate_machineEventWorkflowTransitionEvent $event-
* The transition event.
*/
public function sendEmail(WorkflowTransitionEvent $event) {
// Create the email.
$order = $event->getEntity();
$to = $order->getEmail();
$params = [
'from' => $order->getStore()->getEmail(),
'subject' => $this->t(
'Regarding your order [#@number]',
['@number' => $order->getOrderNumber()]
),
'body' => ['#markup' => $this->t(
'Your order with #@number that you have placed with us has been processed and is awaiting fulfillment.',
['@number' => $order->getOrderNumber()]
)],
];
// Set the language that will be used in translations.
if ($customer = $order->getCustomer()) {
$langcode = $customer->getPreferredLangcode();
}
else {
$langcode = $this->languageManager->getDefaultLanguage()->getId();
}
// Send the email.
$this->mailManager->mail('commerce', 'receipt', $to, $langcode, $params);
}
}
I am receiving the following error message when this custom module is installed:
ReflectionException: Class
Drupaltracking_number_emailEventSubscriberOrderFulfillmentSubscriber
does not exist in ReflectionClass->__construct() (line 30 of
/home1/mysite/public_html/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterEventSubscribersPass.php).
If I remove the tracking_number_email.services.yml the error goes away, but the module doesn’t work (to be clear, it doesn’t work whether or not that services.yml file is in place). I assume I have something erroneous in that services.yml file, but I am stuck trying to figure out what is wrong.