CreateUpdateContact.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace Dotdigitalgroup\Email\Observer\Customer;
  3. /**
  4. * Creates and updates the contact for customer. Monitor the email change for customer.
  5. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  6. */
  7. class CreateUpdateContact implements \Magento\Framework\Event\ObserverInterface
  8. {
  9. /**
  10. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Catalog
  11. */
  12. private $contactResource;
  13. /**
  14. * @var \Dotdigitalgroup\Email\Helper\Data
  15. */
  16. private $helper;
  17. /**
  18. * @var \Magento\Framework\Registry
  19. */
  20. private $registry;
  21. /**
  22. * @var \Magento\Customer\Model\CustomerFactory
  23. */
  24. private $customerFactory;
  25. /**
  26. * @var \Dotdigitalgroup\Email\Model\ContactFactory
  27. */
  28. private $contactFactory;
  29. /**
  30. * @var \Magento\Wishlist\Model\WishlistFactory
  31. */
  32. private $wishlist;
  33. /**
  34. * @var \Dotdigitalgroup\Email\Model\ImporterFactory
  35. */
  36. private $importerFactory;
  37. /**
  38. * @var \Magento\Newsletter\Model\SubscriberFactory
  39. */
  40. private $subscriberFactory;
  41. /**
  42. * CreateUpdateContact constructor.
  43. *
  44. * @param \Magento\Wishlist\Model\WishlistFactory $wishlist
  45. * @param \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory
  46. * @param \Magento\Customer\Model\CustomerFactory $customerFactory
  47. * @param \Magento\Framework\Registry $registry
  48. * @param \Dotdigitalgroup\Email\Helper\Data $data
  49. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource
  50. * @param \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory
  51. * @param \Magento\Newsletter\Model\SubscriberFactory $subscriberFactory
  52. */
  53. public function __construct(
  54. \Magento\Wishlist\Model\WishlistFactory $wishlist,
  55. \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory,
  56. \Magento\Customer\Model\CustomerFactory $customerFactory,
  57. \Magento\Framework\Registry $registry,
  58. \Dotdigitalgroup\Email\Helper\Data $data,
  59. \Dotdigitalgroup\Email\Model\ResourceModel\Contact $contactResource,
  60. \Dotdigitalgroup\Email\Model\ImporterFactory $importerFactory,
  61. \Magento\Newsletter\Model\SubscriberFactory $subscriberFactory
  62. ) {
  63. $this->wishlist = $wishlist;
  64. $this->contactFactory = $contactFactory;
  65. $this->contactResource = $contactResource;
  66. $this->customerFactory = $customerFactory;
  67. $this->helper = $data;
  68. $this->registry = $registry;
  69. $this->importerFactory = $importerFactory;
  70. $this->subscriberFactory = $subscriberFactory;
  71. }
  72. /**
  73. * If it's configured to capture on shipment - do this.
  74. *
  75. * @param \Magento\Framework\Event\Observer $observer
  76. *
  77. * @return $this
  78. */
  79. public function execute(\Magento\Framework\Event\Observer $observer)
  80. {
  81. $customer = $observer->getEvent()->getCustomer();
  82. $websiteId = $customer->getWebsiteId();
  83. $storeId = $customer->getStoreId();
  84. //check if enabled
  85. if (!$this->helper->isEnabled($websiteId)) {
  86. return $this;
  87. }
  88. $email = $customer->getEmail();
  89. $customerId = $customer->getEntityId();
  90. $subscriber = $this->subscriberFactory->create()
  91. ->loadByCustomerId($customerId);
  92. $isSubscribed = $subscriber->isSubscribed();
  93. $emailBefore = '';
  94. try {
  95. // fix for a multiple hit of the observer
  96. $emailReg = $this->registry->registry($email . '_customer_save');
  97. if ($emailReg) {
  98. return $this;
  99. }
  100. $this->registry->unregister($email . '_customer_save'); // additional measure
  101. $this->registry->register($email . '_customer_save', $email);
  102. $isContactExist = $this->contactFactory->create()
  103. ->loadByCustomerId($customerId);
  104. if ($isContactExist->getId()) {
  105. $emailBefore = $isContactExist->getEmail();
  106. }
  107. $emailAddress = empty($emailBefore) ? $email : $emailBefore;
  108. $contactModel = $this->contactFactory->create()
  109. ->loadByCustomerEmail($emailAddress, $websiteId);
  110. //email change detection
  111. if ($emailBefore && $email != $emailBefore) {
  112. //Reload contact model up update email
  113. $contactModel = $this->contactFactory->create()
  114. ->loadByCustomerEmail($emailAddress, $websiteId);
  115. $contactModel->setEmail($email);
  116. $data = [
  117. 'emailBefore' => $emailBefore,
  118. 'email' => $email,
  119. 'isSubscribed' => $isSubscribed,
  120. ];
  121. $this->importerFactory->create()->registerQueue(
  122. \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_CONTACT_UPDATE,
  123. $data,
  124. \Dotdigitalgroup\Email\Model\Importer::MODE_CONTACT_EMAIL_UPDATE,
  125. $websiteId
  126. );
  127. } elseif (!$emailBefore) {
  128. //for new contacts update email
  129. $contactModel->setEmail($email);
  130. }
  131. $contactModel->setEmailImported(\Dotdigitalgroup\Email\Model\Contact::EMAIL_CONTACT_NOT_IMPORTED)
  132. ->setStoreId($storeId)
  133. ->setCustomerId($customerId);
  134. $this->contactResource->save($contactModel);
  135. } catch (\Exception $e) {
  136. $this->helper->debug((string)$e, []);
  137. }
  138. return $this;
  139. }
  140. }