Jeder, der sich schonmal im Magento-Backend eingeloggt hat, kennt sicherlich die Notifications / Mitteilungen / Hinweise, welche gerne über neue Updates oder andere wichtige Events informieren. Doch wie erstellt man so eine Notification aus seinem eigenen Modul heraus und wo werden die gespeichert, regelmäßig abgerufen?
Gespeichert werden die Benachrichtigungen in der Tabelle adminnotification_inbox. Die dort gespeicherten Einträge werden nie gelöscht, selbst wenn man diese über den Admin löscht – in diesem Fall wird auf dem Datensatz nur das Flag is_remove auf 1 gesetzt. Etwas unschön ist allerdings in meinen Augen, dass das Flag nicht pro Benutzer gesetzt wird, sondern nur einmalig zentral. Das heißt, dass ein anderer Benutzer, der sich anmeldet, die Meldungen eventuell gar nicht mehr sieht.
Jede Notification hat dabei einen Titel, eine Beschreibung, ein Datum und eine URL. Hinzu kommt die „Schwere“. Hier unterscheidet man zwischen wichtig und unwichtig. Mit wichtigen Benachrichtigungen sollte daher sehr sparsam umgegangen werden.
Der Standard-Feed für die Admin-Notifications wird von der Klasse Mage_AdminNotification_Model_Feed verwaltet. Diese hängt sich einfach in das preDispatch-Event aller Admin-Controller und prüft dann, ob es neue Einträge für die entsprechende URL gibt. Das letzte Prüfdatum wird dabei im Cache hinterlegt, um einen Request bei jedem Seitenaufbau zu vermeiden. Standardmäßig wird folgende URL verwendet:
http://notifications.magentocommerce.com/community/notifications.rss
Wie man sieht, handelt es sich um einen Standard-RSS-Feed. Der Einzige Unterschied ist, dass es zusätzlich ein „Severity“-Element gibt, welches die Schwere der Mitteilung beschreibt. Alles was wir also machen müssen, um eigene Notifications auf Basis von RSS-Feeds zu implementieren, ist das Model zu erweitern (mit neuer URL), und neue Cache-Tags zu definieren, damit sich die Module nicht in die Quere kommen.
<adminhtml> <events> <controller_action_predispatch> <observers> <mk_notification> <class>mk_notification/observer</class> <method>preDispatch</method> <type>singleton</type> </mk_notification> </observers> </controller_action_predispatch> </events> </adminhtml>
class MKleine_Notification_Model_Observer extends Mage_Core_Model_Abstract { public function preDispatch($observer) { if (Mage::getSingleton('admin/session')->isLoggedIn()) { /* @var $feedModel MKleine_Notification_Model_Feed */ $feedModel = Mage::getModel('mk_notification/feed'); $feedModel->checkUpdate(); } } }
Und am Ende noch das Feed-Model.
class MKleine_Notification_Model_Feed extends Mage_AdminNotification_Model_Feed { public function getFeedUrl() { if (is_null($this->_feedUrl)) { $this->_feedUrl = (Mage::getStoreConfigFlag(self::XML_USE_HTTPS_PATH) ? 'https://' : 'http://') . 'notifications.mkleine.de/magento.rss'; } return $this->_feedUrl; } public function getLastUpdate() { return Mage::app()->loadCache('admin_mkleine_notifications_lastcheck'); } public function setLastUpdate() { Mage::app()->saveCache(time(), 'admin_mkleine_notifications_lastcheck'); return $this; } }
Fertig. Wie genau man den Feed erstellt, werde ich hier allerdings nicht beschreiben. Dafür gibt es schließlich etliche fertige Klassen im Netz. Falls man auf einem anderen Wege die Notifications erstellen möchte, sollte man sich die Klasse Mage_AdminNotification_Model_Inbox anschauen.
Alles in allem wirklich schnell gemacht, und eine tolle Lösung um seine Kunden mit neuen Informationen zu versorgen (beispielsweise neue Versionen der Extensions).