Magento2 override Newsletter Model showing error
-
25-01-2021 - |
Frage
I want to do some modifications inside Subscriber.php model file inside Newsletter module with mentioned below 2 methods, so i have override model with my custom module with di.xml with following code:
<preference for="Magento\Newsletter\Model\Subscriber" type="Commercepundit\Dealerregistration\Model\Subscriber" />
Here is my Subscriber.php code:
<?php
/**
*
* @category Commercepundit
* @package Commercepundit_Dealerregistration
* @module Dealerregistration
* @author Commercepundit Developer
*/
namespace Commercepundit\Dealerregistration\Model;
/*use Commercepundit\Core\Helper\Data as CoreHelper;
use Magento\Customer\Api\AccountManagementInterface;
use Magento\Customer\Api\CustomerRepositoryInterface;*/
class Subscriber extends \Magento\Newsletter\Model\Subscriber
{
public function __construct(
\Commercepundit\Core\Helper\Data $coreHelper
)
{
$this->coreHelper = $coreHelper;
}
/**
* Sends out confirmation email
*
* @return $this
*/
public function sendConfirmationRequestEmail()
{
if ($this->getImportMode()) {
return $this;
}
if (!$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
) || !$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
) {
return $this;
}
$this->inlineTranslation->suspend();
$this->_transportBuilder->setTemplateIdentifier(
$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->setTemplateOptions(
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
'store' => $this->_storeManager->getStore()->getId(),
]
)->setTemplateVars(
['subscriber' => $this, 'store' => $this->_storeManager->getStore()]
)->setFrom(
$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->addTo(
$this->getEmail(),
$this->getName()
);
$transport = $this->_transportBuilder->getTransport();
$transport->sendMessage();
$this->inlineTranslation->resume();
return $this;
}
/**
* Sends out confirmation success email
*
* @return $this
*/
public function sendConfirmationSuccessEmail()
{
$storeId = $this->getStoreId();
if ($this->getImportMode()) {
return $this;
}
if (!$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
) || !$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
) {
return $this;
}
$this->inlineTranslation->suspend();
$this->_transportBuilder->setTemplateIdentifier(
$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->setTemplateOptions(
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
'store' => $this->_storeManager->getStore()->getId(),
]
)->setTemplateVars(
['subscriber' => $this]
)->setFrom(
$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->addTo(
$this->getEmail(),
$this->getName()
);
$transport = $this->_transportBuilder->getTransport();
$transport->sendMessage();
$this->inlineTranslation->resume();
return $this;
}
}
When i run this code, i am getting following error: There was a problem with the subscription: The resource isn't set.
Can anyone let me know what could be missing?
Lösung
try: please remove the generated folder and cleaned cache after replacing a code
<?php
namespace Commercepundit\Dealerregistration\Model;
use Magento\Customer\Api\AccountManagementInterface;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\MailException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Stdlib\DateTime\DateTime;
class Subscriber extends \Magento\Newsletter\Model\Subscriber
{
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Newsletter\Helper\Data $newsletterData,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Customer\Model\Session $customerSession,
CustomerRepositoryInterface $customerRepository,
AccountManagementInterface $customerAccountManagement,
\Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = [],
DateTime $dateTime = null,
\Commercepundit\Core\Helper\Data $coreHelper
) {
$this->dateTime = $dateTime ?: ObjectManager::getInstance()->get(DateTime::class);
$this->coreHelper = $coreHelper;
parent::__construct($context, $registry, $newsletterData, $scopeConfig, $transportBuilder, $storeManager, $customerSession, $customerRepository, $customerAccountManagement, $inlineTranslation, $resource, $resourceCollection, $data, $dateTime);
}
/**
* Sends out confirmation email
*
* @return $this
*/
public function sendConfirmationRequestEmail()
{
if ($this->getImportMode()) {
return $this;
}
if (!$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
) || !$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
) {
return $this;
}
$this->inlineTranslation->suspend();
$this->_transportBuilder->setTemplateIdentifier(
$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->setTemplateOptions(
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
'store' => $this->_storeManager->getStore()->getId(),
]
)->setTemplateVars(
['subscriber' => $this, 'store' => $this->_storeManager->getStore()]
)->setFrom(
$this->_scopeConfig->getValue(
self::XML_PATH_CONFIRM_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->addTo(
$this->getEmail(),
$this->getName()
);
$transport = $this->_transportBuilder->getTransport();
$transport->sendMessage();
$this->inlineTranslation->resume();
return $this;
}
/**
* Sends out confirmation success email
*
* @return $this
*/
public function sendConfirmationSuccessEmail()
{
$storeId = $this->getStoreId();
if ($this->getImportMode()) {
return $this;
}
if (!$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
) || !$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
) {
return $this;
}
$this->inlineTranslation->suspend();
$this->_transportBuilder->setTemplateIdentifier(
$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_TEMPLATE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->setTemplateOptions(
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
'store' => $this->_storeManager->getStore()->getId(),
]
)->setTemplateVars(
['subscriber' => $this]
)->setFrom(
$this->_scopeConfig->getValue(
self::XML_PATH_SUCCESS_EMAIL_IDENTITY,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
)
)->addTo(
$this->getEmail(),
$this->getName()
);
$transport = $this->_transportBuilder->getTransport();
$transport->sendMessage();
$this->inlineTranslation->resume();
return $this;
}
}
Andere Tipps
Please replace your construct with below code and try: please remove generated folder and cleand cache after replacing code
public function __construct(
\Magento\Framework\Model\ResourceModel\Db\Context $context,
\Magento\Framework\Stdlib\DateTime\DateTime $date,
\Magento\Framework\Math\Random $mathRandom,
\Commercepundit\Core\Helper\Data $coreHelper
) {
$this->_date = $date;
$this->mathRandom = $mathRandom;
$this->coreHelper = $coreHelper;
parent::__construct($context);
}
Finally I have removed construct and used scope config to get system configuration value so my purpose was resolved.
Add below file in your __construct method with variable like below:
protected $_transportBuilder;
public function __construct(
\Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
) {
$this->_transportBuilder = $transportBuilder;
}
and then remove generated and var directory.