Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Collection.php
Go to the documentation of this file.
1 <?php
7 
17 {
23  protected $_addSubscribersFlag = false;
24 
30  protected $_isStoreFilter = false;
31 
37  protected $_date;
38 
48  public function __construct(
49  \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
50  \Psr\Log\LoggerInterface $logger,
51  \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
52  \Magento\Framework\Event\ManagerInterface $eventManager,
53  \Magento\Framework\Stdlib\DateTime\DateTime $date,
54  \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
55  \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
56  ) {
57  parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
58  $this->_date = $date;
59  }
60 
66  protected function _construct()
67  {
68  $this->_map['fields']['queue_id'] = 'main_table.queue_id';
69  $this->_init(\Magento\Newsletter\Model\Queue::class, \Magento\Newsletter\Model\ResourceModel\Queue::class);
70  }
71 
77  public function addTemplateInfo()
78  {
79  $this->getSelect()->joinLeft(
80  ['template' => $this->getTable('newsletter_template')],
81  'template.template_id=main_table.template_id',
82  ['template_subject', 'template_sender_name', 'template_sender_email']
83  );
84  $this->_joinedTables['template'] = true;
85  return $this;
86  }
87 
93  protected function _addSubscriberInfoToSelect()
94  {
96  $select = $this->getConnection()->select()->from(
97  ['qlt' => $this->getTable('newsletter_queue_link')],
98  'COUNT(qlt.queue_link_id)'
99  )->where(
100  'qlt.queue_id = main_table.queue_id'
101  );
102  $totalExpr = new \Zend_Db_Expr(sprintf('(%s)', $select->assemble()));
103  $select = $this->getConnection()->select()->from(
104  ['qls' => $this->getTable('newsletter_queue_link')],
105  'COUNT(qls.queue_link_id)'
106  )->where(
107  'qls.queue_id = main_table.queue_id'
108  )->where(
109  'qls.letter_sent_at IS NOT NULL'
110  );
111  $sentExpr = new \Zend_Db_Expr(sprintf('(%s)', $select->assemble()));
112 
113  $this->getSelect()->columns(['subscribers_sent' => $sentExpr, 'subscribers_total' => $totalExpr]);
114  return $this;
115  }
116 
124  public function load($printQuery = false, $logQuery = false)
125  {
126  if ($this->_addSubscribersFlag && !$this->isLoaded()) {
127  $this->_addSubscriberInfoToSelect();
128  }
129  return parent::load($printQuery, $logQuery);
130  }
131 
137  public function addSubscribersInfo()
138  {
139  $this->_addSubscribersFlag = true;
140  return $this;
141  }
142 
151  public function addFieldToFilter($field, $condition = null)
152  {
153  if (in_array($field, ['subscribers_total', 'subscribers_sent'])) {
154  $this->addFieldToFilter('main_table.queue_id', ['in' => $this->_getIdsFromLink($field, $condition)]);
155  return $this;
156  } else {
157  return parent::addFieldToFilter($field, $condition);
158  }
159  }
160 
168  protected function _getIdsFromLink($field, $condition)
169  {
170  $select = $this->getConnection()->select()->from(
171  $this->getTable('newsletter_queue_link'),
172  ['queue_id', 'total' => new \Zend_Db_Expr('COUNT(queue_link_id)')]
173  )->group(
174  'queue_id'
175  )->having(
176  $this->_getConditionSql('total', $condition)
177  );
178 
179  if ($field == 'subscribers_sent') {
180  $select->where('letter_sent_at IS NOT NULL');
181  }
182 
183  $idList = $this->getConnection()->fetchCol($select);
184 
185  if (count($idList)) {
186  return $idList;
187  }
188 
189  return [0];
190  }
191 
198  public function addSubscriberFilter($subscriberId)
199  {
200  $this->getSelect()->join(
201  ['link' => $this->getTable('newsletter_queue_link')],
202  'main_table.queue_id=link.queue_id',
203  ['letter_sent_at']
204  )->where(
205  'link.subscriber_id = ?',
206  $subscriberId
207  );
208 
209  return $this;
210  }
211 
217  public function addOnlyForSendingFilter()
218  {
219  $this->getSelect()->where(
220  'main_table.queue_status in (?)',
221  [\Magento\Newsletter\Model\Queue::STATUS_SENDING, \Magento\Newsletter\Model\Queue::STATUS_NEVER]
222  )->where(
223  'main_table.queue_start_at < ?',
224  $this->_date->gmtDate()
225  )->where(
226  'main_table.queue_start_at IS NOT NULL'
227  );
228 
229  return $this;
230  }
231 
237  public function addOnlyUnsentFilter()
238  {
239  $this->addFieldToFilter('main_table.queue_status', \Magento\Newsletter\Model\Queue::STATUS_NEVER);
240 
241  return $this;
242  }
243 
249  public function toOptionArray()
250  {
251  return $this->_toOptionArray('queue_id', 'template_subject');
252  }
253 
260  public function addStoreFilter($storeIds)
261  {
262  if (!$this->_isStoreFilter) {
263  $this->getSelect()->joinInner(
264  ['store_link' => $this->getTable('newsletter_queue_store_link')],
265  'main_table.queue_id = store_link.queue_id',
266  []
267  )->where(
268  'store_link.store_id IN (?)',
269  $storeIds
270  )->group(
271  'main_table.queue_id'
272  );
273  $this->_isStoreFilter = true;
274  }
275  return $this;
276  }
277 }
_toOptionArray($valueField=null, $labelField='name', $additional=[])
Definition: AbstractDb.php:641
$resource
Definition: bulk.php:12
$logger
load($printQuery=false, $logQuery=false)
Definition: Collection.php:124
$connection
Definition: bulk.php:13
__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)
Definition: Collection.php:48