. namespace core; /** * User Alert notifications. * * @package core * @copyright 2016 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ use stdClass; defined('MOODLE_INTERNAL') || die(); class notification { /** * A notification of level 'success'. */ const SUCCESS = 'success'; /** * A notification of level 'warning'. */ const WARNING = 'warning'; /** * A notification of level 'info'. */ const INFO = 'info'; /** * A notification of level 'error'. */ const ERROR = 'error'; /** * Add a message to the session notification stack. * * @param string $message The message to add to the stack * @param string $level The type of message to add to the stack */ public static function add($message, $level = null) { global $PAGE, $SESSION; if ($PAGE && $PAGE->state === \moodle_page::STATE_IN_BODY) { // Currently in the page body - just render and exit immediately. // We insert some code to immediately insert this into the user-notifications created by the header. $id = uniqid(); echo \html_writer::span( $PAGE->get_renderer('core')->render(new \core\output\notification($message, $level)), '', array('id' => $id)); // Insert this JS here using a script directly rather than waiting for the page footer to load to avoid // ensure that the message is added to the user-notifications section as soon as possible after it is created. echo \html_writer::script( "(function() {" . "var notificationHolder = document.getElementById('user-notifications');" . "if (!notificationHolder) { return; }" . "var thisNotification = document.getElementById('{$id}');" . "if (!thisNotification) { return; }" . "notificationHolder.appendChild(thisNotification.firstChild);" . "thisNotification.remove();" . "})();" ); return; } // Add the notification directly to the session. // This will either be fetched in the header, or by JS in the footer. if (!isset($SESSION->notifications) || !array($SESSION->notifications)) { // Initialise $SESSION if necessary. if (!is_object($SESSION)) { $SESSION = new stdClass(); } $SESSION->notifications = []; } $SESSION->notifications[] = (object) array( 'message' => $message, 'type' => $level, ); } /** * Fetch all of the notifications in the stack and clear the stack. * * @return array All of the notifications in the stack */ public static function fetch() { global $SESSION; if (!isset($SESSION) || !isset($SESSION->notifications)) { return []; } $notifications = $SESSION->notifications; unset($SESSION->notifications); $renderables = []; foreach ($notifications as $notification) { $renderable = new \core\output\notification($notification->message, $notification->type); $renderables[] = $renderable; } return $renderables; } /** * Fetch all of the notifications in the stack and clear the stack. * * @return array All of the notifications in the stack */ public static function fetch_as_array(\renderer_base $renderer) { $notifications = []; foreach (self::fetch() as $notification) { $notifications[] = [ 'template' => $notification->get_template_name(), 'variables' => $notification->export_for_template($renderer), ]; } return $notifications; } /** * Add a success message to the notification stack. * * @param string $message The message to add to the stack */ public static function success($message) { return self::add($message, self::SUCCESS); } /** * Add a info message to the notification stack. * * @param string $message The message to add to the stack */ public static function info($message) { return self::add($message, self::INFO); } /** * Add a warning message to the notification stack. * * @param string $message The message to add to the stack */ public static function warning($message) { return self::add($message, self::WARNING); } /** * Add a error message to the notification stack. * * @param string $message The message to add to the stack */ public static function error($message) { return self::add($message, self::ERROR); } }