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

mod/friends/start.php (1 issue)

Severity
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 void
213
 * @access private
214
 */
215
function _elgg_send_friend_notification($event, $type, $object) {
216
	
217 27
	if (!$object instanceof ElggRelationship) {
1 ignored issue
show
$object is always a sub-type of ElggRelationship.
Loading history...
218
		return;
219
	}
220
	
221 27
	if ($object->relationship !== 'friend') {
222 27
		return;
223
	}
224
225
	$user_one = get_entity($object->guid_one);
226
	$user_two = get_entity($object->guid_two);
227
	if (!$user_one instanceof ElggUser || !$user_two instanceof ElggUser) {
228
		return;
229
	}
230
231
	// Notification subject
232
	$subject = elgg_echo('friend:newfriend:subject', [
233
		$user_one->getDisplayName(),
234
	], $user_two->language);
235
236
	// Notification body
237
	$body = elgg_echo("friend:newfriend:body", [
238
		$user_one->getDisplayName(),
239
		$user_one->getURL()
240
	], $user_two->language);
241
242
	// Notification params
243
	$params = [
244
		'action' => 'add_friend',
245
		'object' => $user_one,
246
		'friend' => $user_two,
247
		'url' => $user_two->getURL(),
248
	];
249
250
	notify_user($user_two->guid, $object->guid_one, $subject, $body, $params);
251
}
252
253
/**
254
 * Add "Friends" tab to common filter
255
 *
256
 * @param string $hook   "filter_tabs"
257
 * @param string $type   Context
258
 * @param array  $items  Menu items to render as tabs
259
 * @param array  $params Hook params
260
 *
261
 * @return array
262
 */
263
function _elgg_friends_filter_tabs($hook, $type, $items, $params) {
264
265
	$user = elgg_extract('user', $params);
266
	if (!$user instanceof ElggUser) {
267
		return;
268
	}
269
270
	$vars = elgg_extract('vars', $params);
271
	$selected = elgg_extract('selected', $params);
272
273
	$items[] = ElggMenuItem::factory([
274
		'name' => 'friend',
275
		'text' => elgg_echo('friends'),
276
		'href' => (isset($vars['friend_link'])) ? $vars['friend_link'] : "$type/friends/{$user->username}",
277
		'selected' => ($selected == 'friends'),
278
		'priority' => 400,
279
	]);
280
	return $items;
281
}
282
283
284
/**
285
 * Returns widget URLS used in widget titles
286
 *
287
 * @param string $hook   Hook name
288
 * @param string $type   Hook type
289
 * @param string $result URL
290
 * @param array  $params Parameters
291
 *
292
 * @return void|string
293
 * @access private
294
 */
295
function _elgg_friends_widget_urls($hook, $type, $result, $params) {
296 3
	$widget = elgg_extract('entity', $params);
297 3
	if (!$widget instanceof \ElggWidget) {
298 3
		return;
299
	}
300
	
301
	if ($widget->handler !== 'friends') {
302
		return;
303
	}
304
	
305
	$owner = $widget->getOwnerEntity();
306
	if (!$owner instanceof \ElggUser) {
307
		return;
308
	}
309
	
310
	$url = elgg_generate_url('collection:friends:owner', [
311
		'username' => $owner->username,
312
	]);
313
	if (empty($url)) {
314
		return;
315
	}
316
	return $url;
317
}
318
319
return function() {
320 40
	elgg_register_event_handler('init', 'system', 'elgg_friends_plugin_init');
321
};
322