Update.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Sync\Contact;
  3. use Dotdigitalgroup\Email\Model\Importer;
  4. use Dotdigitalgroup\Email\Model\ResourceModel\Contact;
  5. /**
  6. * Handle update data for importer.
  7. */
  8. class Update extends Delete
  9. {
  10. /**
  11. * @var Contact
  12. */
  13. public $contactResource;
  14. /**
  15. * Update constructor.
  16. *
  17. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  18. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Importer $importerResource
  19. * @param \Dotdigitalgroup\Email\Model\Config\Json $serializer
  20. * @param \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory
  21. * @param Contact $contactResource
  22. */
  23. public function __construct(
  24. \Dotdigitalgroup\Email\Helper\Data $helper,
  25. \Dotdigitalgroup\Email\Model\ResourceModel\Importer $importerResource,
  26. \Dotdigitalgroup\Email\Model\Config\Json $serializer,
  27. \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory,
  28. Contact $contactResource
  29. ) {
  30. $this->contactResource = $contactResource;
  31. parent::__construct($helper, $importerResource, $serializer, $contactFactory);
  32. }
  33. /**
  34. * Keep the suppressed contact ids that needs to update.
  35. *
  36. * @var array
  37. */
  38. public $suppressedContactIds;
  39. /**
  40. * Sync.
  41. *
  42. * @param mixed $collection
  43. *
  44. * @return null
  45. */
  46. public function sync($collection)
  47. {
  48. foreach ($collection as $item) {
  49. $websiteId = $item->getWebsiteId();
  50. if ($this->helper->isEnabled($websiteId)) {
  51. $this->client = $this->helper->getWebsiteApiClient($websiteId);
  52. $importData = $this->serializer->unserialize($item->getImportData());
  53. $this->syncItem($item, $importData, $websiteId);
  54. }
  55. }
  56. //update suppress status for contact ids
  57. if (!empty($this->suppressedContactIds)) {
  58. $this->contactResource->setContactSuppressedForContactIds($this->suppressedContactIds);
  59. }
  60. }
  61. /**
  62. * @param mixed $item
  63. * @param mixed $importData
  64. * @param mixed $websiteId
  65. *
  66. * @return null
  67. */
  68. public function syncItem($item, $importData, $websiteId)
  69. {
  70. if ($this->client) {
  71. if ($item->getImportMode() == Importer::MODE_CONTACT_EMAIL_UPDATE) {
  72. $result = $this->syncItemContactEmailUpdateMode($importData, $websiteId);
  73. } elseif ($item->getImportMode() == Importer::MODE_SUBSCRIBER_RESUBSCRIBED) {
  74. $result = $this->syncItemSubscriberResubscribedMode($importData);
  75. } elseif ($item->getImportMode() == Importer::MODE_SUBSCRIBER_UPDATE) {
  76. $result = $this->syncItemSubscriberUpdateMode($importData, $websiteId);
  77. }
  78. if (isset($result)) {
  79. $this->_handleSingleItemAfterSync($item, $result);
  80. }
  81. }
  82. }
  83. /**
  84. * @param mixed $importData
  85. * @param mixed $websiteId
  86. *
  87. * @return mixed
  88. */
  89. private function syncItemContactEmailUpdateMode($importData, $websiteId)
  90. {
  91. $emailBefore = $importData['emailBefore'];
  92. $email = $importData['email'];
  93. $isSubscribed = $importData['isSubscribed'];
  94. $subscribersAddressBook = $this->helper->getWebsiteConfig(
  95. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_SUBSCRIBERS_ADDRESS_BOOK_ID,
  96. $websiteId
  97. );
  98. $result = $this->client->postContacts($emailBefore);
  99. //check for matching email
  100. if (isset($result->id)) {
  101. if ($email != $result->email) {
  102. $data = [
  103. 'Email' => $email,
  104. 'EmailType' => 'Html',
  105. ];
  106. //update the contact with same id - different email
  107. $this->client->updateContact($result->id, $data);
  108. }
  109. if (!$isSubscribed && $result->status == 'Subscribed') {
  110. $this->client->deleteAddressBookContact($subscribersAddressBook, $result->id);
  111. }
  112. }
  113. return $result;
  114. }
  115. /**
  116. * @param mixed $importData
  117. *
  118. * @return mixed
  119. */
  120. private function syncItemSubscriberResubscribedMode($importData)
  121. {
  122. $email = $importData['email'];
  123. $apiContact = $this->client->postContacts($email);
  124. //resubscribe suppressed contacts
  125. if (isset($apiContact->message) &&
  126. $apiContact->message
  127. == \Dotdigitalgroup\Email\Model\Apiconnector\Client::API_ERROR_CONTACT_SUPPRESSED
  128. ) {
  129. $apiContact = $this->client->getContactByEmail($email);
  130. return $this->client->postContactsResubscribe($apiContact);
  131. }
  132. return false;
  133. }
  134. /**
  135. * @param mixed $importData
  136. * @param mixed $websiteId
  137. *
  138. * @return mixed
  139. */
  140. private function syncItemSubscriberUpdateMode($importData, $websiteId)
  141. {
  142. $email = $importData['email'];
  143. $id = $importData['id'];
  144. $result = $this->client->postContacts($email);
  145. if (isset($result->id)) {
  146. $contactId = $result->id;
  147. $this->client->deleteAddressBookContact(
  148. $this->helper->getSubscriberAddressBook($websiteId),
  149. $contactId
  150. );
  151. } else {
  152. //suppress contacts
  153. $this->suppressedContactIds[] = $id;
  154. }
  155. return $result;
  156. }
  157. }