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
introduced
by
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 |