Queue.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Newsletter\Model\ResourceModel;
  7. use Magento\Framework\Model\AbstractModel;
  8. use Magento\Newsletter\Model\Queue as ModelQueue;
  9. /**
  10. * Newsletter queue resource model
  11. *
  12. * @author Magento Core Team <core@magentocommerce.com>
  13. *
  14. * @api
  15. * @since 100.0.2
  16. */
  17. class Queue extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
  18. {
  19. /**
  20. * Subscriber collection
  21. *
  22. * @var \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection
  23. */
  24. protected $_subscriberCollection;
  25. /**
  26. * Construct
  27. *
  28. * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
  29. * @param \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection $subscriberCollection
  30. * @param string $connectionName
  31. */
  32. public function __construct(
  33. \Magento\Framework\Model\ResourceModel\Db\Context $context,
  34. \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection $subscriberCollection,
  35. $connectionName = null
  36. ) {
  37. parent::__construct($context, $connectionName);
  38. $this->_subscriberCollection = $subscriberCollection;
  39. }
  40. /**
  41. * Define main table
  42. *
  43. * @return void
  44. */
  45. protected function _construct()
  46. {
  47. $this->_init('newsletter_queue', 'queue_id');
  48. }
  49. /**
  50. * Add subscribers to queue
  51. *
  52. * @param ModelQueue $queue
  53. * @param array $subscriberIds
  54. * @return void
  55. * @throws \Magento\Framework\Exception\LocalizedException
  56. */
  57. public function addSubscribersToQueue(ModelQueue $queue, array $subscriberIds)
  58. {
  59. if (count($subscriberIds) == 0) {
  60. throw new \Magento\Framework\Exception\LocalizedException(__('There are no subscribers selected.'));
  61. }
  62. if (!$queue->getId() && $queue->getQueueStatus() != \Magento\Newsletter\Model\Queue::STATUS_NEVER) {
  63. throw new \Magento\Framework\Exception\LocalizedException(__('You selected an invalid queue.'));
  64. }
  65. $connection = $this->getConnection();
  66. $select = $connection->select();
  67. $select->from(
  68. $this->getTable('newsletter_queue_link'),
  69. 'subscriber_id'
  70. )->where(
  71. 'queue_id = ?',
  72. $queue->getId()
  73. )->where(
  74. 'subscriber_id in (?)',
  75. $subscriberIds
  76. );
  77. $usedIds = array_flip($connection->fetchCol($select));
  78. $subscriberIds = array_flip($subscriberIds);
  79. $newIds = array_diff_key($subscriberIds, $usedIds);
  80. $connection->beginTransaction();
  81. try {
  82. foreach (array_keys($newIds) as $subscriberId) {
  83. $data = [];
  84. $data['queue_id'] = $queue->getId();
  85. $data['subscriber_id'] = $subscriberId;
  86. $connection->insert($this->getTable('newsletter_queue_link'), $data);
  87. }
  88. $connection->commit();
  89. } catch (\Exception $e) {
  90. $connection->rollBack();
  91. }
  92. }
  93. /**
  94. * Removes subscriber from queue
  95. *
  96. * @param ModelQueue $queue
  97. * @return void
  98. * @throws \Exception
  99. */
  100. public function removeSubscribersFromQueue(ModelQueue $queue)
  101. {
  102. $connection = $this->getConnection();
  103. try {
  104. $connection->beginTransaction();
  105. $connection->delete(
  106. $this->getTable('newsletter_queue_link'),
  107. ['queue_id = ?' => $queue->getId(), 'letter_sent_at IS NULL']
  108. );
  109. $connection->commit();
  110. } catch (\Exception $e) {
  111. $connection->rollBack();
  112. throw $e;
  113. }
  114. }
  115. /**
  116. * Links queue to store
  117. *
  118. * @param ModelQueue $queue
  119. * @return $this
  120. */
  121. public function setStores(ModelQueue $queue)
  122. {
  123. $connection = $this->getConnection();
  124. $connection->delete($this->getTable('newsletter_queue_store_link'), ['queue_id = ?' => $queue->getId()]);
  125. $stores = $queue->getStores();
  126. if (!is_array($stores)) {
  127. $stores = [];
  128. }
  129. foreach ($stores as $storeId) {
  130. $data = [];
  131. $data['store_id'] = $storeId;
  132. $data['queue_id'] = $queue->getId();
  133. $connection->insert($this->getTable('newsletter_queue_store_link'), $data);
  134. }
  135. $this->removeSubscribersFromQueue($queue);
  136. if (count($stores) == 0) {
  137. return $this;
  138. }
  139. $subscribers = $this->_subscriberCollection->addFieldToFilter(
  140. 'store_id',
  141. ['in' => $stores]
  142. )->useOnlySubscribed()->load();
  143. $subscriberIds = [];
  144. foreach ($subscribers as $subscriber) {
  145. $subscriberIds[] = $subscriber->getId();
  146. }
  147. if (count($subscriberIds) > 0) {
  148. $this->addSubscribersToQueue($queue, $subscriberIds);
  149. }
  150. return $this;
  151. }
  152. /**
  153. * Returns queue linked stores
  154. *
  155. * @param ModelQueue $queue
  156. * @return array
  157. */
  158. public function getStores(ModelQueue $queue)
  159. {
  160. $connection = $this->getConnection();
  161. $select = $connection->select()->from(
  162. $this->getTable('newsletter_queue_store_link'),
  163. 'store_id'
  164. )->where(
  165. 'queue_id = :queue_id'
  166. );
  167. if (!($result = $connection->fetchCol($select, ['queue_id' => $queue->getId()]))) {
  168. $result = [];
  169. }
  170. return $result;
  171. }
  172. /**
  173. * Saving template after saving queue action
  174. *
  175. * @param \Magento\Framework\Model\AbstractModel $queue
  176. * @return $this
  177. */
  178. protected function _afterSave(AbstractModel $queue)
  179. {
  180. if ($queue->getSaveStoresFlag()) {
  181. $this->setStores($queue);
  182. }
  183. return $this;
  184. }
  185. }