123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Newsletter\Model;
- use Magento\Framework\App\TemplateTypesInterface;
- use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
- use Magento\Framework\Stdlib\DateTime\Timezone\LocalizedDateToUtcConverterInterface;
- /**
- * Newsletter queue model.
- *
- * @method int getTemplateId()
- * @method \Magento\Newsletter\Model\Queue setTemplateId(int $value)
- * @method int getNewsletterType()
- * @method \Magento\Newsletter\Model\Queue setNewsletterType(int $value)
- * @method string getNewsletterText()
- * @method \Magento\Newsletter\Model\Queue setNewsletterText(string $value)
- * @method string getNewsletterStyles()
- * @method \Magento\Newsletter\Model\Queue setNewsletterStyles(string $value)
- * @method string getNewsletterSubject()
- * @method \Magento\Newsletter\Model\Queue setNewsletterSubject(string $value)
- * @method string getNewsletterSenderName()
- * @method \Magento\Newsletter\Model\Queue setNewsletterSenderName(string $value)
- * @method string getNewsletterSenderEmail()
- * @method \Magento\Newsletter\Model\Queue setNewsletterSenderEmail(string $value)
- * @method int getQueueStatus()
- * @method \Magento\Newsletter\Model\Queue setQueueStatus(int $value)
- * @method string getQueueStartAt()
- * @method \Magento\Newsletter\Model\Queue setQueueStartAt(string $value)
- * @method string getQueueFinishAt()
- * @method \Magento\Newsletter\Model\Queue setQueueFinishAt(string $value)
- * @SuppressWarnings(PHPMD.LongVariable)
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- *
- * @api
- * @since 100.0.2
- */
- class Queue extends \Magento\Framework\Model\AbstractModel implements TemplateTypesInterface
- {
- /**
- * Newsletter Template object
- *
- * @var \Magento\Newsletter\Model\Template
- */
- protected $_template;
- /**
- * Subscribers collection
- *
- * @var \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection
- */
- protected $_subscribersCollection;
- /**
- * Save stores flag.
- *
- * @var boolean
- */
- protected $_saveStoresFlag = false;
- /**
- * Stores assigned to queue.
- *
- * @var array
- */
- protected $_stores = [];
- const STATUS_NEVER = 0;
- const STATUS_SENDING = 1;
- const STATUS_CANCEL = 2;
- const STATUS_SENT = 3;
- const STATUS_PAUSE = 4;
- /**
- * Filter for newsletter text
- *
- * @var \Magento\Newsletter\Model\Template\Filter
- */
- protected $_templateFilter;
- /**
- * Date
- *
- * @var \Magento\Framework\Stdlib\DateTime\DateTime
- */
- protected $_date;
- /**
- * Problem factory
- *
- * @var \Magento\Newsletter\Model\ProblemFactory
- */
- protected $_problemFactory;
- /**
- * Template factory
- *
- * @var \Magento\Newsletter\Model\TemplateFactory
- */
- protected $_templateFactory;
- /**
- * @var \Magento\Newsletter\Model\Queue\TransportBuilder
- */
- protected $_transportBuilder;
- /**
- * Timezone library.
- *
- * @var TimezoneInterface
- */
- private $timezone;
- /**
- * @var LocalizedDateToUtcConverterInterface
- */
- private $utcConverter;
- /**
- * @param \Magento\Framework\Model\Context $context
- * @param \Magento\Framework\Registry $registry
- * @param \Magento\Newsletter\Model\Template\Filter $templateFilter
- * @param \Magento\Framework\Stdlib\DateTime\DateTime $date
- * @param \Magento\Newsletter\Model\TemplateFactory $templateFactory
- * @param \Magento\Newsletter\Model\ProblemFactory $problemFactory
- * @param \Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory $subscriberCollectionFactory
- * @param \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder
- * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
- * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
- * @param array $data
- * @param TimezoneInterface $timezone
- * @param LocalizedDateToUtcConverterInterface $utcConverter
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- \Magento\Framework\Model\Context $context,
- \Magento\Framework\Registry $registry,
- \Magento\Newsletter\Model\Template\Filter $templateFilter,
- \Magento\Framework\Stdlib\DateTime\DateTime $date,
- \Magento\Newsletter\Model\TemplateFactory $templateFactory,
- \Magento\Newsletter\Model\ProblemFactory $problemFactory,
- \Magento\Newsletter\Model\ResourceModel\Subscriber\CollectionFactory $subscriberCollectionFactory,
- \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder,
- \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
- \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
- array $data = [],
- TimezoneInterface $timezone = null,
- LocalizedDateToUtcConverterInterface $utcConverter = null
- ) {
- parent::__construct(
- $context,
- $registry,
- $resource,
- $resourceCollection,
- $data
- );
- $this->_templateFilter = $templateFilter;
- $this->_date = $date;
- $this->_templateFactory = $templateFactory;
- $this->_problemFactory = $problemFactory;
- $this->_subscribersCollection = $subscriberCollectionFactory->create();
- $this->_transportBuilder = $transportBuilder;
- $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
- $this->timezone = $timezone ?: $objectManager->get(TimezoneInterface::class);
- $this->utcConverter = $utcConverter ?? $objectManager->get(LocalizedDateToUtcConverterInterface::class);
- }
- /**
- * Initialize resource model
- *
- * @return void
- */
- protected function _construct()
- {
- parent::_construct();
- $this->_init(\Magento\Newsletter\Model\ResourceModel\Queue::class);
- }
- /**
- * Return: is this queue newly created or not.
- *
- * @return boolean
- */
- public function isNew()
- {
- return $this->getQueueStatus() === null;
- }
- /**
- * Set $_data['queue_start'] based on string from backend, which based on locale.
- *
- * @param string|null $startAt start date of the mailing queue
- * @return $this
- */
- public function setQueueStartAtByString($startAt)
- {
- if ($startAt === null || $startAt == '') {
- $this->setQueueStartAt(null);
- } else {
- $this->setQueueStartAt($this->utcConverter->convertLocalizedDateToUtc($startAt));
- }
- return $this;
- }
- /**
- * Send messages to subscribers for this queue
- *
- * @param int $count
- * @return $this
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- public function sendPerSubscriber($count = 20)
- {
- if ($this->getQueueStatus() != self::STATUS_SENDING &&
- ($this->getQueueStatus() != self::STATUS_NEVER &&
- $this->getQueueStartAt())
- ) {
- return $this;
- }
- if (!$this->_subscribersCollection->getQueueJoinedFlag()) {
- $this->_subscribersCollection->useQueue($this);
- }
- if ($this->_subscribersCollection->getSize() == 0) {
- $this->_finishQueue();
- return $this;
- }
- $collection = $this->_subscribersCollection->useOnlyUnsent()->showCustomerInfo()->setPageSize(
- $count
- )->setCurPage(
- 1
- )->load();
- $this->_transportBuilder->setTemplateData(
- [
- 'template_subject' => $this->getNewsletterSubject(),
- 'template_text' => $this->getNewsletterText(),
- 'template_styles' => $this->getNewsletterStyles(),
- 'template_filter' => $this->_templateFilter,
- 'template_type' => self::TYPE_HTML,
- ]
- );
- /** @var \Magento\Newsletter\Model\Subscriber $item */
- foreach ($collection->getItems() as $item) {
- $transport = $this->_transportBuilder->setTemplateOptions(
- ['area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $item->getStoreId()]
- )->setTemplateVars(
- ['subscriber' => $item]
- )->setFrom(
- ['name' => $this->getNewsletterSenderName(), 'email' => $this->getNewsletterSenderEmail()]
- )->addTo(
- $item->getSubscriberEmail(),
- $item->getSubscriberFullName()
- )->getTransport();
- try {
- $transport->sendMessage();
- } catch (\Magento\Framework\Exception\MailException $e) {
- /** @var \Magento\Newsletter\Model\Problem $problem */
- $problem = $this->_problemFactory->create();
- $problem->addSubscriberData($item);
- $problem->addQueueData($this);
- $problem->addErrorData($e);
- $problem->save();
- }
- $item->received($this);
- }
- if (count($collection->getItems()) < $count - 1 || count($collection->getItems()) == 0) {
- $this->_finishQueue();
- }
- return $this;
- }
- /**
- * Finish queue: set status SENT and update finish date
- *
- * @return $this
- */
- protected function _finishQueue()
- {
- $this->setQueueFinishAt($this->_date->gmtDate());
- $this->setQueueStatus(self::STATUS_SENT);
- $this->save();
- return $this;
- }
- /**
- * Getter data for saving
- *
- * @return array
- */
- public function getDataForSave()
- {
- $data = [];
- $data['template_id'] = $this->getTemplateId();
- $data['queue_status'] = $this->getQueueStatus();
- $data['queue_start_at'] = $this->getQueueStartAt();
- $data['queue_finish_at'] = $this->getQueueFinishAt();
- return $data;
- }
- /**
- * Add subscribers to queue.
- *
- * @param array $subscriberIds
- * @return $this
- */
- public function addSubscribersToQueue(array $subscriberIds)
- {
- $this->_getResource()->addSubscribersToQueue($this, $subscriberIds);
- return $this;
- }
- /**
- * Setter for save stores flag.
- *
- * @param boolean|integer|string $value
- * @return $this
- */
- public function setSaveStoresFlag($value)
- {
- $this->_saveStoresFlag = (bool)$value;
- return $this;
- }
- /**
- * Getter for save stores flag.
- *
- * @return boolean
- * @SuppressWarnings(PHPMD.BooleanGetMethodName)
- */
- public function getSaveStoresFlag()
- {
- return $this->_saveStoresFlag;
- }
- /**
- * Setter for stores of queue.
- *
- * @param array $storesIds
- * @return $this
- */
- public function setStores(array $storesIds)
- {
- $this->setSaveStoresFlag(true);
- $this->_stores = $storesIds;
- return $this;
- }
- /**
- * Getter for stores of queue.
- *
- * @return array
- */
- public function getStores()
- {
- if (!$this->_stores) {
- $this->_stores = $this->_getResource()->getStores($this);
- }
- return $this->_stores;
- }
- /**
- * Retrieve Newsletter Template object
- *
- * @return \Magento\Newsletter\Model\Template
- */
- public function getTemplate()
- {
- if ($this->_template === null) {
- $this->_template = $this->_templateFactory->create()->load($this->getTemplateId());
- }
- return $this->_template;
- }
- /**
- * Return true if template type eq text
- *
- * @return boolean
- */
- public function isPlain()
- {
- return $this->getType() == self::TYPE_TEXT;
- }
- /**
- * Getter for template type
- *
- * @return int|string
- */
- public function getType()
- {
- return $this->getNewsletterType();
- }
- }
|