Actions

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 log. Important messages will show a modal popup at page load. Default messages will only show a notification at the bell in the admin menu.

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 your 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 popup first time, and then second time be marked as unread. If you want a message to continue to be marked as unread no matter the times you save it, 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.