mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 17:27:36 +00:00
436 lines
13 KiB
PHP
436 lines
13 KiB
PHP
<?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;
|
|
|
|
/**
|
|
* Subscriber collection
|
|
*
|
|
* @var \Magento\Newsletter\Model\ResourceModel\Subscriber\Collection
|
|
*/
|
|
protected $_subscribersCollection;
|
|
|
|
/**
|
|
* Flag for Save Stores.
|
|
*
|
|
* @var boolean
|
|
*/
|
|
protected $_saveStoresFlag = false;
|
|
|
|
/**
|
|
* Stores assigned to queue.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $_stores = [];
|
|
|
|
public const STATUS_NEVER = 0;
|
|
|
|
public const STATUS_SENDING = 1;
|
|
|
|
public const STATUS_CANCEL = 2;
|
|
|
|
public const STATUS_SENT = 3;
|
|
|
|
public const STATUS_PAUSE = 4;
|
|
|
|
/**
|
|
* Filter for newsletter text
|
|
*
|
|
* @var \Magento\Newsletter\Model\Template\Filter
|
|
*/
|
|
protected $_templateFilter;
|
|
|
|
/**
|
|
* Datetime
|
|
*
|
|
* @var \Magento\Framework\Stdlib\DateTime\DateTime
|
|
*/
|
|
protected $_date;
|
|
|
|
/**
|
|
* Factory of Problem
|
|
*
|
|
* @var \Magento\Newsletter\Model\ProblemFactory
|
|
*/
|
|
protected $_problemFactory;
|
|
|
|
/**
|
|
* Factory of Template
|
|
*
|
|
* @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)
|
|
{
|
|
// Cast start_at value to null if value is incorrect ("0", "" must be casted to null)
|
|
$startAt = (string) $startAt ?: null;
|
|
// Convert start_at value using UTC converter if start_at value is not null
|
|
$startAt = $startAt === null
|
|
? $startAt
|
|
: $this->utcConverter->convertLocalizedDateToUtc($startAt);
|
|
$this->setQueueStartAt($startAt);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Send messages to subscribers for this queue
|
|
*
|
|
* @param int $count
|
|
* @return $this
|
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
|
* @SuppressWarnings(PHPMD.NPathComplexity)
|
|
*/
|
|
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,
|
|
]
|
|
);
|
|
|
|
if ($this->getQueueStatus() != self::STATUS_SENDING && count($collection->getItems()) > 0) {
|
|
$this->startQueue();
|
|
}
|
|
|
|
/** @var Subscriber $item */
|
|
foreach ($collection->getItems() as $item) {
|
|
$transport = $this->_transportBuilder->setTemplateOptions(
|
|
['area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $item->getStoreId()]
|
|
)->setTemplateVars(
|
|
[
|
|
'subscriber' => $item,
|
|
'subscriber_data' => [
|
|
'unsubscription_link' => $item->getUnsubscriptionLink()
|
|
]
|
|
]
|
|
)->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;
|
|
}
|
|
|
|
/**
|
|
* Start queue: set status SENDING for queue
|
|
*
|
|
* @return $this
|
|
*/
|
|
private function startQueue()
|
|
{
|
|
$this->setQueueStatus(self::STATUS_SENDING);
|
|
$this->save();
|
|
|
|
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();
|
|
}
|
|
}
|