From 491bb02f0c724c84d7b14d859cade0fb9b42a594 Mon Sep 17 00:00:00 2001 From: Jerome Bakker Date: Tue, 11 Mar 2014 15:10:41 +0100 Subject: [PATCH] added: option to relate groups (#44) --- CHANGES.txt | 1 + actions/related_groups.php | 54 +++++++++++++++++ actions/remove_related_groups.php | 36 ++++++++++++ languages/en.php | 27 +++++++++ lib/hooks.php | 54 ++++++++++++++++- pages/groups/invitations.php | 4 +- pages/groups/related.php | 58 +++++++++++++++++++ start.php | 8 +++ views/default/css/group_tools/site.php | 4 ++ .../forms/group_tools/related_groups.php | 10 ++++ .../group_tools/modules/related_groups.php | 41 +++++++++++++ .../default/widgets/group_related/content.php | 27 +++++++++ views/default/widgets/group_related/edit.php | 16 +++++ 13 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 actions/related_groups.php create mode 100644 actions/remove_related_groups.php create mode 100644 pages/groups/related.php create mode 100644 views/default/forms/group_tools/related_groups.php create mode 100644 views/default/group_tools/modules/related_groups.php create mode 100644 views/default/widgets/group_related/content.php create mode 100644 views/default/widgets/group_related/edit.php diff --git a/CHANGES.txt b/CHANGES.txt index d426ba07..31bfd307 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -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) diff --git a/actions/related_groups.php b/actions/related_groups.php new file mode 100644 index 00000000..1b00adf4 --- /dev/null +++ b/actions/related_groups.php @@ -0,0 +1,54 @@ +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); diff --git a/actions/remove_related_groups.php b/actions/remove_related_groups.php new file mode 100644 index 00000000..17ba7c52 --- /dev/null +++ b/actions/remove_related_groups.php @@ -0,0 +1,36 @@ +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); diff --git a/languages/en.php b/languages/en.php index db46b9f7..7543ad25 100644 --- a/languages/en.php +++ b/languages/en.php @@ -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); diff --git a/lib/hooks.php b/lib/hooks.php index a5e4956b..826ebc68 100644 --- a/lib/hooks.php +++ b/lib/hooks.php @@ -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])) { @@ -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); @@ -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; } } } @@ -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; +} diff --git a/pages/groups/invitations.php b/pages/groups/invitations.php index 63efecf5..10bc3e71 100644 --- a/pages/groups/invitations.php +++ b/pages/groups/invitations.php @@ -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); diff --git a/pages/groups/related.php b/pages/groups/related.php new file mode 100644 index 00000000..e51049f3 --- /dev/null +++ b/pages/groups/related.php @@ -0,0 +1,58 @@ +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 .= "
" . elgg_echo("groups_tools:related_groups:none") . "
"; +} + +// 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); diff --git a/start.php b/start.php index 8a49d44f..20520d59 100644 --- a/start.php +++ b/start.php @@ -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"); @@ -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"); @@ -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"); diff --git a/views/default/css/group_tools/site.php b/views/default/css/group_tools/site.php index 152aa6ab..67ac23b2 100644 --- a/views/default/css/group_tools/site.php +++ b/views/default/css/group_tools/site.php @@ -94,4 +94,8 @@ .elgg-icon-invisible-group { background: transparent 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%; } \ No newline at end of file diff --git a/views/default/forms/group_tools/related_groups.php b/views/default/forms/group_tools/related_groups.php new file mode 100644 index 00000000..b46a51e9 --- /dev/null +++ b/views/default/forms/group_tools/related_groups.php @@ -0,0 +1,10 @@ +"; +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 "
" . elgg_echo("group_tools:related_groups:form:description") . "
"; +echo ""; diff --git a/views/default/group_tools/modules/related_groups.php b/views/default/group_tools/modules/related_groups.php new file mode 100644 index 00000000..975de0be --- /dev/null +++ b/views/default/group_tools/modules/related_groups.php @@ -0,0 +1,41 @@ +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 = "
" . elgg_echo("groups_tools:related_groups:none") . "
"; +} + +echo elgg_view("groups/profile/module", array( + "title" => elgg_echo("groups_tools:related_groups:widget:title"), + "content" => $content, + "all_link" => $all_link, +)); diff --git a/views/default/widgets/group_related/content.php b/views/default/widgets/group_related/content.php new file mode 100644 index 00000000..7cfd7073 --- /dev/null +++ b/views/default/widgets/group_related/content.php @@ -0,0 +1,27 @@ +num_display; +if ($num_display < 1) { + $num_display = 4; +} + +$options = array( + "type" => "group", + "limit" => $num_display, + "relationship" => "related_group", + "relationship_guid" => $widget->getOwnerGUID(), + "full_view" => false, + "pagination" => false +); + +$content = elgg_list_entities_from_relationship($options); +if (empty($content)) { + $content = "
" . elgg_echo("groups_tools:related_groups:none") . "
"; +} + +echo $content; \ No newline at end of file diff --git a/views/default/widgets/group_related/edit.php b/views/default/widgets/group_related/edit.php new file mode 100644 index 00000000..60f8fbf3 --- /dev/null +++ b/views/default/widgets/group_related/edit.php @@ -0,0 +1,16 @@ +num_display; +if ($num_display < 1) { + $num_display = 4; +} + +echo "
"; +echo elgg_echo("widget:numbertodisplay"); +echo elgg_view("input/text", array("name" => "params[num_display]", "value" => $num_display, "size" => "4", "maxlength" => "3")); +echo "
";