/** * Change the name/function of the group join button * * @param string $hook the name of the hook * @param string $type the type of the hook * @param \ElggMenuItem[] $return_value current return value * @param array $params supplied params * * @return void|\ElggMenuItem[] */ public static function groupMembership($hook, $type, $return_value, $params) { if (!elgg_in_context('groups')) { return; } $page_owner = elgg_get_page_owner_entity(); $user = elgg_get_logged_in_user_entity(); if (!$page_owner instanceof \ElggGroup || !$user instanceof \ElggUser) { return; } if (empty($return_value) || !is_array($return_value)) { return; } foreach ($return_value as $menu_item) { // group join button? if ($menu_item->getName() !== 'groups:joinrequest') { continue; } if (check_entity_relationship($user->getGUID(), 'membership_request', $page_owner->getGUID())) { // user already requested to join this group $menu_item->setText(elgg_echo('group_tools:joinrequest:already')); $menu_item->setTooltip(elgg_echo('group_tools:joinrequest:already:tooltip')); $menu_item->setHref("action/groups/killrequest?user_guid={$user->getGUID()}&group_guid={$page_owner->getGUID()}"); $menu_item->is_action = true; } elseif (check_entity_relationship($page_owner->getGUID(), 'invited', $user->getGUID())) { // the user was invited, so let him/her join $menu_item->setName('groups:join'); $menu_item->setText(elgg_echo('groups:join')); $menu_item->setTooltip(elgg_echo('group_tools:join:already:tooltip')); $menu_item->setHref("action/groups/join?user_guid={$user->getGUID()}&group_guid={$page_owner->getGUID()}"); $menu_item->is_action = true; } elseif (group_tools_check_domain_based_group($page_owner, $user)) { // user has a matching email domain $menu_item->setName('groups:join'); $menu_item->setText(elgg_echo('groups:join')); $menu_item->setTooltip(elgg_echo('group_tools:join:domain_based:tooltip')); $menu_item->setHref("action/groups/join?user_guid={$user->getGUID()}&group_guid={$page_owner->getGUID()}"); $menu_item->is_action = true; } elseif (group_tools_join_motivation_required($page_owner)) { // a join motivation is required elgg_load_js('lightbox'); elgg_load_css('lightbox'); $menu_item->setHref("ajax/view/group_tools/forms/motivation?guid={$page_owner->getGUID()}"); $menu_item->addLinkClass('elgg-lightbox'); $opts = 'data-colorbox-opts'; $menu_item->{$opts} = json_encode(['width' => '500px']); } break; } return $return_value; }
/** * Change the join status menu item * * @param string $hook the name of the hook * @param string $type the type of the hook * @param \ElggMenuItem[] $return_value current return value * @param array $params supplied params * * @return void|\ElggMenuItem[] */ public static function registerJoinStatus($hook, $type, $return_value, $params) { $entity = elgg_extract('entity', $params); if (!$entity instanceof \ElggGroup) { return; } $user = elgg_get_logged_in_user_entity(); if (empty($user)) { return; } foreach ($return_value as $menu_item) { if ($menu_item->getName() !== 'membership_status') { continue; } if ($menu_item->getText() !== elgg_echo('groups:join')) { // @todo this should be nicer, but Elgg give the same name to 3 use cases??!!! continue; } if (check_entity_relationship($user->getGUID(), 'membership_request', $entity->getGUID())) { // user already requested to join this group $menu_item->setText(elgg_echo('group_tools:joinrequest:already')); $menu_item->setTooltip(elgg_echo('group_tools:joinrequest:already:tooltip')); $menu_item->setHref("action/groups/killrequest?user_guid={$user->getGUID()}&group_guid={$entity->getGUID()}"); $menu_item->is_action = true; } elseif (check_entity_relationship($entity->getGUID(), 'invited', $user->getGUID())) { // the user was invited, so let him/her join $menu_item->setTooltip(elgg_echo('group_tools:join:already:tooltip')); } elseif (group_tools_check_domain_based_group($entity, $user)) { // user has a matching email domain $menu_item->setTooltip(elgg_echo('group_tools:join:domain_based:tooltip')); } elseif (group_tools_join_motivation_required($entity)) { // a join motivation is required elgg_load_js('lightbox'); elgg_load_css('lightbox'); $menu_item->setHref("ajax/view/group_tools/forms/motivation?guid={$entity->getGUID()}"); $menu_item->addLinkClass('elgg-lightbox'); $opts = 'data-colorbox-opts'; $menu_item->{$opts} = json_encode(['width' => '500px']); } } }
/** * A hook on the ->canEdit() of a group. This is done to allow e-mail domain users to join a group * * Note: this is a very hacky way arround a short comming of Elgg core * * @param string $hook the name of the hook * @param string $type the type of the hook * @param bool $return_value current return value * @param null $params supplied params * * @return void|true */ public static function groupJoinPermission($hook, $type, $return_value, $params) { if (!empty($return_value)) { // already allowed return; } if (!group_tools_domain_based_groups_enabled()) { return; } // domain based groups are enabled, lets check if this user is allowed to join based on that $group = elgg_extract('entity', $params); $user = elgg_extract('user', $params); if (!$group instanceof \ElggGroup || !$user instanceof \ElggUser) { return; } if (!group_tools_check_domain_based_group($group, $user)) { return; } return true; }
/** * A hook on the ->canEdit() of a group. This is done to allow e-mail domain users to join a group * * Note: this is a very hacky way arround a short comming of Elgg core * * @param string $hook 'permissions_check' * @param string $type 'group' * @param bool $return_value is the current user allowed to edit the group * @param mixed $params passed on params * * @return bool */ function group_tools_permissions_check_groups_join_hook($hook, $type, $return_value, $params) { $result = $return_value; if (!$result && group_tools_domain_based_groups_enabled()) { // domain based groups are enabled, lets check if this user is allowed to join based on that if (!empty($params) && is_array($params)) { $group = elgg_extract("entity", $params); $user = elgg_extract("user", $params); if (!empty($group) && elgg_instanceof($group, "group") && !empty($user) && elgg_instanceof($user, "user")) { if (group_tools_check_domain_based_group($group, $user)) { $result = true; } } } } return $result; }