123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- <?php
- /**
- * Elgg notifications plugin
- *
- * @package ElggNotifications
- */
- elgg_register_event_handler('init', 'system', 'notifications_plugin_init');
- function notifications_plugin_init() {
- elgg_extend_view('css/elgg','notifications/css');
- elgg_register_page_handler('notifications', 'notifications_page_handler');
- elgg_register_event_handler('pagesetup', 'system', 'notifications_plugin_pagesetup');
- // Unset the default notification settings
- elgg_unregister_plugin_hook_handler('usersettings:save', 'user', '_elgg_save_notification_user_settings');
- elgg_unextend_view('forms/account/settings', 'core/settings/account/notifications');
- // update notifications based on relationships changing
- elgg_register_event_handler('delete', 'member', 'notifications_relationship_remove');
- elgg_register_event_handler('delete', 'friend', 'notifications_relationship_remove');
- // update notifications when new friend or access collection membership
- elgg_register_event_handler('create', 'friend', 'notifications_update_friend_notify');
- elgg_register_plugin_hook_handler('access:collections:add_user', 'collection', 'notifications_update_collection_notify');
- $actions_base = elgg_get_plugins_path() . 'notifications/actions';
- elgg_register_action("notificationsettings/save", "$actions_base/save.php");
- elgg_register_action("notificationsettings/groupsave", "$actions_base/groupsave.php");
- }
- /**
- * Route page requests
- *
- * @param array $page Array of url parameters
- * @return bool
- */
- function notifications_page_handler($page) {
- elgg_gatekeeper();
- $current_user = elgg_get_logged_in_user_entity();
- // default to personal notifications
- if (!isset($page[0])) {
- $page[0] = 'personal';
- }
- if (!isset($page[1])) {
- forward("notifications/{$page[0]}/{$current_user->username}");
- }
- $user = get_user_by_username($page[1]);
- if (($user->guid != $current_user->guid) && !$current_user->isAdmin()) {
- forward();
- }
- $base = elgg_get_plugins_path() . 'notifications';
- // note: $user passed in
- switch ($page[0]) {
- case 'group':
- require "$base/groups.php";
- break;
- case 'personal':
- require "$base/index.php";
- break;
- default:
- return false;
- }
- return true;
- }
- /**
- * Notification settings sidebar menu
- *
- */
- function notifications_plugin_pagesetup() {
- if (elgg_in_context("settings") && elgg_get_logged_in_user_guid()) {
- $user = elgg_get_page_owner_entity();
- if (!$user) {
- $user = elgg_get_logged_in_user_entity();
- }
- $params = array(
- 'name' => '2_a_user_notify',
- 'text' => elgg_echo('notifications:subscriptions:changesettings'),
- 'href' => "notifications/personal/{$user->username}",
- 'section' => "notifications",
- );
- elgg_register_menu_item('page', $params);
-
- if (elgg_is_active_plugin('groups')) {
- $params = array(
- 'name' => '2_group_notify',
- 'text' => elgg_echo('notifications:subscriptions:changesettings:groups'),
- 'href' => "notifications/group/{$user->username}",
- 'section' => "notifications",
- );
- elgg_register_menu_item('page', $params);
- }
- }
- }
- /**
- * Update notifications when a relationship is deleted
- *
- * @param string $event
- * @param string $object_type
- * @param object $relationship
- */
- function notifications_relationship_remove($event, $object_type, $relationship) {
- $NOTIFICATION_HANDLERS = _elgg_services()->notifications->getMethodsAsDeprecatedGlobal();
- $user_guid = $relationship->guid_one;
- $object_guid = $relationship->guid_two;
- // loop through all notification types
- foreach($NOTIFICATION_HANDLERS as $method => $foo) {
- remove_entity_relationship($user_guid, "notify{$method}", $object_guid);
- }
- }
- /**
- * Turn on notifications for new friends if all friend notifications is on
- *
- * @param string $event
- * @param string $object_type
- * @param object $relationship
- */
- function notifications_update_friend_notify($event, $object_type, $relationship) {
- $NOTIFICATION_HANDLERS = _elgg_services()->notifications->getMethodsAsDeprecatedGlobal();
- $user_guid = $relationship->guid_one;
- $friend_guid = $relationship->guid_two;
- $user = get_entity($user_guid);
- // loop through all notification types
- foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
- $metaname = 'collections_notifications_preferences_' . $method;
- $collections_preferences = $user->$metaname;
- if ($collections_preferences) {
- if (!empty($collections_preferences) && !is_array($collections_preferences)) {
- $collections_preferences = array($collections_preferences);
- }
- if (is_array($collections_preferences)) {
- // -1 means all friends is on - should be a define
- if (in_array(-1, $collections_preferences)) {
- add_entity_relationship($user_guid, 'notify' . $method, $friend_guid);
- }
- }
- }
- }
- }
- /**
- * Update notifications for changes in access collection membership.
- *
- * This function assumes that only friends can belong to access collections.
- *
- * @param string $event
- * @param string $object_type
- * @param bool $returnvalue
- * @param array $params
- */
- function notifications_update_collection_notify($event, $object_type, $returnvalue, $params) {
- $NOTIFICATION_HANDLERS = _elgg_services()->notifications->getMethodsAsDeprecatedGlobal();
- // only update notifications for user owned collections
- $collection_id = $params['collection_id'];
- $collection = get_access_collection($collection_id);
- $user = get_entity($collection->owner_guid);
- if (!($user instanceof ElggUser)) {
- return $returnvalue;
- }
- $member_guid = $params['user_guid'];
- // loop through all notification types
- foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
- $metaname = 'collections_notifications_preferences_' . $method;
- $collections_preferences = $user->$metaname;
- if (!$collections_preferences) {
- continue;
- }
- if (!is_array($collections_preferences)) {
- $collections_preferences = array($collections_preferences);
- }
- if (in_array(-1, $collections_preferences)) {
- // if "all friends" notify is on, we don't change any notifications
- // since must be a friend to be in an access collection
- continue;
- }
- if (in_array($collection_id, $collections_preferences)) {
- // notifications are on for this collection so we add/remove
- if ($event == 'access:collections:add_user') {
- add_entity_relationship($user->guid, "notify$method", $member_guid);
- } elseif ($event == 'access:collections:remove_user') {
- // removing someone from an access collection is not a guarantee
- // that they should be removed from notifications
- //remove_entity_relationship($user->guid, "notify$method", $member_guid);
- }
- }
- }
- }
|