123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Newsletter\Model\ResourceModel;
- use Magento\Framework\Model\AbstractModel;
- use Magento\Newsletter\Model\Queue as ModelQueue;
- /**
- * Newsletter queue resource model
- *
- * @author Magento Core Team <core@magentocommerce.com>
- *
- * @api
- * @since 100.0.2
- */
- class Queue extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
- {
- /**
- * Subscriber collection
- *
- * @var \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection
- */
- protected $_subscriberCollection;
- /**
- * Construct
- *
- * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
- * @param \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection $subscriberCollection
- * @param string $connectionName
- */
- public function __construct(
- \Magento\Framework\Model\ResourceModel\Db\Context $context,
- \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection $subscriberCollection,
- $connectionName = null
- ) {
- parent::__construct($context, $connectionName);
- $this->_subscriberCollection = $subscriberCollection;
- }
- /**
- * Define main table
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_init('newsletter_queue', 'queue_id');
- }
- /**
- * Add subscribers to queue
- *
- * @param ModelQueue $queue
- * @param array $subscriberIds
- * @return void
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function addSubscribersToQueue(ModelQueue $queue, array $subscriberIds)
- {
- if (count($subscriberIds) == 0) {
- throw new \Magento\Framework\Exception\LocalizedException(__('There are no subscribers selected.'));
- }
- if (!$queue->getId() && $queue->getQueueStatus() != \Magento\Newsletter\Model\Queue::STATUS_NEVER) {
- throw new \Magento\Framework\Exception\LocalizedException(__('You selected an invalid queue.'));
- }
- $connection = $this->getConnection();
- $select = $connection->select();
- $select->from(
- $this->getTable('newsletter_queue_link'),
- 'subscriber_id'
- )->where(
- 'queue_id = ?',
- $queue->getId()
- )->where(
- 'subscriber_id in (?)',
- $subscriberIds
- );
- $usedIds = array_flip($connection->fetchCol($select));
- $subscriberIds = array_flip($subscriberIds);
- $newIds = array_diff_key($subscriberIds, $usedIds);
-
- $connection->beginTransaction();
- try {
- foreach (array_keys($newIds) as $subscriberId) {
- $data = [];
- $data['queue_id'] = $queue->getId();
- $data['subscriber_id'] = $subscriberId;
- $connection->insert($this->getTable('newsletter_queue_link'), $data);
- }
- $connection->commit();
- } catch (\Exception $e) {
- $connection->rollBack();
- }
- }
- /**
- * Removes subscriber from queue
- *
- * @param ModelQueue $queue
- * @return void
- * @throws \Exception
- */
- public function removeSubscribersFromQueue(ModelQueue $queue)
- {
- $connection = $this->getConnection();
- try {
- $connection->beginTransaction();
- $connection->delete(
- $this->getTable('newsletter_queue_link'),
- ['queue_id = ?' => $queue->getId(), 'letter_sent_at IS NULL']
- );
- $connection->commit();
- } catch (\Exception $e) {
- $connection->rollBack();
- throw $e;
- }
- }
- /**
- * Links queue to store
- *
- * @param ModelQueue $queue
- * @return $this
- */
- public function setStores(ModelQueue $queue)
- {
- $connection = $this->getConnection();
- $connection->delete($this->getTable('newsletter_queue_store_link'), ['queue_id = ?' => $queue->getId()]);
- $stores = $queue->getStores();
- if (!is_array($stores)) {
- $stores = [];
- }
- foreach ($stores as $storeId) {
- $data = [];
- $data['store_id'] = $storeId;
- $data['queue_id'] = $queue->getId();
- $connection->insert($this->getTable('newsletter_queue_store_link'), $data);
- }
- $this->removeSubscribersFromQueue($queue);
- if (count($stores) == 0) {
- return $this;
- }
- $subscribers = $this->_subscriberCollection->addFieldToFilter(
- 'store_id',
- ['in' => $stores]
- )->useOnlySubscribed()->load();
- $subscriberIds = [];
- foreach ($subscribers as $subscriber) {
- $subscriberIds[] = $subscriber->getId();
- }
- if (count($subscriberIds) > 0) {
- $this->addSubscribersToQueue($queue, $subscriberIds);
- }
- return $this;
- }
- /**
- * Returns queue linked stores
- *
- * @param ModelQueue $queue
- * @return array
- */
- public function getStores(ModelQueue $queue)
- {
- $connection = $this->getConnection();
- $select = $connection->select()->from(
- $this->getTable('newsletter_queue_store_link'),
- 'store_id'
- )->where(
- 'queue_id = :queue_id'
- );
- if (!($result = $connection->fetchCol($select, ['queue_id' => $queue->getId()]))) {
- $result = [];
- }
- return $result;
- }
- /**
- * Saving template after saving queue action
- *
- * @param \Magento\Framework\Model\AbstractModel $queue
- * @return $this
- */
- protected function _afterSave(AbstractModel $queue)
- {
- if ($queue->getSaveStoresFlag()) {
- $this->setStores($queue);
- }
- return $this;
- }
- }
|