Magento 2 : Add custom notification in admin
-
28-03-2021 - |
Question
I see some module has a custom notification, my question is how to add it in my module
Update:
vendor/module/etc/adminhtml/events.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_predispatch">
<observer name="magepowadminnotification" instance="Vendor\module\Observer\PredispatchAdminControllerObserver" />
</event>
</config>
vendor/module/Observer/PredispatchAdminActionControllerObserver.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace vendor\module\Observer;
use Magento\Framework\Event\ObserverInterface;
/**
* AdminNotification observer
*
* @author Magento Core Team <core@magentocommerce.com>
*/
class PredispatchAdminActionControllerObserver implements ObserverInterface
{
/**
* @var \Magento\AdminNotification\Model\FeedFactory
*/
protected $_feedFactory;
/**
* @var \Magento\Backend\Model\Auth\Session
*/
protected $_backendAuthSession;
/**
* @param \Magento\AdminNotification\Model\FeedFactory $feedFactory
* @param \Magento\Backend\Model\Auth\Session $backendAuthSession
*/
public function __construct(
\Magento\AdminNotification\Model\FeedFactory $feedFactory,
\Magento\Backend\Model\Auth\Session $backendAuthSession
) {
$this->_feedFactory = $feedFactory;
$this->_backendAuthSession = $backendAuthSession;
}
/**
* Predispatch admin action controller
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
if ($this->_backendAuthSession->isLoggedIn()) {
$feedModel = $this->_feedFactory->create();
/* @var $feedModel \Magento\AdminNotification\Model\Feed */
$feedModel->checkUpdate();
}
}
}
vendor/module/Model/feed.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace vendor\module\Model;
use Magento\Framework\Config\ConfigOptionsListConstants;
/**
* AdminNotification Feed model
*
* @author Magento Core Team <core@magentocommerce.com>
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @api
* @since 100.0.2
*/
class Feed extends \Magento\Framework\Model\AbstractModel
{
const XML_USE_HTTPS_PATH = 'system/adminnotification/use_https';
const XML_FEED_URL_PATH = 'system/adminnotification/feed_url';
const XML_FREQUENCY_PATH = 'system/adminnotification/frequency';
const XML_LAST_UPDATE_PATH = 'system/adminnotification/last_update';
/**
* Feed url
*
* @var string
*/
protected $_feedUrl;
/**
* @var \Magento\Backend\App\ConfigInterface
*/
protected $_backendConfig;
/**
* @var \Magento\AdminNotification\Model\InboxFactory
*/
protected $_inboxFactory;
/**
* @var \Magento\Framework\HTTP\Adapter\CurlFactory
*
*/
protected $curlFactory;
/**
* Deployment configuration
*
* @var \Magento\Framework\App\DeploymentConfig
*/
protected $_deploymentConfig;
/**
* @var \Magento\Framework\App\ProductMetadataInterface
*/
protected $productMetadata;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $urlBuilder;
/**
* @param \Magento\Framework\Model\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Backend\App\ConfigInterface $backendConfig
* @param InboxFactory $inboxFactory
* @param \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory
* @param \Magento\Framework\App\DeploymentConfig $deploymentConfig
* @param \Magento\Framework\App\ProductMetadataInterface $productMetadata
* @param \Magento\Framework\UrlInterface $urlBuilder
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
* @param array $data
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Backend\App\ConfigInterface $backendConfig,
\Magento\AdminNotification\Model\InboxFactory $inboxFactory,
\Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory,
\Magento\Framework\App\DeploymentConfig $deploymentConfig,
\Magento\Framework\App\ProductMetadataInterface $productMetadata,
\Magento\Framework\UrlInterface $urlBuilder,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
$this->_backendConfig = $backendConfig;
$this->_inboxFactory = $inboxFactory;
$this->curlFactory = $curlFactory;
$this->_deploymentConfig = $deploymentConfig;
$this->productMetadata = $productMetadata;
$this->urlBuilder = $urlBuilder;
}
/**
* Init model
*
* @return void
*/
protected function _construct()
{
}
/**
* Retrieve feed url
*
* @return string
*/
public function getFeedUrl()
{
$httpPath = $this->_backendConfig->isSetFlag(self::XML_USE_HTTPS_PATH) ? 'https://' : 'http://';
if ($this->_feedUrl === null) {
$this->_feedUrl = $httpPath . $this->_backendConfig->getValue(self::XML_FEED_URL_PATH);
}
return $this->_feedUrl;
}
/**
* Check feed for modification
*
* @return $this
*/
public function checkUpdate()
{
if ($this->getFrequency() + $this->getLastUpdate() > time()) {
return $this;
}
$feedData = [];
$feedXml = $this->getFeedData();
$installDate = strtotime($this->_deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_INSTALL_DATE));
if ($feedXml && $feedXml->channel && $feedXml->channel->item) {
foreach ($feedXml->channel->item as $item) {
$itemPublicationDate = strtotime((string)$item->pubDate);
if ($installDate <= $itemPublicationDate) {
$feedData[] = [
'severity' => (int)$item->severity,
'date_added' => date('Y-m-d H:i:s', $itemPublicationDate),
'title' => $this->escapeString($item->title),
'description' => $this->escapeString($item->description),
'url' => $this->escapeString($item->link),
];
}
}
if ($feedData) {
$this->_inboxFactory->create()->parse(array_reverse($feedData));
}
}
$this->setLastUpdate();
return $this;
}
/**
* Retrieve Update Frequency
*
* @return int
*/
public function getFrequency()
{
return $this->_backendConfig->getValue(self::XML_FREQUENCY_PATH) * 3600;
}
/**
* Retrieve Last update time
*
* @return int
*/
public function getLastUpdate()
{
return $this->_cacheManager->load('magepow_notifications_lastcheck');
}
/**
* Set last update time (now)
*
* @return $this
*/
public function setLastUpdate()
{
$this->_cacheManager->save(time(), 'magepow_notifications_lastcheck');
return $this;
}
/**
* Retrieve feed data as XML element
*
* @return \SimpleXMLElement
*/
public function getFeedData()
{
$curl = $this->curlFactory->create();
$curl->setConfig(
[
'timeout' => 2,
'useragent' => $this->productMetadata->getName()
. '/' . $this->productMetadata->getVersion()
. ' (' . $this->productMetadata->getEdition() . ')',
'referer' => $this->urlBuilder->getUrl('*/*/*')
]
);
$curl->write(\Zend_Http_Client::GET, $this->getFeedUrl(), '1.0');
$data = $curl->read();
$data = preg_split('/^\r?$/m', $data, 2);
$data = trim($data[1]);
$curl->close();
try {
$xml = new \SimpleXMLElement($data);
} catch (\Exception $e) {
return false;
}
return $xml;
}
/**
* Retrieve feed as XML element
*
* @return \SimpleXMLElement
*/
public function getFeedXml()
{
try {
$data = $this->getFeedData();
$xml = new \SimpleXMLElement($data);
} catch (\Exception $e) {
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?>');
}
return $xml;
}
/**
* Converts incoming data to string format and escapes special characters.
*
* @param \SimpleXMLElement $data
* @return string
*/
private function escapeString(\SimpleXMLElement $data)
{
return htmlspecialchars((string)$data);
}
}
hope someone helps me. Thank.
Solution
Try the following way:
use Magento\Framework\Notification\MessageInterface;
/**
* @var \Magento\AdminNotification\Model\Inbox
*/
protected $adminNotificationInbox;
public function __construct(
\Magento\AdminNotification\Model\Inbox $adminNotificationInbox
) {
$this->adminNotificationInbox = $adminNotificationInbox;
}
And now:
$date = date('Y-m-d H:i:s');
$this->adminNotificationInbox->parse(
[
[
'severity' => MessageInterface::SEVERITY_NOTICE,
'date_added' => $date,
'title' => $title,
'description' => $description
],
]
);
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange