Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
EmailNotification.php
Go to the documentation of this file.
1 <?php
7 namespace Magento\Customer\Model;
8 
14 use Magento\Customer\Helper\View as CustomerViewHelper;
18 
23 {
27  const XML_PATH_FORGOT_EMAIL_IDENTITY = 'customer/password/forgot_email_identity';
28 
29  const XML_PATH_RESET_PASSWORD_TEMPLATE = 'customer/password/reset_password_template';
30 
31  const XML_PATH_CHANGE_EMAIL_TEMPLATE = 'customer/account_information/change_email_template';
32 
34  'customer/account_information/change_email_and_password_template';
35 
36  const XML_PATH_FORGOT_EMAIL_TEMPLATE = 'customer/password/forgot_email_template';
37 
38  const XML_PATH_REMIND_EMAIL_TEMPLATE = 'customer/password/remind_email_template';
39 
40  const XML_PATH_REGISTER_EMAIL_IDENTITY = 'customer/create_account/email_identity';
41 
42  const XML_PATH_REGISTER_EMAIL_TEMPLATE = 'customer/create_account/email_template';
43 
44  const XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE = 'customer/create_account/email_no_password_template';
45 
46  const XML_PATH_CONFIRM_EMAIL_TEMPLATE = 'customer/create_account/email_confirmation_template';
47 
48  const XML_PATH_CONFIRMED_EMAIL_TEMPLATE = 'customer/create_account/email_confirmed_template';
49 
59  const TEMPLATE_TYPES = [
60  self::NEW_ACCOUNT_EMAIL_REGISTERED => self::XML_PATH_REGISTER_EMAIL_TEMPLATE,
61  self::NEW_ACCOUNT_EMAIL_REGISTERED_NO_PASSWORD => self::XML_PATH_REGISTER_NO_PASSWORD_EMAIL_TEMPLATE,
62  self::NEW_ACCOUNT_EMAIL_CONFIRMED => self::XML_PATH_CONFIRMED_EMAIL_TEMPLATE,
63  self::NEW_ACCOUNT_EMAIL_CONFIRMATION => self::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
64  ];
65 
69  private $customerRegistry;
70 
74  private $storeManager;
75 
79  private $transportBuilder;
80 
85 
89  protected $dataProcessor;
90 
94  private $scopeConfig;
95 
99  private $senderResolver;
100 
110  public function __construct(
111  CustomerRegistry $customerRegistry,
112  StoreManagerInterface $storeManager,
113  TransportBuilder $transportBuilder,
114  CustomerViewHelper $customerViewHelper,
116  ScopeConfigInterface $scopeConfig,
117  SenderResolverInterface $senderResolver = null
118  ) {
119  $this->customerRegistry = $customerRegistry;
120  $this->storeManager = $storeManager;
121  $this->transportBuilder = $transportBuilder;
122  $this->customerViewHelper = $customerViewHelper;
123  $this->dataProcessor = $dataProcessor;
124  $this->scopeConfig = $scopeConfig;
125  $this->senderResolver = $senderResolver ?: ObjectManager::getInstance()->get(SenderResolverInterface::class);
126  }
127 
136  public function credentialsChanged(
137  CustomerInterface $savedCustomer,
138  $origCustomerEmail,
139  $isPasswordChanged = false
140  ) {
141  if ($origCustomerEmail != $savedCustomer->getEmail()) {
142  if ($isPasswordChanged) {
143  $this->emailAndPasswordChanged($savedCustomer, $origCustomerEmail);
144  $this->emailAndPasswordChanged($savedCustomer, $savedCustomer->getEmail());
145  return;
146  }
147 
148  $this->emailChanged($savedCustomer, $origCustomerEmail);
149  $this->emailChanged($savedCustomer, $savedCustomer->getEmail());
150  return;
151  }
152 
153  if ($isPasswordChanged) {
154  $this->passwordReset($savedCustomer);
155  }
156  }
157 
165  private function emailAndPasswordChanged(CustomerInterface $customer, $email)
166  {
167  $storeId = $customer->getStoreId();
168  if (!$storeId) {
169  $storeId = $this->getWebsiteStoreId($customer);
170  }
171 
172  $customerEmailData = $this->getFullCustomerObject($customer);
173 
174  $this->sendEmailTemplate(
175  $customer,
176  self::XML_PATH_CHANGE_EMAIL_AND_PASSWORD_TEMPLATE,
177  self::XML_PATH_FORGOT_EMAIL_IDENTITY,
178  ['customer' => $customerEmailData, 'store' => $this->storeManager->getStore($storeId)],
179  $storeId,
180  $email
181  );
182  }
183 
191  private function emailChanged(CustomerInterface $customer, $email)
192  {
193  $storeId = $customer->getStoreId();
194  if (!$storeId) {
195  $storeId = $this->getWebsiteStoreId($customer);
196  }
197 
198  $customerEmailData = $this->getFullCustomerObject($customer);
199 
200  $this->sendEmailTemplate(
201  $customer,
202  self::XML_PATH_CHANGE_EMAIL_TEMPLATE,
203  self::XML_PATH_FORGOT_EMAIL_IDENTITY,
204  ['customer' => $customerEmailData, 'store' => $this->storeManager->getStore($storeId)],
205  $storeId,
206  $email
207  );
208  }
209 
216  private function passwordReset(CustomerInterface $customer)
217  {
218  $storeId = $customer->getStoreId();
219  if (!$storeId) {
220  $storeId = $this->getWebsiteStoreId($customer);
221  }
222 
223  $customerEmailData = $this->getFullCustomerObject($customer);
224 
225  $this->sendEmailTemplate(
226  $customer,
227  self::XML_PATH_RESET_PASSWORD_TEMPLATE,
228  self::XML_PATH_FORGOT_EMAIL_IDENTITY,
229  ['customer' => $customerEmailData, 'store' => $this->storeManager->getStore($storeId)],
230  $storeId
231  );
232  }
233 
246  private function sendEmailTemplate(
247  $customer,
248  $template,
249  $sender,
250  $templateParams = [],
251  $storeId = null,
252  $email = null
253  ) {
254  $templateId = $this->scopeConfig->getValue($template, 'store', $storeId);
255  if ($email === null) {
256  $email = $customer->getEmail();
257  }
258 
260  $from = $this->senderResolver->resolve(
261  $this->scopeConfig->getValue($sender, 'store', $storeId),
262  $storeId
263  );
264 
265  $transport = $this->transportBuilder->setTemplateIdentifier($templateId)
266  ->setTemplateOptions(['area' => 'frontend', 'store' => $storeId])
267  ->setTemplateVars($templateParams)
268  ->setFrom($from)
269  ->addTo($email, $this->customerViewHelper->getCustomerName($customer))
270  ->getTransport();
271 
272  $transport->sendMessage();
273  }
274 
281  private function getFullCustomerObject($customer)
282  {
283  // No need to flatten the custom attributes or nested objects since the only usage is for email templates and
284  // object passed for events
285  $mergedCustomerData = $this->customerRegistry->retrieveSecureData($customer->getId());
286  $customerData = $this->dataProcessor
287  ->buildOutputDataArray($customer, \Magento\Customer\Api\Data\CustomerInterface::class);
288  $mergedCustomerData->addData($customerData);
289  $mergedCustomerData->setData('name', $this->customerViewHelper->getCustomerName($customer));
290  return $mergedCustomerData;
291  }
292 
300  private function getWebsiteStoreId($customer, $defaultStoreId = null)
301  {
302  if ($customer->getWebsiteId() != 0 && empty($defaultStoreId)) {
303  $storeIds = $this->storeManager->getWebsite($customer->getWebsiteId())->getStoreIds();
304  $defaultStoreId = reset($storeIds);
305  }
306  return $defaultStoreId;
307  }
308 
316  {
317  $storeId = $customer->getStoreId();
318  if (!$storeId) {
319  $storeId = $this->getWebsiteStoreId($customer);
320  }
321 
322  $customerEmailData = $this->getFullCustomerObject($customer);
323 
324  $this->sendEmailTemplate(
325  $customer,
326  self::XML_PATH_REMIND_EMAIL_TEMPLATE,
327  self::XML_PATH_FORGOT_EMAIL_IDENTITY,
328  ['customer' => $customerEmailData, 'store' => $this->storeManager->getStore($storeId)],
329  $storeId
330  );
331  }
332 
340  {
341  $storeId = $this->storeManager->getStore()->getId();
342  if (!$storeId) {
343  $storeId = $this->getWebsiteStoreId($customer);
344  }
345 
346  $customerEmailData = $this->getFullCustomerObject($customer);
347 
348  $this->sendEmailTemplate(
349  $customer,
350  self::XML_PATH_FORGOT_EMAIL_TEMPLATE,
351  self::XML_PATH_FORGOT_EMAIL_IDENTITY,
352  ['customer' => $customerEmailData, 'store' => $this->storeManager->getStore($storeId)],
353  $storeId
354  );
355  }
356 
368  public function newAccount(
370  $type = self::NEW_ACCOUNT_EMAIL_REGISTERED,
371  $backUrl = '',
372  $storeId = 0,
373  $sendemailStoreId = null
374  ) {
375  $types = self::TEMPLATE_TYPES;
376 
377  if (!isset($types[$type])) {
378  throw new LocalizedException(
379  __('The transactional account email type is incorrect. Verify and try again.')
380  );
381  }
382 
383  if (!$storeId) {
384  $storeId = $this->getWebsiteStoreId($customer, $sendemailStoreId);
385  }
386 
387  $store = $this->storeManager->getStore($customer->getStoreId());
388 
389  $customerEmailData = $this->getFullCustomerObject($customer);
390 
391  $this->sendEmailTemplate(
392  $customer,
393  $types[$type],
394  self::XML_PATH_REGISTER_EMAIL_IDENTITY,
395  ['customer' => $customerEmailData, 'back_url' => $backUrl, 'store' => $store],
396  $storeId
397  );
398  }
399 }
$customerData
$customer
Definition: customers.php:11
$email
Definition: details.phtml:13
$storeManager
__()
Definition: __.php:13
credentialsChanged(CustomerInterface $savedCustomer, $origCustomerEmail, $isPasswordChanged=false)
passwordResetConfirmation(CustomerInterface $customer)
$templateId
Definition: queue.php:15
$type
Definition: item.phtml:13
passwordReminder(CustomerInterface $customer)
__construct(CustomerRegistry $customerRegistry, StoreManagerInterface $storeManager, TransportBuilder $transportBuilder, CustomerViewHelper $customerViewHelper, DataObjectProcessor $dataProcessor, ScopeConfigInterface $scopeConfig, SenderResolverInterface $senderResolver=null)
$customerRegistry
Definition: customers.php:12
newAccount(CustomerInterface $customer, $type=self::NEW_ACCOUNT_EMAIL_REGISTERED, $backUrl='', $storeId=0, $sendemailStoreId=null)
$template
Definition: export.php:12