123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Newsletter\Model\ResourceModel\Queue;
- /**
- * Newsletter queue collection.
- *
- * @author Magento Core Team <core@magentocommerce.com>
- *
- * @api
- * @since 100.0.2
- */
- class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
- {
- /**
- * True when subscribers info joined
- *
- * @var bool
- */
- protected $_addSubscribersFlag = false;
- /**
- * True when filtered by store
- *
- * @var bool
- */
- protected $_isStoreFilter = false;
- /**
- * Date
- *
- * @var \Magento\Framework\Stdlib\DateTime\DateTime
- */
- protected $_date;
- /**
- * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
- * @param \Psr\Log\LoggerInterface $logger
- * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
- * @param \Magento\Framework\Event\ManagerInterface $eventManager
- * @param \Magento\Framework\Stdlib\DateTime\DateTime $date
- * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
- * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
- */
- public function __construct(
- \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
- \Psr\Log\LoggerInterface $logger,
- \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
- \Magento\Framework\Event\ManagerInterface $eventManager,
- \Magento\Framework\Stdlib\DateTime\DateTime $date,
- \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
- \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
- ) {
- parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
- $this->_date = $date;
- }
- /**
- * Initializes collection
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_map['fields']['queue_id'] = 'main_table.queue_id';
- $this->_init(\Magento\Newsletter\Model\Queue::class, \Magento\Newsletter\Model\ResourceModel\Queue::class);
- }
- /**
- * Joins templates information
- *
- * @return $this
- */
- public function addTemplateInfo()
- {
- $this->getSelect()->joinLeft(
- ['template' => $this->getTable('newsletter_template')],
- 'template.template_id=main_table.template_id',
- ['template_subject', 'template_sender_name', 'template_sender_email']
- );
- $this->_joinedTables['template'] = true;
- return $this;
- }
- /**
- * Adds subscribers info to select
- *
- * @return $this
- */
- protected function _addSubscriberInfoToSelect()
- {
- /** @var $select \Magento\Framework\DB\Select */
- $select = $this->getConnection()->select()->from(
- ['qlt' => $this->getTable('newsletter_queue_link')],
- 'COUNT(qlt.queue_link_id)'
- )->where(
- 'qlt.queue_id = main_table.queue_id'
- );
- $totalExpr = new \Zend_Db_Expr(sprintf('(%s)', $select->assemble()));
- $select = $this->getConnection()->select()->from(
- ['qls' => $this->getTable('newsletter_queue_link')],
- 'COUNT(qls.queue_link_id)'
- )->where(
- 'qls.queue_id = main_table.queue_id'
- )->where(
- 'qls.letter_sent_at IS NOT NULL'
- );
- $sentExpr = new \Zend_Db_Expr(sprintf('(%s)', $select->assemble()));
- $this->getSelect()->columns(['subscribers_sent' => $sentExpr, 'subscribers_total' => $totalExpr]);
- return $this;
- }
- /**
- * Adds subscribers info to select and loads collection
- *
- * @param bool $printQuery
- * @param bool $logQuery
- * @return $this
- */
- public function load($printQuery = false, $logQuery = false)
- {
- if ($this->_addSubscribersFlag && !$this->isLoaded()) {
- $this->_addSubscriberInfoToSelect();
- }
- return parent::load($printQuery, $logQuery);
- }
- /**
- * Joins subscribers information
- *
- * @return $this
- */
- public function addSubscribersInfo()
- {
- $this->_addSubscribersFlag = true;
- return $this;
- }
- /**
- * Checks if field is 'subscribers_total', 'subscribers_sent' to add specific filter or adds regular filter
- *
- * @param string $field
- * @param null|string|array $condition
- * @return $this
- */
- public function addFieldToFilter($field, $condition = null)
- {
- if (in_array($field, ['subscribers_total', 'subscribers_sent'])) {
- $this->addFieldToFilter('main_table.queue_id', ['in' => $this->_getIdsFromLink($field, $condition)]);
- return $this;
- } else {
- return parent::addFieldToFilter($field, $condition);
- }
- }
- /**
- * Returns ids from queue_link table
- *
- * @param string $field
- * @param null|string|array $condition
- * @return array
- */
- protected function _getIdsFromLink($field, $condition)
- {
- $select = $this->getConnection()->select()->from(
- $this->getTable('newsletter_queue_link'),
- ['queue_id', 'total' => new \Zend_Db_Expr('COUNT(queue_link_id)')]
- )->group(
- 'queue_id'
- )->having(
- $this->_getConditionSql('total', $condition)
- );
- if ($field == 'subscribers_sent') {
- $select->where('letter_sent_at IS NOT NULL');
- }
- $idList = $this->getConnection()->fetchCol($select);
- if (count($idList)) {
- return $idList;
- }
- return [0];
- }
- /**
- * Set filter for queue by subscriber.
- *
- * @param int $subscriberId
- * @return $this
- */
- public function addSubscriberFilter($subscriberId)
- {
- $this->getSelect()->join(
- ['link' => $this->getTable('newsletter_queue_link')],
- 'main_table.queue_id=link.queue_id',
- ['letter_sent_at']
- )->where(
- 'link.subscriber_id = ?',
- $subscriberId
- );
- return $this;
- }
- /**
- * Add filter by only ready for sending item
- *
- * @return $this
- */
- public function addOnlyForSendingFilter()
- {
- $this->getSelect()->where(
- 'main_table.queue_status in (?)',
- [\Magento\Newsletter\Model\Queue::STATUS_SENDING, \Magento\Newsletter\Model\Queue::STATUS_NEVER]
- )->where(
- 'main_table.queue_start_at < ?',
- $this->_date->gmtDate()
- )->where(
- 'main_table.queue_start_at IS NOT NULL'
- );
- return $this;
- }
- /**
- * Add filter by only not sent items
- *
- * @return $this
- */
- public function addOnlyUnsentFilter()
- {
- $this->addFieldToFilter('main_table.queue_status', \Magento\Newsletter\Model\Queue::STATUS_NEVER);
- return $this;
- }
- /**
- * Returns options array
- *
- * @return array
- */
- public function toOptionArray()
- {
- return $this->_toOptionArray('queue_id', 'template_subject');
- }
- /**
- * Filter collection by specified store ids
- *
- * @param int[]|int $storeIds
- * @return $this
- */
- public function addStoreFilter($storeIds)
- {
- if (!$this->_isStoreFilter) {
- $this->getSelect()->joinInner(
- ['store_link' => $this->getTable('newsletter_queue_store_link')],
- 'main_table.queue_id = store_link.queue_id',
- []
- )->where(
- 'store_link.store_id IN (?)',
- $storeIds
- )->group(
- 'main_table.queue_id'
- );
- $this->_isStoreFilter = true;
- }
- return $this;
- }
- }
|