1<?php 2/** 3 * Join a group 4 * 5 * Three states: 6 * open group so user joins 7 * closed group so request sent to group owner 8 * closed group with invite so user joins 9 */ 10 11$user_guid = (int) get_input('user_guid', elgg_get_logged_in_user_guid()); 12$group_guid = (int) get_input('group_guid'); 13 14$user = get_user($user_guid); 15 16// access bypass for getting invisible group 17$group = elgg_call(ELGG_IGNORE_ACCESS, function() use ($group_guid) { 18 return get_entity($group_guid); 19}); 20 21if (!$user || !$group instanceof \ElggGroup) { 22 return elgg_error_response(elgg_echo('groups:cantjoin')); 23} 24 25if (!$user->canEdit() && !$group->canEdit()) { 26 return elgg_error_response(elgg_echo('actionunauthorized')); 27} 28 29// join or request 30$join = false; 31if ($group->isPublicMembership() || $group->canEdit($user->guid)) { 32 // anyone can join public groups and admins can join any group 33 $join = true; 34} else { 35 if (check_entity_relationship($group->guid, 'invited', $user->guid)) { 36 // user has invite to closed group 37 $join = true; 38 } 39} 40 41if ($join) { 42 if (!$group->join($user, ['create_river_item' => true])) { 43 return elgg_error_response(elgg_echo('groups:cantjoin')); 44 } 45 46 return elgg_ok_response('', elgg_echo('groups:joined'), $group->getURL()); 47} 48 49if (check_entity_relationship($user->guid, 'membership_request', $group->guid)) { 50 return elgg_error_response(elgg_echo('groups:joinrequest:exists')); 51} 52 53 54if (!add_entity_relationship($user->guid, 'membership_request', $group->guid)) { 55 return elgg_error_response(elgg_echo('groups:joinrequestnotmade')); 56} 57 58$owner = $group->getOwnerEntity(); 59 60$url = elgg_normalize_url("groups/requests/{$group->guid}"); 61 62$subject = elgg_echo('groups:request:subject', [ 63 $user->getDisplayName(), 64 $group->getDisplayName(), 65], $owner->language); 66 67$body = elgg_echo('groups:request:body', [ 68 $group->getOwnerEntity()->getDisplayName(), 69 $user->getDisplayName(), 70 $group->getDisplayName(), 71 $user->getURL(), 72 $url, 73], $owner->language); 74 75$params = [ 76 'action' => 'membership_request', 77 'object' => $group, 78 'url' => $url, 79]; 80 81// Notify group owner 82notify_user($owner->guid, $user->getGUID(), $subject, $body, $params); 83 84return elgg_ok_response('', elgg_echo('groups:joinrequestmade')); 85