Skip to content

Commit

Permalink
added: option to relate groups (#44)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeabakker committed Mar 11, 2014
1 parent 1ec3b58 commit 491bb02
Show file tree
Hide file tree
Showing 13 changed files with 338 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ x.x:
- added: option to configure a group welcome message (#41)
- added: listing of the email invitations for groups (#42)
- added: option to join groups based on email domain (#43)
- added: option to relate groups (#44)
- fixed: layout issue in plugin settings
- fixed: you can no join groups you were invited for on the group profile page
- fixed: misleading translation for a group cleanup setting (#22)
Expand Down
54 changes: 54 additions & 0 deletions actions/related_groups.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php
/**
* Action to save a new related group
*/

$group_guid = (int) get_input("group_guid");
$guid = (int) get_input("guid");

if (!empty($group_guid) && !empty($guid)) {
$group = get_entity($group_guid);
$related = get_entity($guid);

// do we have groups
if (!empty($group) && elgg_instanceof($group, "group") && !empty($related) && elgg_instanceof($related, "group")) {
if ($group->canEdit()) {
if ($group->getGUID() != $related->getGUID()) {
// not already related?
if (!check_entity_relationship($group->getGUID(), "related_group", $related->getGUID())) {

if (add_entity_relationship($group->getGUID(), "related_group", $related->getGUID())) {
// notify the other owner about this
if ($group->getOwnerGUID() != $related->getOwnerGUID()) {
$subject = elgg_echo("group_tools:related_groups:notify:owner:subject");
$message = elgg_echo("group_tools:related_groups:notify:owner:message", array(
$related->getOwnerEntity()->name,
elgg_get_logged_in_user_entity()->name,
$related->name,
$group->name
));

notify_user($related->getOwnerGUID(), $group->getObjectOwnerGUID(), $subject, $message);
}

system_message(elgg_echo("group_tools:action:related_groups:success"));
} else {
register_error(elgg_echo("group_tools:action:related_groups:error:add"));
}
} else {
register_error(elgg_echo("group_tools:action:related_groups:error:already"));
}
} else {
register_error(elgg_echo("group_tools:action:related_groups:error:same"));
}
} else {
register_error(elgg_echo("groups:cantedit"));
}
} else {
register_error(elgg_echo("groups:notfound:details"));
}
} else {
register_error(elgg_echo("InvalidParameterException:MissingParameter"));
}

forward(REFERER);
36 changes: 36 additions & 0 deletions actions/remove_related_groups.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php
/**
* Action to save a new related group
*/

$group_guid = (int) get_input("group_guid");
$guid = (int) get_input("guid");

if (!empty($group_guid) && !empty($guid)) {
$group = get_entity($group_guid);
$related = get_entity($guid);

// do we have groups
if (!empty($group) && elgg_instanceof($group, "group") && !empty($related) && elgg_instanceof($related, "group")) {
if ($group->canEdit()) {
// related?
if (check_entity_relationship($group->getGUID(), "related_group", $related->getGUID())) {
if (remove_entity_relationship($group->getGUID(), "related_group", $related->getGUID())) {
system_message(elgg_echo("group_tools:action:remove_related_groups:success"));
} else {
register_error(elgg_echo("group_tools:action:remove_related_groups:error:remove"));
}
} else {
register_error(elgg_echo("group_tools:action:remove_related_groups:error:not_related"));
}
} else {
register_error(elgg_echo("groups:cantedit"));
}
} else {
register_error(elgg_echo("groups:notfound:details"));
}
} else {
register_error(elgg_echo("InvalidParameterException:MissingParameter"));
}

forward(REFERER);
27 changes: 27 additions & 0 deletions languages/en.php
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,33 @@

'group_tools:action:domain_based:success' => "The new e-mail domains were saved",

// related groups
'groups_tools:related_groups:tool_option' => "Show related groups",

'groups_tools:related_groups:widget:title' => "Related groups",
'groups_tools:related_groups:widget:description' => "Display a list of groups you added as related to this group.",

'groups_tools:related_groups:none' => "No related groups found.",
'group_tools:related_groups:title' => "Related groups",

'group_tools:related_groups:form:placeholder' => "Search for a new related group",
'group_tools:related_groups:form:description' => "You can search for a new related group, select it from the list and click Add.",

'group_tools:action:related_groups:error:same' => "You can't related this group to itself",
'group_tools:action:related_groups:error:already' => "The selected group is already related",
'group_tools:action:related_groups:error:add' => "An unknown error occured while adding the relationship, please try again",
'group_tools:action:related_groups:success' => "The group is now related",

'group_tools:related_groups:notify:owner:subject' => "A new related group was added",
'group_tools:related_groups:notify:owner:message' => "Hi %s,
%s added your group %s as a related group to %s.",

'group_tools:related_groups:entity:remove' => "Remove related group",

'group_tools:action:remove_related_groups:error:not_related' => "The group is not related",
'group_tools:action:remove_related_groups:error:remove' => "An unknown error occured while removing the relationship, please try again",
'group_tools:action:remove_related_groups:success' => "The group is no longer related",
);

add_translation("en", $english);
54 changes: 53 additions & 1 deletion lib/hooks.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,15 @@ function group_tools_route_groups_handler($hook, $type, $return_value, $params)

include(dirname(dirname(__FILE__)) . "/pages/groups/invitations.php");
break;
case "related":
$result = false;

if (isset($page[1])) {
set_input("group_guid", $page[1]);
}

include(dirname(dirname(__FILE__)) . "/pages/groups/related.php");
break;
default:
// check if we have an old group profile link
if (isset($page[0]) && is_numeric($page[0])) {
Expand Down Expand Up @@ -321,8 +330,17 @@ function group_tools_menu_entity_handler($hook, $type, $return_value, $params) {
if (!empty($params) && is_array($params)) {

$entity = elgg_extract("entity", $params);
$page_owner = elgg_get_page_owner_entity();

if (elgg_in_context("widgets_groups_show_members") && elgg_instanceof($entity, "group")) {
if (elgg_in_context("group_tools_related_groups") && !empty($page_owner) && elgg_instanceof($page_owner, "group") && $page_owner->canEdit() && elgg_instanceof($entity, "group")) {
// remove relatede group
$result[] = ElggMenuItem::factory(array(
"name" => "related_group",
"text" => elgg_echo("group_tools:related_groups:entity:remove"),
"href" => "action/group_tools/remove_related_groups?group_guid=" . $page_owner->getGUID() . "&guid=" . $entity->getGUID(),
"confirm" => elgg_echo("question:areyousure")
));
} elseif (elgg_in_context("widgets_groups_show_members") && elgg_instanceof($entity, "group")) {
// number of members
$num_members = $entity->getMembers(10, 0, true);

Expand Down Expand Up @@ -432,6 +450,9 @@ function group_tools_widget_url_handler($hook, $type, $return_value, $params) {
$result = "discussion/add/" . $owner->getGUID();
}
break;
case "group_related":
$result = "groups/related/" . $widget->getOwnerGUID();
break;
}
}
}
Expand Down Expand Up @@ -591,3 +612,34 @@ function group_tools_permissions_check_groups_join_hook($hook, $type, $return_va

return $result;
}

/**
* A hook to extend the owner block of groups
*
* @param string $hook 'register'
* @param string $type 'menu:owner_block'
* @param ElggMenuItem[] $return_value the current menu items
* @param mixed $params passed on params
*
* @return ElggMenuItem[]
*/
function group_tools_register_owner_block_menu_handler($hook, $type, $return_value, $params) {
$result = $return_value;

if (!empty($params) && is_array($params)) {
$entity = elgg_extract("entity", $params);

if (!empty($entity) && elgg_instanceof($entity, "group")) {
if ($entity->related_groups_enable == "yes") {
$result[] = ElggMenuItem::factory(array(
"name" => "related_groups",
"text" => elgg_echo("group_tools:related_groups:title"),
"href" => "groups/related/" . $entity->getGUID(),
"is_trusted" => true
));
}
}
}

return $result;
}
4 changes: 3 additions & 1 deletion pages/groups/invitations.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
"type" => "group",
"relationship" => "membership_request",
"relationship_guid" => $user->getGUID(),
"limit" => false
"limit" => false,
"full_view" => false,
"pagination" => false
);
$requests = elgg_get_entities_from_relationship($request_options);

Expand Down
58 changes: 58 additions & 0 deletions pages/groups/related.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php
/**
* A page to show (and add) related groups
*/

$group_guid = (int) get_input("group_guid");
$group = get_entity($group_guid);
if (empty($group) || !elgg_instanceof($group, "group")) {
register_error(elgg_echo("groups:notfound:details"));
forward(REFERER);
}

// set page owner
elgg_set_page_owner_guid($group->getGUID());

// build breadcrumb
elgg_push_breadcrumb(elgg_echo("groups"), "groups/all");
elgg_push_breadcrumb($group->name, $group->getURL());

$title_text = elgg_echo("group_tools:related_groups:title");
elgg_push_breadcrumb($title_text);


// page elements
$content = "";
if ($group->canEdit()) {
$content .= elgg_view_form("group_tools/related_groups", array("class" => "mbm"), array("entity" => $group));
}

$options = array(
"type" => "group",
"relationship" => "related_group",
"relationship_guid" => $group->getGUID(),
"full_view" => false,
);

// helper context for entity menu
elgg_push_context("group_tools_related_groups");

$listing = elgg_list_entities_from_relationship($options);

elgg_pop_context();

if (!empty($listing)) {
$content .= $listing;
} else {
$content .= "<div>" . elgg_echo("groups_tools:related_groups:none") . "</div>";
}

// build page
$page_data = elgg_view_layout("content", array(
"title" => $title_text,
"content" => $content,
"filter" => ""
));

// draw page
echo elgg_view_page($title_text, $page_data);
8 changes: 8 additions & 0 deletions start.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,11 @@ function group_tools_init() {
run_function_once("group_tools_version_1_3");
}

// related groups
add_group_tool_option("related_groups", elgg_echo("groups_tools:related_groups:tool_option"), false);
elgg_extend_view("groups/tool_latest", "group_tools/modules/related_groups");
elgg_register_widget_type("group_related", elgg_echo("groups_tools:related_groups:widget:title"), elgg_echo("groups_tools:related_groups:widget:description"), "groups");

// register index widget to show latest discussions
elgg_register_widget_type("discussion", elgg_echo("discussion:latest"), elgg_echo("widgets:discussion:description"), "index,dashboard", true);
elgg_register_widget_type("group_forum_topics", elgg_echo("discussion:group"), elgg_echo("widgets:group_forum_topics:description"), "groups");
Expand All @@ -125,6 +130,7 @@ function group_tools_init() {
elgg_register_plugin_hook_handler("access:default", "user", "group_tools_access_default_handler");
elgg_register_plugin_hook_handler("access:collections:write", "user", "group_tools_access_write_handler");
elgg_register_plugin_hook_handler("action", "groups/join", "group_tools_join_group_action_handler");
elgg_register_plugin_hook_handler("register", "menu:owner_block", "group_tools_register_owner_block_menu_handler");

// actions
elgg_register_action("group_tools/admin_transfer", dirname(__FILE__) . "/actions/admin_transfer.php");
Expand All @@ -136,6 +142,8 @@ function group_tools_init() {
elgg_register_action("group_tools/invite_members", dirname(__FILE__) . "/actions/invite_members.php");
elgg_register_action("group_tools/welcome_message", dirname(__FILE__) . "/actions/welcome_message.php");
elgg_register_action("group_tools/domain_based", dirname(__FILE__) . "/actions/domain_based.php");
elgg_register_action("group_tools/related_groups", dirname(__FILE__) . "/actions/related_groups.php");
elgg_register_action("group_tools/remove_related_groups", dirname(__FILE__) . "/actions/remove_related_groups.php");

elgg_register_action("group_tools/toggle_special_state", dirname(__FILE__) . "/actions/admin/toggle_special_state.php", "admin");
elgg_register_action("group_tools/fix_auto_join", dirname(__FILE__) . "/actions/admin/fix_auto_join.php", "admin");
Expand Down
4 changes: 4 additions & 0 deletions views/default/css/group_tools/site.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,8 @@
.elgg-icon-invisible-group {
background: transparent url(<?php echo elgg_get_site_url(); ?>mod/group_tools/_graphics/invisible_group2.png) no-repeat left;
vertical-align: top;
}

#group-tools-related-groups-form input.elgg-input-autocomplete {
width: 80%;
}
10 changes: 10 additions & 0 deletions views/default/forms/group_tools/related_groups.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

$group = elgg_extract("entity", $vars);

echo "<div id='group-tools-related-groups-form'>";
echo elgg_view("input/autocomplete", array("name" => "guid", "match_on" => "groups", "placeholder" => elgg_echo("group_tools:related_groups:form:placeholder")));
echo elgg_view("input/hidden", array("name" => "group_guid", "value" => $group->getGUID()));
echo elgg_view("input/submit", array("value" => elgg_echo("add")));
echo "<div class='elgg-subtext'>" . elgg_echo("group_tools:related_groups:form:description") . "</div>";
echo "</div>";
41 changes: 41 additions & 0 deletions views/default/group_tools/modules/related_groups.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
/**
* Group module to show related groups
*/

$group = elgg_extract("entity", $vars);
if (empty($group) || !elgg_instanceof($group, "group")) {
return true;
}

if ($group->related_groups_enable != "yes") {
return true;
}

$all_link = elgg_view("output/url", array(
"href" => "groups/related/" . $group->getGUID(),
"text" => elgg_echo("link:view:all"),
"is_trusted" => true,
));

$options = array(
"type" => "group",
"limit" => 4,
"relationship" => "related_group",
"relationship_guid" => $group->getGUID(),
"full_view" => false
);

elgg_push_context("widgets");
$content = elgg_list_entities_from_relationship($options);
elgg_pop_context();

if (empty($content)) {
$content = "<div>" . elgg_echo("groups_tools:related_groups:none") . "</div>";
}

echo elgg_view("groups/profile/module", array(
"title" => elgg_echo("groups_tools:related_groups:widget:title"),
"content" => $content,
"all_link" => $all_link,
));
Loading

0 comments on commit 491bb02

Please sign in to comment.