Notifications
From LimeSurvey Manual
This functionality can be used to create an icon that appears on the top menu bar for user notifications. These can be for a specific user or survey.
You can also create a notification message that will be displayed until a certain action is taken (like survey must be activated).
GUI
- Bell icon
- List of all messages in menu where you can can see which messages are new
- Delete all messages
Usage
All notifications are created on the server side with PHP. A page reload is always necessary to see new notifications.
A notification can either be important or the default type. Important messages will show a modal popup at page load. Default messages will only show a notification at the bell in the admin menu. There's also the nag once importance, that will show the notification on page load, but immediately mark it as read.
See examples below for more information.
Database
New database table required to make notifications persist between login/logout.
Fields:
- id
- entity, like survey, user, ...
- entity_id, survey id, user id, ...
- title, title of message (shown in dropdown and overview)
- message, the actual message
- display_class, success, danger, default
- importance, 1 = normal, 3 = high/popup on page load
- status, new, read
- hash, a hashed value of title, message and entity/entity id; indexed; useful for unique notifications
- created, datetime
- first_read, datetime
Examples
Create a new notification for a survey
This notification will be visible for all users who visit the survey.
Note that it will only be marked as unread for the first user that reads it.
$not = new Notification(array(
'survey_id' => 316222,
'title' => 'My title',
'message' => 'Hello, and welcome to LimeSurvey! Anyone who can see this survey can see this message.'
));
$not->save();
Send an important notification
Visible on page load as popup.
$not = new Notification(array(
'survey_id' => 316222,
'title' => 'My title',
'importance' => Notification::HIGH_IMPORTANCE,
'message' => 'This notification will be a pop-up modal automatically opened at load'
));
$not->save();
Notification to a specific user
Only this user can see this notification.
$user = ...
$not = new Notification(array(
'user_id' => $user->uid,
'title' => 'My title',
'message' => 'This is a love letter only Marge can see.'
));
$not->save();
Broadcast
All users will get this notification.
Notification::broadcast(array(
'title' => 'To all users',
'message' => 'I\'m in love with Marge. I don\'t care if everyone knows.'
));
Broadcast to superadmin
This is how you broadcast a message to all superadmins. Also using localization.
$superadmins = User::model()->getSuperAdmins();
Notification::broadcast(array(
'title' => gT('Database update'),
'message' => gT('The database has been updated to version 259. New version includes notification system.')
), $superadmins);
Display class
You can change the modal class of the modal popup using display_class.
$not = new Notification(array(
'survey_id' => 316222,
'title' => 'Error',
'message' => 'This modal will have a red panel header, because it\'s an error.',
'display_class' => 'warning'
));
$not->save();
Unique notification
If you only want to create one copy of a message, but want to mark it as unread depending on program logic, use the UniqueNotifcation class:
$not = new UniqueNotification(array(
'user_id' => 1,
'title' => 'Unique title',
'message' => 'Even if you save this multiple times, there will only be one copy'
));
$not->save(); // If this exact message already exists, save() will mark it as unread (status = new)
Unique notification with less nagging
The above unique message will pop up the first time, and then a second time be marked as unread. If you want a message to continue to be marked as unread, use UniqueNotification with 'markAsNew' => false
:
(new UniqueNotification(array(
'user_id' => 1,
'markAsNew' => false,
'title' => 'Unique title',
'message' => 'Even if you save this multiple times, there will only be one copy.'
)))->save();
Open issues
- Merge with Yii flash system?
- More plugin friendly? E.g. having a message history page, adding soft delete.