From be4ff3c091cff13af49041b59f12f97a466b0040 Mon Sep 17 00:00:00 2001 From: Thomas Steur Date: Mon, 1 Feb 2016 14:52:20 +0000 Subject: show error message in case we deactivate a plugin because of missing dependencies --- core/Notification/Manager.php | 59 ++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 15 deletions(-) (limited to 'core/Notification') diff --git a/core/Notification/Manager.php b/core/Notification/Manager.php index e7eafec49e..bdf1f130dd 100644 --- a/core/Notification/Manager.php +++ b/core/Notification/Manager.php @@ -23,6 +23,11 @@ class Manager */ private static $session = null; + /** + * @var Notification[] + */ + private static $notifications = array(); + /** * Posts a notification that will be shown in Piwik's status bar. If a notification with the same ID * has been posted and has not been closed/removed, it will be replaced with `$notification`. @@ -105,12 +110,21 @@ class Manager private static function addNotification($id, Notification $notification) { - if (!self::isEnabled()) { - return; - } + self::saveNotificationAcrossUiRequestsIfNeeded($id, $notification); - $session = static::getSession(); - $session->notifications[$id] = $notification; + // we store all kinda notifications here so in case the session is not enabled or disabled later there is still + // a chance it gets delivered to the UI during the same request. + self::$notifications[$id] = $notification; + } + + private static function saveNotificationAcrossUiRequestsIfNeeded($id, Notification $notification) + { + $isPersistent = $notification->type === Notification::TYPE_PERSISTENT; + + if ($isPersistent && self::isSessionEnabled()) { + $session = static::getSession(); + $session->notifications[$id] = $notification; + } } private static function removeOldestNotificationsIfThereAreTooMany() @@ -126,28 +140,43 @@ class Manager private static function getAllNotifications() { - if (!self::isEnabled()) { + if (!self::isSessionEnabled()) { return array(); } - $session = static::getSession(); + $notifications = self::$notifications; + + foreach ($notifications as $id => $notification) { + // we copy them over to the session if possible and persist it in case the session was not yet + // writable / enabled at the time the notification was added. + self::saveNotificationAcrossUiRequestsIfNeeded($id, $notification); + } - return $session->notifications; + if (self::isSessionEnabled()) { + $session = static::getSession(); + foreach ($session->notifications as $id => $notification) { + $notifications[$id] = $notification; + } + } + + return $notifications; } private static function removeNotification($id) { - if (!self::isEnabled()) { - return; + if (array_key_exists($id, self::$notifications)) { + unset(self::$notifications[$id]); } - $session = static::getSession(); - if (array_key_exists($id, $session->notifications)) { - unset($session->notifications[$id]); + if (self::isSessionEnabled()) { + $session = static::getSession(); + if (array_key_exists($id, $session->notifications)) { + unset($session->notifications[$id]); + } } } - private static function isEnabled() + private static function isSessionEnabled() { return Session::isWritable() && Session::isReadable(); } @@ -161,7 +190,7 @@ class Manager static::$session = new SessionNamespace('notification'); } - if (empty(static::$session->notifications) && self::isEnabled()) { + if (empty(static::$session->notifications) && self::isSessionEnabled()) { static::$session->notifications = array(); } -- cgit v1.2.3