Completed
Push — 3.0 ( 9dd29c...237018 )
by Jeroen
53:05
created

mod/friends/start.php (2 issues)

1
<?php
2
3
/**
4
 * Friends init
5
 *
6
 * @return void
7
 */
8
function elgg_friends_plugin_init() {
9 34
	elgg_register_plugin_hook_handler('filter_tabs', 'all', '_elgg_friends_filter_tabs', 1);
10
11 34
	elgg_register_event_handler('create', 'relationship', '_elgg_send_friend_notification');
12
13 34
	elgg_register_plugin_hook_handler('entity:url', 'object', '_elgg_friends_widget_urls');
14
	
15 34
	elgg_register_plugin_hook_handler('register', 'menu:page', '_elgg_friends_page_menu');
16 34
	elgg_register_plugin_hook_handler('register', 'menu:topbar', '_elgg_friends_topbar_menu');
17 34
	elgg_register_plugin_hook_handler('register', 'menu:user_hover', '_elgg_friends_setup_user_hover_menu');
18 34
	elgg_register_plugin_hook_handler('register', 'menu:title', '_elgg_friends_setup_title_menu');
19 34
}
20
21
/**
22
 * Adds friending to profile title menu
23
 *
24
 * @param \Elgg\Hook $hook 'register', 'menu:title'
25
 *
26
 * @return void|ElggMenuItem[]
27
 *
28
 * @access private
29
 */
30
function _elgg_friends_setup_title_menu(\Elgg\Hook $hook) {
31
	
32
	$user = $hook->getEntityParam();
33
	if (!$user instanceof ElggUser || !elgg_is_logged_in()) {
34
		return;
35
	}
36
37
	if (elgg_get_logged_in_user_guid() === $user->guid) {
38
		return;
39
	}
40
	
41
	$isFriend = $user->isFriend();
42
43
	$return = $hook->getValue();
44
	
45
	// Always emit both to make it super easy to toggle with ajax
46
	$return[] = \ElggMenuItem::factory([
47
		'name' => 'remove_friend',
48
		'href' => elgg_generate_action_url('friends/remove', [
49
			'friend' => $user->guid,
50
		]),
51
		'text' => elgg_echo('friend:remove'),
52
		'icon' => 'user-times',
53
		'section' => 'action',
54
		'link_class' => 'elgg-button-action elgg-button',
55
		'item_class' => $isFriend ? '' : 'hidden',
56
		'data-toggle' => 'add_friend',
57
	]);
58
59
	$return[] = \ElggMenuItem::factory([
60
		'name' => 'add_friend',
61
		'href' => elgg_generate_action_url('friends/add', [
62
			'friend' => $user->guid,
63
		]),
64
		'text' => elgg_echo('friend:add'),
65
		'icon' => 'user-plus',
66
		'section' => 'action',
67
		'link_class' => 'elgg-button-action elgg-button',
68
		'item_class' => $isFriend ? 'hidden' : '',
69
		'data-toggle' => 'remove_friend',
70
	]);
71
72
	return $return;
73
}
74
75
/**
76
 * Adds friending to user hover menu
77
 *
78
 * @param string         $hook   'register'
79
 * @param string         $type   'menu:user_hover'
80
 * @param ElggMenuItem[] $return current return value
81
 * @param array          $params supplied params
82
 *
83
 * @return void|ElggMenuItem[]
84
 *
85
 * @access private
86
 */
87
function _elgg_friends_setup_user_hover_menu($hook, $type, $return, $params) {
88
	
89
	$user = elgg_extract('entity', $params);
90
	if (!$user instanceof ElggUser || !elgg_is_logged_in()) {
91
		return;
92
	}
93
94
	if (elgg_get_logged_in_user_guid() === $user->guid) {
95
		return;
96
	}
97
	
98
	$isFriend = $user->isFriend();
99
100
	// Always emit both to make it super easy to toggle with ajax
101
	$return[] = \ElggMenuItem::factory([
102
		'name' => 'remove_friend',
103
		'href' => elgg_generate_action_url('friends/remove', [
104
			'friend' => $user->guid,
105
		]),
106
		'text' => elgg_echo('friend:remove'),
107
		'icon' => 'user-times',
108
		'section' => 'action',
109
		'item_class' => $isFriend ? '' : 'hidden',
110
		'data-toggle' => 'add_friend',
111
	]);
112
113
	$return[] = \ElggMenuItem::factory([
114
		'name' => 'add_friend',
115
		'href' => elgg_generate_action_url('friends/add', [
116
			'friend' => $user->guid,
117
		]),
118
		'text' => elgg_echo('friend:add'),
119
		'icon' => 'user-plus',
120
		'section' => 'action',
121
		'item_class' => $isFriend ? 'hidden' : '',
122
		'data-toggle' => 'remove_friend',
123
	]);
124
125
	return $return;
126
}
127
128
/**
129
 * Register menu items for the topbar menu
130
 *
131
 * @param string         $hook   'register'
132
 * @param string         $type   'menu:topbar'
133
 * @param ElggMenuItem[] $return current return value
134
 * @param array          $params supplied params
135
 *
136
 * @return void|ElggMenuItem[]
137
 *
138
 * @access private
139
 * @since 3.0
140
 */
141
function _elgg_friends_topbar_menu($hook, $type, $return, $params) {
142
143
	$viewer = elgg_get_logged_in_user_entity();
144
	if (!$viewer) {
145
		return;
146
	}
147
		
148
	$return[] = \ElggMenuItem::factory([
149
		'name' => 'friends',
150
		'href' => elgg_generate_url('collection:friends:owner', [
151
			'username' => $viewer->username,
152
		]),
153
		'text' => elgg_echo('friends'),
154
		'icon' => 'users',
155
		'title' => elgg_echo('friends'),
156
		'priority' => 300,
157
		'section' => 'alt',
158
		'parent_name' => 'account',
159
	]);
160
	
161
	return $return;
162
}
163
164
/**
165
 * Register menu items for the friends page menu
166
 *
167
 * @param string         $hook   'register'
168
 * @param string         $type   'menu:page'
169
 * @param ElggMenuItem[] $return current return value
170
 * @param array          $params supplied params
171
 *
172
 * @return void|ElggMenuItem[]
173
 *
174
 * @access private
175
 * @since 3.0
176
 */
177
function _elgg_friends_page_menu($hook, $type, $return, $params) {
178
179
	$owner = elgg_get_page_owner_entity();
180
	if (!$owner instanceof ElggUser) {
181
		return;
182
	}
183
184
	$return[] = \ElggMenuItem::factory([
185
		'name' => 'friends',
186
		'text' => elgg_echo('friends'),
187
		'href' => elgg_generate_url('collection:friends:owner', [
188
			'username' => $owner->username,
189
		]),
190
		'contexts' => ['friends'],
191
	]);
192
193
	$return[] = \ElggMenuItem::factory([
194
		'name' => 'friends:of',
195
		'text' => elgg_echo('friends:of'),
196
		'href' => elgg_generate_url('collection:friends_of:owner', [
197
			'username' => $owner->username,
198
		]),
199
		'contexts' => ['friends'],
200
	]);
201
202
	return $return;
203
}
204
205
/**
206
 * Notify user that someone has friended them
207
 *
208
 * @param string            $event  'create'
209
 * @param string            $type   'relationship'
210
 * @param \ElggRelationship $object Object
211
 *
212
 * @return bool
213
 * @access private
214
 */
215
function _elgg_send_friend_notification($event, $type, $object) {
216 27
	if ($object->relationship != 'friend') {
217 27
		return true;
218
	}
219
220
	$user_one = get_entity($object->guid_one);
221
	/* @var \ElggUser $user_one */
222
223
	$user_two = get_entity($object->guid_two);
224
	/* @var ElggUser $user_two */
225
226
	if (!$user_one instanceof ElggUser || !$user_two instanceof ElggUser) {
0 ignored issues
show
$user_two is always a sub-type of ElggUser.
Loading history...
$user_one is always a sub-type of ElggUser.
Loading history...
227
		return;
228
	}
229
230
	// Notification subject
231
	$subject = elgg_echo('friend:newfriend:subject', [
232
		$user_one->getDisplayName(),
233
	], $user_two->language);
234
235
	// Notification body
236
	$body = elgg_echo("friend:newfriend:body", [
237
		$user_one->getDisplayName(),
238
		$user_one->getURL()
239
	], $user_two->language);
240
241
	// Notification params
242
	$params = [
243
		'action' => 'add_friend',
244
		'object' => $user_one,
245
		'friend' => $user_two,
246
		'url' => $user_two->getURL(),
247
	];
248
249
	return notify_user($user_two->guid, $object->guid_one, $subject, $body, $params);
250
}
251
252
/**
253
 * Add "Friends" tab to common filter
254
 *
255
 * @param string $hook   "filter_tabs"
256
 * @param string $type   Context
257
 * @param array  $items  Menu items to render as tabs
258
 * @param array  $params Hook params
259
 *
260
 * @return array
261
 */
262
function _elgg_friends_filter_tabs($hook, $type, $items, $params) {
263
264
	$user = elgg_extract('user', $params);
265
	if (!$user instanceof ElggUser) {
266
		return;
267
	}
268
269
	$vars = elgg_extract('vars', $params);
270
	$selected = elgg_extract('selected', $params);
271
272
	$items[] = ElggMenuItem::factory([
273
		'name' => 'friend',
274
		'text' => elgg_echo('friends'),
275
		'href' => (isset($vars['friend_link'])) ? $vars['friend_link'] : "$type/friends/{$user->username}",
276
		'selected' => ($selected == 'friends'),
277
		'priority' => 400,
278
	]);
279
	return $items;
280
}
281
282
283
/**
284
 * Returns widget URLS used in widget titles
285
 *
286
 * @param string $hook   Hook name
287
 * @param string $type   Hook type
288
 * @param string $result URL
289
 * @param array  $params Parameters
290
 * @return string|null
291
 * @access private
292
 */
293
function _elgg_friends_widget_urls($hook, $type, $result, $params) {
294 3
	$widget = elgg_extract('entity', $params);
295 3
	if (!($widget instanceof \ElggWidget)) {
296 3
		return;
297
	}
298
	
299
	if ($widget->handler !== 'friends') {
300
		return;
301
	}
302
	
303
	$owner = $widget->getOwnerEntity();
304
	if (!($owner instanceof \ElggUser)) {
305
		return;
306
	}
307
			
308
	return elgg_generate_url('collection:friends:owner', [
309
		'username' => $owner->username,
310
	]);
311
}
312
313
return function() {
314 40
	elgg_register_event_handler('init', 'system', 'elgg_friends_plugin_init');
315
};
316