diff options
Diffstat (limited to 'mod/notifications')
18 files changed, 1299 insertions, 0 deletions
diff --git a/mod/notifications/actions/groupsave.php b/mod/notifications/actions/groupsave.php new file mode 100644 index 000000000..e79dae5cc --- /dev/null +++ b/mod/notifications/actions/groupsave.php @@ -0,0 +1,49 @@ +<?php + +/** + * Elgg notifications group save + * + * @package ElggNotifications + */ + +$current_user = elgg_get_logged_in_user_entity(); + +$guid = (int) get_input('guid', 0); +if (!$guid || !($user = get_entity($guid))) { +	forward(); +} +if (($user->guid != $current_user->guid) && !$current_user->isAdmin()) { +	forward(); +} + +// Get group memberships and condense them down to an array of guids +$groups = array(); +$options = array( +	'relationship' => 'member', +	'relationship_guid' => $user->guid, +	'type' => 'group', +	'limit' => false, +); +if ($groupmemberships = elgg_get_entities_from_relationship($options)) { +	foreach($groupmemberships as $groupmembership) { +		$groups[] = $groupmembership->guid; +	} +} + +if (!empty($groups)) { +	global $NOTIFICATION_HANDLERS; +	foreach ($NOTIFICATION_HANDLERS as $method => $foo) { +		$subscriptions[$method] = get_input($method.'subscriptions', array()); +		foreach ($groups as $group) { +			if (in_array($group, $subscriptions[$method])) { +				add_entity_relationship($user->guid, 'notify'.$method, $group); +			} else { +				remove_entity_relationship($user->guid, 'notify'.$method, $group); +			} +		} +	} +} + +system_message(elgg_echo('notifications:subscriptions:success')); + +forward(REFERER); diff --git a/mod/notifications/actions/save.php b/mod/notifications/actions/save.php new file mode 100644 index 000000000..3fe0001a3 --- /dev/null +++ b/mod/notifications/actions/save.php @@ -0,0 +1,43 @@ +<?php + +/** + * Elgg notifications + * + * @package ElggNotifications + */ + +$current_user = elgg_get_logged_in_user_entity(); + +$guid = (int) get_input('guid', 0); +if (!$guid || !($user = get_entity($guid))) { +	forward(); +} +if (($user->guid != $current_user->guid) && !$current_user->isAdmin()) { +	forward(); +} + +global $NOTIFICATION_HANDLERS; +$subscriptions = array(); +foreach($NOTIFICATION_HANDLERS as $method => $foo) { +	$subscriptions[$method] = get_input($method.'subscriptions'); +	$personal[$method] = get_input($method.'personal'); +	$collections[$method] = get_input($method.'collections'); + +	$metaname = 'collections_notifications_preferences_' . $method; +	$user->$metaname = $collections[$method]; +	set_user_notification_setting($user->guid, $method, ($personal[$method] == '1') ? true : false); +	remove_entity_relationships($user->guid, 'notify' . $method, false, 'user'); +} + +// Add new ones +foreach($subscriptions as $key => $subscription) { +	if (is_array($subscription) && !empty($subscription)) { +		foreach($subscription as $subscriptionperson) { +			add_entity_relationship($user->guid, 'notify' . $key, $subscriptionperson); +		} +	} +} + +system_message(elgg_echo('notifications:subscriptions:success')); + +forward(REFERER); diff --git a/mod/notifications/graphics/icon_notifications_email.gif b/mod/notifications/graphics/icon_notifications_email.gif Binary files differnew file mode 100644 index 000000000..038d6e651 --- /dev/null +++ b/mod/notifications/graphics/icon_notifications_email.gif diff --git a/mod/notifications/graphics/icon_notifications_site.gif b/mod/notifications/graphics/icon_notifications_site.gif Binary files differnew file mode 100644 index 000000000..d12ca08b1 --- /dev/null +++ b/mod/notifications/graphics/icon_notifications_site.gif diff --git a/mod/notifications/groups.php b/mod/notifications/groups.php new file mode 100644 index 000000000..973f3493c --- /dev/null +++ b/mod/notifications/groups.php @@ -0,0 +1,46 @@ +<?php +/** + * Elgg notifications plugin group index + * + * @package ElggNotifications + * + * @uses $user ElggUser + */ + +if (!isset($user) || !($user instanceof ElggUser)) { +	$url = 'notifications/group/' . elgg_get_logged_in_user_entity()->username; +	forward($url); +} + +elgg_set_page_owner_guid($user->guid); + +// Set the context to settings +elgg_set_context('settings'); + +$title = elgg_echo('notifications:subscriptions:changesettings:groups'); + +elgg_push_breadcrumb(elgg_echo('settings'), "settings/user/$user->username"); +elgg_push_breadcrumb($title); + +// Get the form +$people = array(); + +$groupmemberships = elgg_get_entities_from_relationship(array( +	'relationship' => 'member', +	'relationship_guid' => $user->guid, +	'type' => 'group', +	'limit' => false, +)); + +$body = elgg_view_form('notificationsettings/groupsave', array(), array( +	'groups' => $groupmemberships, +	'user' => $user, +)); + +$params = array( +	'content' => $body, +	'title' => $title, +); +$body = elgg_view_layout('one_sidebar', $params); + +echo elgg_view_page($title, $body); diff --git a/mod/notifications/index.php b/mod/notifications/index.php new file mode 100644 index 000000000..a99622efd --- /dev/null +++ b/mod/notifications/index.php @@ -0,0 +1,50 @@ +<?php +/** + * Elgg notifications plugin index + * + * @package ElggNotifications + * + * @uses $user ElggUser + */ + +if (!isset($user) || !($user instanceof ElggUser)) { +	$url = 'notifications/personal/' . elgg_get_logged_in_user_entity()->username; +	forward($url); +} + +elgg_set_page_owner_guid($user->guid); + +// Set the context to settings +elgg_set_context('settings'); + +$title = elgg_echo('notifications:subscriptions:changesettings'); + +elgg_push_breadcrumb(elgg_echo('settings'), "settings/user/$user->username"); +elgg_push_breadcrumb($title); + +// Get the form +$people = array(); +if ($people_ents = elgg_get_entities_from_relationship(array( +		'relationship' => 'notify', +		'relationship_guid' => $user->guid, +		'type' => 'user', +		'limit' => false, +	))) { +	 +	foreach($people_ents as $ent) { +		$people[] = $ent->guid; +	} +} + +$body = elgg_view('notifications/subscriptions/form', array( +	'people' => $people, +	'user' => $user, +)); + +$params = array( +	'content' => $body, +	'title' => $title, +); +$body = elgg_view_layout('one_sidebar', $params); + +echo elgg_view_page($title, $body); diff --git a/mod/notifications/languages/en.php b/mod/notifications/languages/en.php new file mode 100644 index 000000000..0f2ba2304 --- /dev/null +++ b/mod/notifications/languages/en.php @@ -0,0 +1,26 @@ +<?php + +$english = array( + +	'friends:all' => 'All friends', + +	'notifications:subscriptions:personal:description' => 'Receive notifications when actions are performed on your content', +	'notifications:subscriptions:personal:title' => 'Personal notifications', + +	'notifications:subscriptions:friends:title' => 'Friends', +	'notifications:subscriptions:friends:description' => 'Below are collections of your friends. Selecting a collection turns on notifications for the users in that collection.', +	'notifications:subscriptions:collections:edit' => 'To edit your shared access notifications, click here.', + +	'notifications:subscriptions:changesettings' => 'Notifications', +	'notifications:subscriptions:changesettings:groups' => 'Group notifications', + +	'notifications:subscriptions:title' => 'Notifications per user', +	'notifications:subscriptions:description' => 'To receive notifications from your friends (on an individual basis) when they create new content, find them below and select the notification method you would like to use.', + +	'notifications:subscriptions:groups:description' => 'To receive notifications when new content is added to a group you are a member of, find it below and select the notification method(s) you would like to use.', + +	'notifications:subscriptions:success' => 'Your notifications settings have been saved.', + +); + +	add_translation("en", $english); diff --git a/mod/notifications/manifest.xml b/mod/notifications/manifest.xml new file mode 100644 index 000000000..205476881 --- /dev/null +++ b/mod/notifications/manifest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8"> +	<name>Notifications</name> +	<author>Core developers</author> +	<version>1.7</version> +	<category>bundled</category> +	<description>Elgg notifications plugin</description> +	<website>http://www.elgg.org/</website> +	<copyright>See COPYRIGHT.txt</copyright> +	<license>GNU General Public License version 2</license> +	<requires> +		<type>elgg_release</type> +		<version>1.8</version> +	</requires> +	<activate_on_install>true</activate_on_install> +</plugin_manifest> diff --git a/mod/notifications/start.php b/mod/notifications/start.php new file mode 100644 index 000000000..b76b0aa1e --- /dev/null +++ b/mod/notifications/start.php @@ -0,0 +1,206 @@ +<?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', 'notification_user_settings_save'); +	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) { + +	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_get_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}", +		); +		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}", +			); +			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) { +	global $NOTIFICATION_HANDLERS; + +	$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) { +	global $NOTIFICATION_HANDLERS; + +	$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) { +	global $NOTIFICATION_HANDLERS; + +	// 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); +			} +		} +	} +} diff --git a/mod/notifications/views/default/forms/notificationsettings/groupsave.php b/mod/notifications/views/default/forms/notificationsettings/groupsave.php new file mode 100644 index 000000000..f3e5f693a --- /dev/null +++ b/mod/notifications/views/default/forms/notificationsettings/groupsave.php @@ -0,0 +1,111 @@ +<?php +/** + * Elgg notifications groups subscription form + * + * @package ElggNotifications + * + * @uses $vars['user'] ElggUser + */ + +/* @var ElggUser $user */ +$user = $vars['user']; + +global $NOTIFICATION_HANDLERS; +foreach ($NOTIFICATION_HANDLERS as $method => $foo) { +	$subsbig[$method] = elgg_get_entities_from_relationship(array( +		'relationship' => 'notify' . $method, +		'relationship_guid' => $user->guid, +		'type' => 'group', +		'limit' => false, +	)); +	$tmparray = array(); +	if ($subsbig[$method]) { +		foreach($subsbig[$method] as $tmpent) { +			$tmparray[] = $tmpent->guid; +		} +	} +	$subsbig[$method] = $tmparray; +} + +?> + +<div class="elgg-module elgg-module-info"> +	<div class="elgg-body"> +	<?php +		echo elgg_view('notifications/subscriptions/jsfuncs',$vars); +	?> +		<div> +		<?php +			echo elgg_echo('notifications:subscriptions:groups:description'); +		?> +		</div> +<?php + +if (isset($vars['groups']) && !empty($vars['groups'])) { + +?> +		<table id="notificationstable" cellspacing="0" cellpadding="4" width="100%"> +			<tr> +				<td> </td> +<?php + +	$i = 0;  +	foreach($NOTIFICATION_HANDLERS as $method => $foo) { +		if ($i > 0) { +			echo "<td class='spacercolumn'> </td>"; +		} +?> +				<td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td> +<?php +		$i++; +	} +?> +				<td> </td> +			</tr> +<?php +	foreach($vars['groups'] as $group) { +		 +		$fields = ''; +		$i = 0; +		 +		foreach($NOTIFICATION_HANDLERS as $method => $foo) { +			if (in_array($group->guid,$subsbig[$method])) { +				$checked[$method] = 'checked="checked"'; +			} else { +				$checked[$method] = ''; +			} +			if ($i > 0) { +				$fields .= "<td class=\"spacercolumn\"> </td>"; +			} +			$fields .= <<< END +				<td class="{$method}togglefield"> +				<a border="0" id="{$method}{$group->guid}" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}{$group->guid}');"> +				<input type="checkbox" name="{$method}subscriptions[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}{$group->guid}');" value="{$group->guid}" {$checked[$method]} /></a></td> +END; +			$i++; +		} +	 +?> +			<tr> +				<td class="namefield"> +					<div> +					<?php echo $group->name; ?> +					</div> +				</td> +				<?php echo $fields; ?> +				<td> </td> +			</tr> +<?php +	} +?> +		</table> +<?php +} +	echo '<div class="elgg-foot mtm">'; +	echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $user->guid)); +	echo elgg_view('input/submit', array('value' => elgg_echo('save'))); +	echo '</div>'; +	 +?> +	</div> +</div> diff --git a/mod/notifications/views/default/forms/notificationsettings/save.php b/mod/notifications/views/default/forms/notificationsettings/save.php new file mode 100644 index 000000000..9470256ca --- /dev/null +++ b/mod/notifications/views/default/forms/notificationsettings/save.php @@ -0,0 +1,21 @@ +<?php +/** + * Personal notifications form body + * + * @uses $vars['user'] ElggUser + */ + +/* @var ElggUser $user */ +$user = $vars['user']; + +echo elgg_view('notifications/subscriptions/personal', $vars); +echo elgg_view('notifications/subscriptions/collections', $vars); +echo elgg_view('notifications/subscriptions/forminternals', $vars); + +?> +<div class="elgg-foot"> +<?php +echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $user->guid)); +echo elgg_view('input/submit', array('value' => elgg_echo('save'))); +?> +</div> diff --git a/mod/notifications/views/default/notifications/css.php b/mod/notifications/views/default/notifications/css.php new file mode 100644 index 000000000..385c55b0b --- /dev/null +++ b/mod/notifications/views/default/notifications/css.php @@ -0,0 +1,87 @@ +<?php +/** + * Elgg notifications CSS + *  + * @package notifications + */ +?> + +#notificationstable td.namefield { +	width:250px; +	text-align: left; +	vertical-align: middle; +} +#notificationstable td.namefield p { +	margin:0; +	vertical-align: middle; +	line-height: 1.1em; +	padding:5px 0 5px 0; +} +#notificationstable td.namefield p.namefieldlink { +	margin:5px 0 0 0; +} +#notificationstable td.namefield a img { +	float:left; +	width:25px; +	height:25px;  +	margin:5px 10px 5px 5px; +} +#notificationstable td.emailtogglefield, +#notificationstable td.smstogglefield { +	width:50px; +	text-align: center; +	vertical-align: middle; +} +#notificationstable td.spacercolumn { +	width:30px; +} +#notificationstable td { +	border-bottom: 1px solid silver; +} +#notificationstable td.emailtogglefield input { +	margin-right:36px; +	margin-top:5px; +} +#notificationstable td.emailtogglefield a { +	width:46px; +	height:24px; +	cursor: pointer; +	display: block; +	outline: none; +} +#notificationstable td.sitetogglefield { +	width:50px; +	text-align: center; +	vertical-align: middle; +} +#notificationstable td.sitetogglefield input { +	margin-right:36px; +	margin-top:5px; +} +#notificationstable td.sitetogglefield a { +	width:46px; +	height:24px; +	cursor: pointer; +	display: block; +	outline: none; +} +#notificationstable td.emailtogglefield a.emailtoggleOff { +	background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_email.gif) no-repeat right 2px; +} +#notificationstable td.emailtogglefield a.emailtoggleOn { +	background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_email.gif) no-repeat right -36px; +} +#notificationstable td.sitetogglefield a.sitetoggleOff { +	background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_site.gif) no-repeat right 2px; +} +#notificationstable td.sitetogglefield a.sitetoggleOn { +	background: url(<?php echo elgg_get_site_url(); ?>mod/notifications/graphics/icon_notifications_site.gif) no-repeat right -37px; +} +.notification_friends, +.notification_personal, +.notifications_per_user { +	margin-bottom: 25px; +} + + + diff --git a/mod/notifications/views/default/notifications/subscriptions/collections.php b/mod/notifications/views/default/notifications/subscriptions/collections.php new file mode 100644 index 000000000..207b2e3b9 --- /dev/null +++ b/mod/notifications/views/default/notifications/subscriptions/collections.php @@ -0,0 +1,164 @@ +<?php +/** + * @uses $vars['user'] ElggUser + */ + +/* @var ElggUser $user */ +$user = $vars['user']; + +//@todo JS 1.8: no ?> +<script type="text/javascript"> +	 +	function setCollection(members, method, id) { +		for ( var i in members ) { +			var checked = $('#' + method + 'collections' + id).children("INPUT[type='checkbox']").attr('checked'); +			if ($("#"+method+members[i]).children("INPUT[type='checkbox']").attr('checked') != checked) {   +				$("#"+method+members[i]).children("INPUT[type='checkbox']").attr('checked', checked); +				functioncall = 'adjust' + method + '_alt("'+method+members[i]+'");'; +				eval(functioncall); +			} +		}  +	} +	 +</script> +<div class="elgg-module elgg-module-info"> +	<div class="elgg-head"> +		<h3> +			<?php echo elgg_echo('notifications:subscriptions:friends:title'); ?> +		</h3> +	</div> +<p class="margin-none"> +	<?php echo elgg_echo('notifications:subscriptions:friends:description'); ?> +</p> +<table id="notificationstable" cellspacing="0" cellpadding="4" width="100%"> +	<tr> +		<td> </td> +<?php +	$i = 0;  +	global $NOTIFICATION_HANDLERS; +	foreach($NOTIFICATION_HANDLERS as $method => $foo) { +		if ($i > 0) { +			echo "<td class='spacercolumn'> </td>"; +		} +?> +	<td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td> +<?php +		$i++; +	} +?> +		<td> </td> +	</tr> +<?php +	$members = array(); +	if ($friends = get_user_friends($user->guid, '', 9999, 0)) { +		foreach($friends as $friend) { +			$members[] = $friend->guid; +		} +	} +	$memberno = sizeof($members); +	$members = implode(',',$members); + +?> +	<tr> +		<td class="namefield"> +			<p> +				<?php echo elgg_echo('friends:all'); ?> (<?php echo $memberno; ?>) +			</p> +		</td> +<?php + +	$fields = ''; +	$i = 0; +	foreach($NOTIFICATION_HANDLERS as $method => $foo) { +		$metaname = 'collections_notifications_preferences_' . $method; +		if ($collections_preferences = $user->$metaname) { +			if (!empty($collections_preferences) && !is_array($collections_preferences)) { +				$collections_preferences = array($collections_preferences); +			} +			if (is_array($collections_preferences)) { +				if (in_array(-1,$collections_preferences)) { +					$collectionschecked[$method] = 'checked="checked"'; +				} else { +					$collectionschecked[$method] = ''; +				} +			} +		} +		if ($i > 0) { +			$fields .= "<td class='spacercolumn'> </td>"; +		} +		$fields .= <<< END +			<td class="{$method}togglefield"> +			<a border="0" id="{$method}collections-1" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}collections-1'); setCollection([{$members}],'{$method}',-1);"> +			<input type="checkbox" name="{$method}collections[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}collections-1');" value="-1" {$collectionschecked[$method]} /></a></td> +END; +		$i++; +	} +	echo $fields; + +?> +		<td> </td> +	</tr> +<?php + +	if ($collections = get_user_access_collections($user->guid)) { +		foreach ($collections as $collection) { +			$members = get_members_of_access_collection($collection->id, true); +			$memberno = 0; +			if ($members) { +				$memberno = sizeof($members); +				$members = implode(',', $members); +			} else { +				$members = ''; +			} + + +?> +	<tr> +		<td class="namefield"> +			<p> +				<?php echo $collection->name; ?> (<?php echo $memberno; ?>) +			</p> +		</td> + +<?php + +			$fields = ''; +			$i = 0; +			foreach($NOTIFICATION_HANDLERS as $method => $foo) { +				$metaname = 'collections_notifications_preferences_' . $method; +				if ($collections_preferences = $user->$metaname) { +					if (!empty($collections_preferences) && !is_array($collections_preferences)) { +						$collections_preferences = array($collections_preferences); +					} +					if (is_array($collections_preferences)) { +						if (in_array($collection->id,$collections_preferences)) { +							$collectionschecked[$method] = 'checked="checked"'; +						} else { +							$collectionschecked[$method] = ''; +						} +					} +				} +				if ($i > 0) { +					$fields .= "<td class='spacercolumn'> </td>"; +				} +				$fields .= <<< END +					<td class="{$method}togglefield"> +					<a border="0" id="{$method}collections{$collection->id}" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}collections{$collection->id}'); setCollection([{$members}],'{$method}',{$collection->id});"> +					<input type="checkbox" name="{$method}collections[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}collections{$collection->id}');" value="{$collection->id}" {$collectionschecked[$method]} /></a></td> +END; +				$i++; +			} +			echo $fields; + +?> + +		<td> </td> +	</tr> +<?php + +		} +	} + +?> +</table> +</div> diff --git a/mod/notifications/views/default/notifications/subscriptions/form.php b/mod/notifications/views/default/notifications/subscriptions/form.php new file mode 100644 index 000000000..559354eff --- /dev/null +++ b/mod/notifications/views/default/notifications/subscriptions/form.php @@ -0,0 +1,12 @@ +<?php +/** + * Elgg personal notifications + * + * @uses $vars['user'] ElggUser that owns the notification settings + */ + +// @todo is this a view for extensions? +echo elgg_view('subscriptions/form/additions', $vars); + +$form_vars = array('class' => 'elgg-form-alt'); +echo elgg_view_form('notificationsettings/save', $form_vars, $vars); diff --git a/mod/notifications/views/default/notifications/subscriptions/forminternals.php b/mod/notifications/views/default/notifications/subscriptions/forminternals.php new file mode 100644 index 000000000..79a7959ac --- /dev/null +++ b/mod/notifications/views/default/notifications/subscriptions/forminternals.php @@ -0,0 +1,337 @@ +<?php +/** + * Hacked up friends picker that needs to be replaced + * + * @uses $vars['user'] ElggUser + */ + +/* @var ElggUser $user */ +$user = $vars['user']; + +elgg_load_js('elgg.friendspicker'); +elgg_load_js('jquery.easing'); + +?> +<div class="elgg-module elgg-module-info"> +	<div class="elgg-head"> +		<h3> +			<?php echo elgg_echo('notifications:subscriptions:title'); ?> +		</h3> +	</div> +	<p> +		<?php echo elgg_echo('notifications:subscriptions:description'); ?> +	</p> +<?php + +// Get friends and subscriptions +$friends = get_user_friends($user->guid, '', 9999, 0); +		 +global $NOTIFICATION_HANDLERS; +foreach($NOTIFICATION_HANDLERS as $method => $foo) { +	$subsbig[$method] = elgg_get_entities_from_relationship(array( +		'relationship' => 'notify' . $method, +		'relationship_guid' => $user->guid, +		'type' => 'user', +		'limit' => false, +	)); +} +		 +$subs = array(); +foreach($subsbig as $method => $big) { +	if (is_array($subsbig[$method]) && sizeof($subsbig[$method])) { +		foreach($subsbig[$method] as $u) {  +			$subs[$method][] = $u->guid; +		} +	} +} + +// Let the system know that the friends picker is in use +global $pickerinuse; +$pickerinuse = true; +$chararray = elgg_echo('friendspicker:chararray'); + +// Initialise name +if (!isset($vars['name'])) { +	$name = "friend"; +} else { +	$name = $vars['name']; +} +		 +// Initialise values +if (!isset($vars['value'])) { +	$vars['value'] = array(); +} else { +	if (!is_array($vars['value'])) { +		$vars['value'] = (int) $vars['value']; +		$vars['value'] = array($vars['value']); +	} +} + +// Initialise whether we're calling back or not +if (isset($vars['callback'])) { +	$callback = $vars['callback']; +} else { +	$callback = false; +} +		 +// We need to count the number of friends pickers on the page. +if (!isset($vars['friendspicker'])) { +	global $friendspicker; +	if (!isset($friendspicker)) { +		$friendspicker = 0; +	} +	$friendspicker++; +} else { +	$friendspicker = $vars['friendspicker']; +} + +$users = array(); +$activeletters = array(); +		 +// Are we displaying form tags and submit buttons? +// (If we've been given a target, then yes! Otherwise, no.) +if (isset($vars['formtarget'])) { +	$formtarget = $vars['formtarget']; +} else { +	$formtarget = false; +} +		 +// Sort users by letter +if (is_array($friends) && sizeof($friends)) { +	foreach($friends as $friend) { +				 +		$letter = elgg_substr($friend->name,0,1); +		$letter = elgg_strtoupper($letter); +		if (!elgg_substr_count($chararray,$letter)) { +			$letter = "*"; +		} +		if (!isset($users[$letter])) { +			$users[$letter] = array(); +		} +		$users[$letter][$friend->guid] = $friend; +	} +} + +if (!$callback) { +			 +?> + +<div class="friends-picker-main-wrapper"> + +<?php + +	if (isset($vars['content'])) { +		echo $vars['content']; +	} +	 +?> + +	<div id="friends-picker_placeholder<?php echo $friendspicker; ?>"> + +<?php +	 +} +	 +if (!isset($vars['replacement'])) { +	 +	if ($formtarget) { +?> +<?php //@todo JS 1.8: no ?> +	<script language="text/javascript"> +		$(function() { // onload...do +		$('#collectionMembersForm<?php echo $friendspicker; ?>').submit(function() { +			var inputs = []; +			$(':input', this).each(function() { +				if (this.type != 'checkbox' || (this.type == 'checkbox' && this.checked != false)) { +					inputs.push(this.name + '=' + escape(this.value)); +				} +			}); +			jQuery.ajax({ +				type: "POST", +				data: inputs.join('&'), +				url: this.action, +				success: function(){ +					$('a.collectionmembers<?php echo $friendspicker; ?>').click(); +				} + +			}); +			return false; +		}) +	}) + +	</script> + +<?php + +	} + +	echo elgg_view('notifications/subscriptions/jsfuncs',$vars); +		 +?> + +	<div class="friends-picker-wrapper"> +	<div id="friends-picker<?php echo $friendspicker; ?>"> +		<div class="friends-picker-container"> +<?php + +	// Initialise letters +	$letter = elgg_substr($chararray,0,1); +	$letpos = 0; +	$chararray .= '*'; +	while (1 == 1) { +?> +			<div class="panel" title="<?php echo $letter; ?>"> +				<div class="wrapper"> +					<h3><?php echo $letter; ?></h3>					 +					 +<?php + +		if (isset($users[$letter])) { +			ksort($users[$letter]); +?> + +<table id="notificationstable" cellspacing="0" cellpadding="4" border="0" width="100%"> +<tr> +	<td> </td> +<?php +			$i = 0; +			foreach($NOTIFICATION_HANDLERS as $method => $foo) { +				if ($i > 0) { +					echo "<td class='spacercolumn'> </td>"; +				} +?> +	<td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td> +<?php +				$i++; +			} +?> +	<td> </td> +</tr> + +<?php + +			if (is_array($users[$letter]) && sizeof($users[$letter]) > 0) { +				foreach($users[$letter] as $friend) { +					if ($friend instanceof ElggUser ) { +				 +						if (!in_array($letter,$activeletters)) { +							$activeletters[] = $letter; +						} +				 +						$method = array(); +						$fields = ''; +						$i = 0; +				 +						foreach($NOTIFICATION_HANDLERS as $method => $foo) { +							if (isset($subs[$method]) && in_array($friend->guid,$subs[$method])) { +								$checked[$method] = 'checked="checked"'; +							} else { +								$checked[$method] = ''; +							} +							if ($i > 0) { +								$fields .= "<td class='spacercolumn'> </td>"; +							} +							$fields .= <<< END +<td class="{$method}togglefield"> +<a border="0" id="{$method}{$friend->guid}" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}{$friend->guid}');"> +<input type="checkbox" name="{$method}subscriptions[]" id="{$method}checkbox" onclick="adjust{$method}('{$method}{$friend->guid}');" value="{$friend->guid}" {$checked[$method]} /></a></td> +END; +							$i++; +						} +?> + +<tr> +	<td class="namefield"> +		<a href="<?php echo $friend->getURL(); ?>"> +<?php +			echo elgg_view_entity_icon($friend, 'tiny', array('use_hover' => false)); +?> +		</a> +		<p class="namefieldlink"> +			<a href="<?php echo $friend->getURL(); ?>"><?php echo $friend->name ?></a> +		</p> +	</td> +	 +<?php echo $fields; ?> + +<td> </td> +</tr> + + +<?php +					} +				} +			} + +?> +</table> + +<?php +		} + +?> +			 +				</div> +			</div> +<?php			 +		$letpos++; +		if ($letpos == elgg_strlen($chararray)) { +			break; +		} +		$letter = elgg_substr($chararray,$letpos,1); +	} +		 +?> +		</div>		 +	</div> +	</div> +	 +<?php +} else { +	echo $vars['replacement'];  +} +if (!$callback) { + +?> +			 +	</div> +</div> + + +<?php + +} + +?> +<?php +if (!isset($vars['replacement'])) { +?> +<?php //@todo JS 1.8: no ?> +<script type="text/javascript"> +		// initialise picker +		$("div#friends-picker<?php echo $friendspicker; ?>").friendsPicker(<?php echo $friendspicker; ?>); +</script> +<script type="text/javascript"> +	$(function () { +	// manually add class to corresponding tab for panels that have content +<?php +	if (sizeof($activeletters) > 0) { +		$chararray .= "*"; +		foreach($activeletters as $letter) { +			$tab = elgg_strpos($chararray, $letter) + 1; +?> +	$("div#friends-picker-navigation<?php echo $friendspicker; ?> li.tab<?php echo $tab; ?> a").addClass("tabHasContent"); +<?php +		} +	} + +?> +	}); +</script> + +<?php + +} + +?> +</div> diff --git a/mod/notifications/views/default/notifications/subscriptions/groupsform.php b/mod/notifications/views/default/notifications/subscriptions/groupsform.php new file mode 100644 index 000000000..f1dbdcff8 --- /dev/null +++ b/mod/notifications/views/default/notifications/subscriptions/groupsform.php @@ -0,0 +1,4 @@ +<?php  + +elgg_deprecated_notice("notifications/subscriptions/groupsform was moved to forms/notificationsettings/groupsave", 1.8); +echo elgg_view('forms/notificationsettings/groupsave');
\ No newline at end of file diff --git a/mod/notifications/views/default/notifications/subscriptions/jsfuncs.php b/mod/notifications/views/default/notifications/subscriptions/jsfuncs.php new file mode 100644 index 000000000..ace622581 --- /dev/null +++ b/mod/notifications/views/default/notifications/subscriptions/jsfuncs.php @@ -0,0 +1,54 @@ +<?php + +global $NOTIFICATION_HANDLERS; + +?>  +<?php //@todo JS 1.8: no ?> +<script type="text/javascript"> + +$(document).ready(function () { +<?php  +foreach($NOTIFICATION_HANDLERS as $method => $foo) { +?> +	$('input[type=checkbox]:checked').parent("a.<?php echo $method; ?>toggleOff").each(function(){ +		$(this).removeClass('<?php echo $method; ?>toggleOff').addClass('<?php echo $method; ?>toggleOn'); +	}); +	 +<?php +} +?> + +}); + +	clickflag = 0; + +<?php  +foreach($NOTIFICATION_HANDLERS as $method => $foo) { +?> +function adjust<?php echo $method; ?>(linkId) { +	var obj = $(this).prev("a"); +	 +	if (obj.className == "<?php echo $method; ?>toggleOff") { +		obj.className = "<?php echo $method; ?>toggleOn"; +	} else { +		obj.className = "<?php echo $method; ?>toggleOff"; +	} +	return false; +} +function adjust<?php echo $method; ?>_alt(linkId) { +	var obj = document.getElementById(linkId); +	 +	if (obj.className == "<?php echo $method; ?>toggleOff") { +		obj.className = "<?php echo $method; ?>toggleOn"; +		$('#' + linkId).children("input[type='checkbox']").attr('checked', true); +	} else { +		obj.className = "<?php echo $method; ?>toggleOff"; +		$('#' + linkId).children("input[type='checkbox']").attr('checked', false); +	} +	return false; +} +<?php +} +?> + +</script>
\ No newline at end of file diff --git a/mod/notifications/views/default/notifications/subscriptions/personal.php b/mod/notifications/views/default/notifications/subscriptions/personal.php new file mode 100644 index 000000000..cf05426e2 --- /dev/null +++ b/mod/notifications/views/default/notifications/subscriptions/personal.php @@ -0,0 +1,73 @@ +<?php +/** + * @uses $vars['user'] ElggUser + */ + +/* @var ElggUser $user */ +$user = $vars['user']; + +global $NOTIFICATION_HANDLERS; + +?> +<div class="notification_personal"> +<div class="elgg-module elgg-module-info"> +	<div class="elgg-head"> +		<h3> +			<?php echo elgg_echo('notifications:subscriptions:personal:title'); ?> +		</h3> +	</div> +</div> +<table id="notificationstable" cellspacing="0" cellpadding="4" width="100%"> +	<tr> +		<td> </td> +<?php +$i = 0;  +foreach($NOTIFICATION_HANDLERS as $method => $foo) { +	if ($i > 0) { +		echo "<td class='spacercolumn'> </td>"; +	} +?> +		<td class="<?php echo $method; ?>togglefield"><?php echo elgg_echo('notification:method:'.$method); ?></td> +<?php +	$i++; +} +?> +		<td> </td> +	</tr> +	<tr> +		<td class="namefield"> +			<p> +				<?php echo elgg_echo('notifications:subscriptions:personal:description') ?> +			</p> +		</td> + +<?php + +$fields = ''; +$i = 0; +foreach($NOTIFICATION_HANDLERS as $method => $foo) { +	if ($notification_settings = get_user_notification_settings($user->guid)) { +		if ($notification_settings->$method) { +			$personalchecked[$method] = 'checked="checked"'; +		} else { +			$personalchecked[$method] = ''; +		} +	} +	if ($i > 0) { +		$fields .= "<td class='spacercolumn'> </td>"; +	} +	$fields .= <<< END +		<td class="{$method}togglefield"> +		<a  border="0" id="{$method}personal" class="{$method}toggleOff" onclick="adjust{$method}_alt('{$method}personal');"> +		<input type="checkbox" name="{$method}personal" id="{$method}checkbox" onclick="adjust{$method}('{$method}personal');" value="1" {$personalchecked[$method]} /></a></td> +END; +	$i++; +} +echo $fields; + +?> + +		<td> </td> +	</tr> +</table> +</div>
\ No newline at end of file  | 
