From 5f6dc365a8445a48156b45912827eac39fd64fc5 Mon Sep 17 00:00:00 2001 From: Silvio Rhatto Date: Sun, 16 Mar 2014 21:01:42 -0300 Subject: Squashed 'mod/subgroups/' content from commit 835015b git-subtree-dir: mod/subgroups git-subtree-split: 835015b66b9de6dc6de91ab39f95e1f09b2dbf84 --- actions/subgroups/add.php | 33 ++ actions/subgroups/remove.php | 13 + activate.php | 16 + deactivate.php | 18 + languages/ca.php | 22 + languages/en.php | 30 ++ languages/es.php | 22 + languages/gl.php | 27 ++ languages/pt.php | 7 + lib/groups.php | 564 +++++++++++++++++++++++ lib/subgroups.php | 84 ++++ manifest.xml | 24 + pages/subgroups/edit.php | 46 ++ pages/subgroups/owner.php | 38 ++ start.php | 211 +++++++++ views/default/forms/groups/edit.php | 142 ++++++ views/default/forms/subgroups/add.php | 37 ++ views/default/group/default.php | 39 ++ views/default/group/elements/summary.php | 67 +++ views/default/groups/css/elements/components.php | 6 + views/default/groups/group_sort_menu.php | 46 ++ views/default/groups/profile/fields.php | 41 ++ views/default/groups/sidebar/subgroups.php | 44 ++ views/default/icon/default.php | 58 +++ views/default/input/autocomplete.php | 57 +++ views/default/navigation/breadcrumbs.php | 83 ++++ views/default/subgroups/group_module.php | 51 ++ views/default/subgroups/groups_i_can_edit.php | 71 +++ views/default/subgroups/subgroups_icons.php | 11 + 29 files changed, 1908 insertions(+) create mode 100644 actions/subgroups/add.php create mode 100644 actions/subgroups/remove.php create mode 100644 activate.php create mode 100644 deactivate.php create mode 100644 languages/ca.php create mode 100755 languages/en.php create mode 100644 languages/es.php create mode 100644 languages/gl.php create mode 100644 languages/pt.php create mode 100644 lib/groups.php create mode 100644 lib/subgroups.php create mode 100644 manifest.xml create mode 100644 pages/subgroups/edit.php create mode 100644 pages/subgroups/owner.php create mode 100644 start.php create mode 100644 views/default/forms/groups/edit.php create mode 100644 views/default/forms/subgroups/add.php create mode 100644 views/default/group/default.php create mode 100644 views/default/group/elements/summary.php create mode 100644 views/default/groups/css/elements/components.php create mode 100644 views/default/groups/group_sort_menu.php create mode 100644 views/default/groups/profile/fields.php create mode 100644 views/default/groups/sidebar/subgroups.php create mode 100644 views/default/icon/default.php create mode 100644 views/default/input/autocomplete.php create mode 100644 views/default/navigation/breadcrumbs.php create mode 100644 views/default/subgroups/group_module.php create mode 100644 views/default/subgroups/groups_i_can_edit.php create mode 100644 views/default/subgroups/subgroups_icons.php diff --git a/actions/subgroups/add.php b/actions/subgroups/add.php new file mode 100644 index 000000000..92416ea05 --- /dev/null +++ b/actions/subgroups/add.php @@ -0,0 +1,33 @@ +guid; +} + +if ($group instanceof ElggGroup && $group->canEdit() && $othergroup instanceof ElggGroup) { + if ($othergroup->canEdit() && $group_guid != $othergroup_guid) { + // Check if other group isn't currently a supergroup + $tree_group = $group; + while ($tree_group->container_guid > 0 && $tree_group->guid != $othergroup_guid) { + $tree_group = get_entity($tree_group->container_guid); + } + // Only save if there isn't circles in the tree. + if ($tree_group->guid != $othergroup_guid) { + $othergroup->container_guid = $group_guid; + $othergroup->save(); + forward(REFERER); + } + } +} + +register_error(elgg_echo('subgroups:add:error')); +forward(REFERER); + diff --git a/actions/subgroups/remove.php b/actions/subgroups/remove.php new file mode 100644 index 000000000..206673de3 --- /dev/null +++ b/actions/subgroups/remove.php @@ -0,0 +1,13 @@ +canEdit()) { + if ($othergroup instanceof ElggGroup && $othergroup->canEdit() && $othergroup->container_guid == $group_guid) { + $othergroup->container_guid = $other_group->owner_guid; + $othergroup->save(); + } +} +forward(REFERER); diff --git a/activate.php b/activate.php new file mode 100644 index 000000000..1e173fdd5 --- /dev/null +++ b/activate.php @@ -0,0 +1,16 @@ + 'group', + 'limit' => 0, +)); + +foreach($groups as $group) { + if (!elgg_instanceof($group->getContainerEntity(), 'group')) { + $group->container_guid = 0; + $group->save(); + } +} diff --git a/deactivate.php b/deactivate.php new file mode 100644 index 000000000..9b0cd1189 --- /dev/null +++ b/deactivate.php @@ -0,0 +1,18 @@ + 'group', + 'limit' => 0, +)); + +foreach($groups as $group) { + global $CONFIG; + if (!elgg_instanceof($group->getContainerEntity(), 'group')) { + $query = "UPDATE {$CONFIG->dbprefix}entities set" + . " container_guid=0 where guid={$group->owner_guid}"; + update_data($query); + } +} diff --git a/languages/ca.php b/languages/ca.php new file mode 100644 index 000000000..948b2ee95 --- /dev/null +++ b/languages/ca.php @@ -0,0 +1,22 @@ + 'Nou subgrup', + 'subgroups:new:of' => 'Nou subgrup de «%s»', + 'subgroups:add:error' => 'Hi ha hagut un error. Has escrit bé el nom del grup?', + 'subgroups' => 'Subgrups', + 'subgroups:more' => 'Veure tots els subgrups', + 'subgroups:owner' => 'Subgrups de %s', + 'subgroups:owner:single' => 'Subgrup de %s', + 'subgroups:none' => 'Aquest grup no té subgrups.', + 'subgroups:group' => 'Subgrups del grup', + 'subgroups:in_frontpage' => 'Mostra els subgrups a la pàgina del grup', + 'subgroups:add' => 'Edita subgrups', + 'subgroups:add:label' => 'Escriu el nom del grup', + 'subgroups:addurl:label' => 'Copia l\'URL del grup aquí', + 'subgroups:add:button' => 'Afegeix com a subgrup', + 'subgroups:dontwork' => 'No funciona?', + 'subgroups:unlink' => 'Desvincula els grups', + 'add' => 'Afegeix', + 'subgroups:nopermissons' => 'No tens permissos per modificar el grup', +); +add_translation("ca", $language); \ No newline at end of file diff --git a/languages/en.php b/languages/en.php new file mode 100755 index 000000000..e08e22e34 --- /dev/null +++ b/languages/en.php @@ -0,0 +1,30 @@ + 'Subgroups', + "subgroups:more" => 'View all subgroups', + "subgroups:owner" => 'Subgroups of %s', + "subgroups:owner:single" => 'Subgroup of %s', + "subgroups:none" => 'This group has no subgroups.', + "subgroups:group" => 'Group subgroups', + "subgroups:in_frontpage" => 'Show subgroups on group page', + "subgroups:add" => 'Manage subgroups', + "subgroups:new" => 'New subgroup', + "subgroups:add_existing" => 'Add existing one', + "subgroups:new:of" => 'New subgroup of «%s»', + "subgroups:add:label" => "Write the group's name", + "subgroups:addurl:label" => "Copy the group URL here", + "subgroups:add:button" => 'Add as subgroup', + "subgroups:dontwork" => "Doesn't it work?", + "subgroups:unlink" => 'Unlink groups', + "add" => "Add", + "subgroups:nopermissons" => 'You have no permissons to modify that subgroups', + "subgroups:add:error" => 'There are an error. Did you write correctly the group\'s name?', +); + +add_translation("en", $english); diff --git a/languages/es.php b/languages/es.php new file mode 100644 index 000000000..b86a97423 --- /dev/null +++ b/languages/es.php @@ -0,0 +1,22 @@ + 'Subgrupos', + 'subgroups:more' => 'Ver todos los subgrupos', + 'subgroups:owner' => 'Subgrupos de %s', + 'subgroups:owner:single' => 'Subgrupo de %s', + 'subgroups:none' => 'Este grupo no tiene subgrupos.', + 'subgroups:group' => 'Subgrupos del grupo', + 'subgroups:in_frontpage' => 'Muestra los subgrupos en la página del grupo', + 'subgroups:add' => 'Subgrupos', + 'subgroups:add:label' => 'Escribe el nombre del grupo', + 'subgroups:addurl:label' => 'Copia la URL del grupo aquí', + 'subgroups:add:button' => 'Añade como subgrupo', + 'subgroups:dontwork' => 'No funciona?', + 'subgroups:unlink' => 'Desvincula grupos', + 'add' => 'Añade', + 'subgroups:nopermissons' => 'No tienes permisos para modificar el grupo', + 'subgroups:add:error' => 'Ha habido un error. Has escrito bien el nombre del grupo?', +); + +add_translation("es", $es); + diff --git a/languages/gl.php b/languages/gl.php new file mode 100644 index 000000000..3a91d9fc4 --- /dev/null +++ b/languages/gl.php @@ -0,0 +1,27 @@ + 'Subgrupos', + "subgroups:more" => 'Ver tódolos subgrupos', + "subgroups:owner" => 'Subgrupos de %s', + "subgroups:owner:single" => 'Subgrupo de %s', + "subgroups:none" => 'Iste grupo non ten subgrupos.', + "subgroups:group" => 'Subgrupos do grupo', + "subgroups:in_frontpage" => 'Mostra os subgrupos na páxina do grupo', + "subgroups:add" => 'Edita os subgrupos', + "subgroups:add:label" => "Escribe o nome do grupo", + "subgroups:addurl:label" => "Copia a URL do grupo eiquí", + "subgroups:add:button" => 'Añade como subgrupo', + "subgroups:dontwork" => "Non funciona?", + "subgroups:unlink" => 'Desvincula grupos', + "add" => "Engade", + "subgroups:nopermissons" => 'Non tes permisos para modificar o grupo', + "subgroups:add:error" => 'Houbo un erro. Escribiches ben o nome do grupo?', +); + +add_translation("gl", $galician); diff --git a/languages/pt.php b/languages/pt.php new file mode 100644 index 000000000..f116ed9de --- /dev/null +++ b/languages/pt.php @@ -0,0 +1,7 @@ + 'Adicionar', +); + +add_translation("pt", $pt); + diff --git a/lib/groups.php b/lib/groups.php new file mode 100644 index 000000000..82bd6226d --- /dev/null +++ b/lib/groups.php @@ -0,0 +1,564 @@ + 'group', + 'container_guid' => 0, + 'relationship' => 'member', + 'inverse_relationship' => false, + 'full_view' => false, + )); + if (!$content) { + $content = elgg_echo('groups:none'); + } + break; + case 'discussion': + $content = elgg_list_entities(array( + 'type' => 'object', + 'subtype' => 'groupforumtopic', + 'order_by' => 'e.last_action desc', + 'limit' => 40, + 'full_view' => false, + )); + if (!$content) { + $content = elgg_echo('discussion:none'); + } + break; + case 'newest': + default: + $content = elgg_list_entities(array( + 'type' => 'group', + 'container_guid' => 0, + 'full_view' => false, + )); + if (!$content) { + $content = elgg_echo('groups:none'); + } + break; + } + + $filter = elgg_view('groups/group_sort_menu', array('selected' => $selected_tab)); + + $sidebar = elgg_view('groups/sidebar/find'); + $sidebar .= elgg_view('groups/sidebar/featured'); + + $params = array( + 'content' => $content, + 'sidebar' => $sidebar, + 'filter' => $filter, + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page(elgg_echo('groups:all'), $body); +} + +function groups_search_page() { + elgg_push_breadcrumb(elgg_echo('search')); + + $tag = get_input("tag"); + $title = elgg_echo('groups:search:title', array($tag)); + + // groups plugin saves tags as "interests" - see groups_fields_setup() in start.php + $params = array( + 'metadata_name' => 'interests', + 'metadata_value' => $tag, + 'types' => 'group', + 'full_view' => FALSE, + ); + $content = elgg_list_entities_from_metadata($params); + if (!$content) { + $content = elgg_echo('groups:search:none'); + } + + $sidebar = elgg_view('groups/sidebar/find'); + $sidebar .= elgg_view('groups/sidebar/featured'); + + $params = array( + 'content' => $content, + 'sidebar' => $sidebar, + 'filter' => false, + 'title' => $title, + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * List owned groups + */ +function groups_handle_owned_page() { + + $page_owner = elgg_get_page_owner_entity(); + + if ($page_owner->guid == elgg_get_logged_in_user_guid()) { + $title = elgg_echo('groups:owned'); + } else { + $title = elgg_echo('groups:owned:user', array($page_owner->name)); + } + elgg_push_breadcrumb($title); + + elgg_register_title_button(); + + $content = elgg_list_entities(array( + 'type' => 'group', + 'owner_guid' => elgg_get_page_owner_guid(), + 'full_view' => false, + )); + if (!$content) { + $content = elgg_echo('groups:none'); + } + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * List groups the user is memober of + */ +function groups_handle_mine_page() { + + $page_owner = elgg_get_page_owner_entity(); + + if ($page_owner->guid == elgg_get_logged_in_user_guid()) { + $title = elgg_echo('groups:yours'); + } else { + $title = elgg_echo('groups:user', array($page_owner->name)); + } + elgg_push_breadcrumb($title); + + elgg_register_title_button(); + + $content = elgg_list_entities_from_relationship_count(array( + 'type' => 'group', + 'relationship' => 'member', + 'relationship_guid' => elgg_get_page_owner_guid(), + 'inverse_relationship' => false, + 'full_view' => false, + )); + if (!$content) { + $content = elgg_echo('groups:none'); + } + + $filter = elgg_view('groups/group_sort_menu', array('selected' => $selected_tab)); + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => $filter, + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Create or edit a group + * + * @param string $page + * @param int $guid + */ +function groups_handle_edit_page($page, $guid = 0) { + gatekeeper(); + + if ($page == 'add') { + elgg_set_page_owner_guid(elgg_get_logged_in_user_guid()); + $title = elgg_echo('groups:add'); + elgg_push_breadcrumb($title); + if (elgg_get_plugin_setting('limited_groups', 'groups') != 'yes' || elgg_is_admin_logged_in()) { + $content = elgg_view('groups/edit'); + } else { + $content = elgg_echo('groups:cantcreate'); + } + } else { + $title = elgg_echo("groups:edit"); + $group = get_entity($guid); + + if ($group && $group->canEdit()) { + elgg_set_page_owner_guid($group->getGUID()); + elgg_push_breadcrumb($group->name, $group->getURL()); + elgg_push_breadcrumb($title); + $content = elgg_view("groups/edit", array('entity' => $group)); + } else { + $content = elgg_echo('groups:noaccess'); + } + } + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Group invitations for a user + */ +function groups_handle_invitations_page() { + gatekeeper(); + + $user = elgg_get_page_owner_entity(); + + $title = elgg_echo('groups:invitations'); + elgg_push_breadcrumb($title); + + // @todo temporary workaround for exts #287. + $invitations = groups_get_invited_groups(elgg_get_logged_in_user_guid()); + $content = elgg_view('groups/invitationrequests', array('invitations' => $invitations)); + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Group profile page + * + * @param int $guid Group entity GUID + */ +function groups_handle_profile_page($guid) { + elgg_set_page_owner_guid($guid); + + // turn this into a core function + global $autofeed; + $autofeed = true; + + elgg_push_context('group_profile'); + + $group = get_entity($guid); + if (!$group) { + forward('groups/all'); + } + elgg_push_breadcrumb($group->name); + + groups_register_profile_buttons($group); + + $content = elgg_view('groups/profile/layout', array('entity' => $group)); + if (group_gatekeeper(false)) { + $sidebar = ''; + if (elgg_is_active_plugin('search')) { + $sidebar .= elgg_view('groups/sidebar/search', array('entity' => $group)); + } + $sidebar .= elgg_view('groups/sidebar/members', array('entity' => $group)); + } else { + $sidebar = ''; + } + + $params = array( + 'content' => $content, + 'sidebar' => $sidebar, + 'title' => $group->name, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($group->name, $body); +} + +/** + * Group activity page + * + * @param int $guid Group entity GUID + */ +function groups_handle_activity_page($guid) { + + elgg_set_page_owner_guid($guid); + + $group = get_entity($guid); + if (!$group || !elgg_instanceof($group, 'group')) { + forward(); + } + + group_gatekeeper(); + + $title = elgg_echo('groups:activity'); + + elgg_push_breadcrumb($group->name, $group->getURL()); + elgg_push_breadcrumb($title); + + $db_prefix = elgg_get_config('dbprefix'); + + $content = elgg_list_river(array( + 'joins' => array("JOIN {$db_prefix}entities e ON e.guid = rv.object_guid"), + 'wheres' => array("e.container_guid = $guid") + )); + if (!$content) { + $content = '

' . elgg_echo('groups:activity:none') . '

'; + } + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Group members page + * + * @param int $guid Group entity GUID + */ +function groups_handle_members_page($guid) { + + elgg_set_page_owner_guid($guid); + + $group = get_entity($guid); + if (!$group || !elgg_instanceof($group, 'group')) { + forward(); + } + + group_gatekeeper(); + + $title = elgg_echo('groups:members:title', array($group->name)); + + elgg_push_breadcrumb($group->name, $group->getURL()); + elgg_push_breadcrumb(elgg_echo('groups:members')); + + $content = elgg_list_entities_from_relationship(array( + 'relationship' => 'member', + 'relationship_guid' => $group->guid, + 'inverse_relationship' => true, + 'types' => 'user', + 'limit' => 20, + )); + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Invite users to a group + * + * @param int $guid Group entity GUID + */ +function groups_handle_invite_page($guid) { + gatekeeper(); + + elgg_set_page_owner_guid($guid); + + $group = get_entity($guid); + + $title = elgg_echo('groups:invite:title'); + + elgg_push_breadcrumb($group->name, $group->getURL()); + elgg_push_breadcrumb(elgg_echo('groups:invite')); + + if ($group && $group->canEdit()) { + $content = elgg_view_form('groups/invite', array( + 'id' => 'invite_to_group', + 'class' => 'elgg-form-alt mtm', + ), array( + 'entity' => $group, + )); + } else { + $content .= elgg_echo('groups:noaccess'); + } + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Manage requests to join a group + * + * @param int $guid Group entity GUID + */ +function groups_handle_requests_page($guid) { + + gatekeeper(); + + elgg_set_page_owner_guid($guid); + + $group = get_entity($guid); + + $title = elgg_echo('groups:membershiprequests'); + + if ($group && $group->canEdit()) { + elgg_push_breadcrumb($group->name, $group->getURL()); + elgg_push_breadcrumb($title); + + $requests = elgg_get_entities_from_relationship(array( + 'type' => 'user', + 'relationship' => 'membership_request', + 'relationship_guid' => $guid, + 'inverse_relationship' => true, + 'limit' => 0, + )); + $content = elgg_view('groups/membershiprequests', array( + 'requests' => $requests, + 'entity' => $group, + )); + + } else { + $content = elgg_echo("groups:noaccess"); + } + + $params = array( + 'content' => $content, + 'title' => $title, + 'filter' => '', + ); + $body = elgg_view_layout('content', $params); + + echo elgg_view_page($title, $body); +} + +/** + * Registers the buttons for title area of the group profile page + * + * @param ElggGroup $group + */ +function groups_register_profile_buttons($group) { + + $actions = array(); + + // group owners + if ($group->canEdit()) { + // edit and invite + $url = elgg_get_site_url() . "groups/edit/{$group->getGUID()}"; + $actions[$url] = 'groups:edit'; + $url = elgg_get_site_url() . "groups/invite/{$group->getGUID()}"; + $actions[$url] = 'groups:invite'; + } + + // group members + if ($group->isMember(elgg_get_logged_in_user_entity())) { + if ($group->getOwnerGUID() != elgg_get_logged_in_user_guid()) { + // leave + $url = elgg_get_site_url() . "action/groups/leave?group_guid={$group->getGUID()}"; + $url = elgg_add_action_tokens_to_url($url); + $actions[$url] = 'groups:leave'; + } + } elseif (elgg_is_logged_in()) { + // join - admins can always join. + $url = elgg_get_site_url() . "action/groups/join?group_guid={$group->getGUID()}"; + $url = elgg_add_action_tokens_to_url($url); + if ($group->isPublicMembership() || $group->canEdit()) { + $actions[$url] = 'groups:join'; + } else { + // request membership + $actions[$url] = 'groups:joinrequest'; + } + } + + if ($actions) { + foreach ($actions as $url => $text) { + elgg_register_menu_item('title', array( + 'name' => $text, + 'href' => $url, + 'text' => elgg_echo($text), + 'link_class' => 'elgg-button elgg-button-action', + )); + } + } +} + +/** + * Prepares variables for the group edit form view. + * + * @param mixed $group ElggGroup or null. If a group, uses values from the group. + * @return array + */ +function groups_prepare_form_vars($group = null) { + $values = array( + 'name' => '', + 'membership' => ACCESS_PUBLIC, + 'vis' => ACCESS_PUBLIC, + 'guid' => null, + 'entity' => null + ); + + // handle customizable profile fields + $fields = elgg_get_config('group'); + + if ($fields) { + foreach ($fields as $name => $type) { + $values[$name] = ''; + } + } + + // handle tool options + $tools = elgg_get_config('group_tool_options'); + if ($tools) { + foreach ($tools as $group_option) { + $option_name = $group_option->name . "_enable"; + $values[$option_name] = $group_option->default_on ? 'yes' : 'no'; + } + } + + // get current group settings + if ($group) { + foreach (array_keys($values) as $field) { + if (isset($group->$field)) { + $values[$field] = $group->$field; + } + } + + if ($group->access_id != ACCESS_PUBLIC && $group->access_id != ACCESS_LOGGED_IN) { + // group only access - this is done to handle access not created when group is created + $values['vis'] = ACCESS_PRIVATE; + } + + $values['entity'] = $group; + } + + // get any sticky form settings + if (elgg_is_sticky_form('groups')) { + $sticky_values = elgg_get_sticky_values('groups'); + foreach ($sticky_values as $key => $value) { + $values[$key] = $value; + } + } + + elgg_clear_sticky_form('groups'); + + return $values; +} diff --git a/lib/subgroups.php b/lib/subgroups.php new file mode 100644 index 000000000..ffa531e16 --- /dev/null +++ b/lib/subgroups.php @@ -0,0 +1,84 @@ +guid; + return elgg_get_entities($options); + + } else { + return false; + } +} + +function list_subgroups($group, $options = array()){ + + if($group instanceof ElggGroup){ + + $defaults = array( + 'full_view' => false, + 'pagination' => true, + ); + $options = array_merge($defaults, $options); + + $options['type'] = 'group'; + $options['container_guid'] = $group->guid; + + elgg_push_context('subgroups'); + $list = elgg_list_entities($options); + elgg_pop_context(); + + return $list; + + } else { + return ""; + } +} + +function subgroups_group_url_matches($url){ + $url = parse_url($url); + $pattern1 = "/groups\/profile\/(?P\d+)/"; + $pattern2 = "/g\/(?P[^\/]+)/"; + + $matches1 = array(); + $matches2 = array(); + + preg_match($pattern1, $url['path'], $matches1); + preg_match($pattern2, $url['path'], $matches2); + + if(!empty($matches1) || !empty($matches2)) { + return array_merge($matches1, $matches2); + } else { + return false; + } +} + +function subgroups_get_group_from_url($group_url){ + $matches = subgroups_group_url_matches($group_url); + $group_guid = $matches['group_guid']; + $group_alias = $matches['group_alias']; + + $group = get_entity($group_guid); + if(!$group && elgg_is_active_plugin('group_alias')) { + $group = get_group_from_group_alias($group_alias); + } + + if($group && $group->getURL() == $group_url){ + return $group; + } else { + return false; + } +} diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 000000000..f4f249133 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,24 @@ + + + Subgroups + Lorea + 1.1-beta2 + Group admins can create subgroups. + https://lorea.cc/ + (C) Lorea 2011 + GNU Public License version 2 + + enhancement + + + elgg_release + 1.8 + + + + priority + after + groups + + + diff --git a/pages/subgroups/edit.php b/pages/subgroups/edit.php new file mode 100644 index 000000000..f8b0921ef --- /dev/null +++ b/pages/subgroups/edit.php @@ -0,0 +1,46 @@ +canEdit()){ + forward($page_owner->getURL()); +} + +elgg_push_breadcrumb(elgg_echo('group'),'groups/all'); +elgg_push_breadcrumb($page_owner->name, $page_owner->getURL()); + +$title = elgg_echo('subgroups:add'); +elgg_push_breadcrumb($title); + +elgg_register_title_button('subgroups', 'new'); + +elgg_register_menu_item('title', array( + 'name' => 'add_existing', + 'href' => "#subgroups-add", + 'text' => elgg_echo("subgroups:add_existing"), + 'rel' => 'toggle', + 'link_class' => 'elgg-button elgg-button-action', + 'priority' => 200, +)); + +$form_vars = array('class' => 'hidden', 'id' => 'subgroups-add'); +$body_vars = array('group' => $page_owner); + +$content = elgg_view_form('subgroups/add', $form_vars, $body_vars); +$content .= list_subgroups($page_owner); + +$body = elgg_view_layout('content', array( + 'content' => $content, + 'title' => $title, + 'filter' => '' +)); + +echo elgg_view_page($title, $body); diff --git a/pages/subgroups/owner.php b/pages/subgroups/owner.php new file mode 100644 index 000000000..ae06d968d --- /dev/null +++ b/pages/subgroups/owner.php @@ -0,0 +1,38 @@ +name)); + +elgg_push_breadcrumb(elgg_echo('groups'), "groups/all"); +elgg_push_breadcrumb($owner->name, $owner->getURL()); +elgg_push_breadcrumb(elgg_echo('relatedgroups')); + +// List +$content = list_subgroups($owner); +if (!$content) { + $content = elgg_echo("subgroups:none"); +} + +$body = elgg_view_layout('content', array( + 'title' => $title, + 'content' => $content, + 'filter' => '', +)); + +echo elgg_view_page($title, $body); diff --git a/start.php b/start.php new file mode 100644 index 000000000..803567f18 --- /dev/null +++ b/start.php @@ -0,0 +1,211 @@ +canEdit() || elgg_is_admin_logged_in()) { + $url = elgg_get_site_url() . "subgroups/edit/{$page_owner->getGUID()}"; + elgg_register_menu_item('page', array( + 'name' => 'subgroups', + 'text' => elgg_echo('subgroups:add'), + 'href' => $url, + )); + } + } + } +} + +/** + * Dispatches subgroups pages. + * URLs take the form of + * + * Group view subgroups: subgroups/owner/ + * Group manage subgroups: subgroups/manage/ + * + * @param array $page + * @return NULL + */ +function subgroups_page_handler($page){ + $pages_path = elgg_get_plugins_path() . "subgroups/pages"; + + switch($page[0]) { + case 'add': + case 'edit': + elgg_set_page_owner_guid($page[1]); + include($pages_path."/subgroups/edit.php"); + break; + case 'owner': + elgg_set_page_owner_guid($page[1]); + include($pages_path."/subgroups/owner.php"); + break; + case 'new': + $group = new ElggGroup((int)$page[1]); + + if (!$group->guid) { + register_error(elgg_echo('error:default')); + return false; + } + + elgg_load_library('elgg:groups'); + $title = elgg_echo('subgroups:new:of', array($group->name)); + + elgg_push_breadcrumb(elgg_echo('groups'), "groups/all"); + elgg_push_breadcrumb($group->name, $group->getURL()); + elgg_push_breadcrumb(elgg_echo('subgroups:new')); + + set_input('container_guid', $group->guid); + + $body = elgg_view_layout('content', array( + 'content' => elgg_view('groups/edit'), + 'title' => $title, + 'filter' => '', + )); + echo elgg_view_page($title, $body); + + break; + default: + return false; + } + return true; +} + +function subgroups_menu_setup($hook, $type, $return, $params){ + + $group = elgg_get_page_owner_entity(); + $othergroup = $params['entity']; + + if($group instanceof ElggGroup && $group->canEdit() && + $othergroup instanceof ElggGroup && + elgg_in_context('subgroups')){ + + // Delete all previous links + $return = array(); + + $url = elgg_http_add_url_query_elements('action/subgroups/remove', array( + 'group' => $group->guid, + 'othergroup' => $othergroup->guid, + )); + + $options = array( + 'name' => 'delete', + 'href' => $url, + 'text' => "", + 'confirm' => elgg_echo('deleteconfirm'), + 'text_encode' => false, + ); + $return[] = ElggMenuItem::factory($options); + } + return $return; +} + +/** + * Unset container guid when a group is created. Triggered on group save. + * Using SQL since event is triggered on save() function and we can't do + * call the function again. + * + */ +function subgroups_unset_group_container($event, $object_type, $entity) { + global $CONFIG; + if (!elgg_instanceof($entity->getContainerEntity(), 'group')) { + $query = "UPDATE {$CONFIG->dbprefix}entities set" + . " container_guid=0 where guid={$entity->guid}"; + return !!(update_data($query)); + } + return true; +} + +function subgroups_add_container_field($hook, $type, $return, $params) { + $return['container_guid'] = 'hidden'; + return $return; +} + +/** + * Hook to listen to read access control requests and return parent groups. + */ +function subgroups_read_acl_plugin_hook($hook, $entity_type, $returnvalue, $params) { + $page_owner = elgg_get_page_owner_entity(); + $user_guid = $params['user_id']; + $user = get_entity($user_guid); + if (!$user) { + return $returnvalue; + } + + // only insert group access for current group + if ($page_owner instanceof ElggGroup) { + $parent_group = $page_owner->getContainerEntity(); + while ($parent_group) { + $returnvalue[$parent_group->group_acl] = elgg_echo('groups:group') . ': ' . $parent_group->name; + $parent_group = $parent_group->getContainerEntity(); + } + } + + return $returnvalue; +} diff --git a/views/default/forms/groups/edit.php b/views/default/forms/groups/edit.php new file mode 100644 index 000000000..e2f9fb394 --- /dev/null +++ b/views/default/forms/groups/edit.php @@ -0,0 +1,142 @@ + +
+
+ 'icon')); ?> +
+
+
+ 'name', + 'value' => $name + )); + ?> +
+ 0) { + foreach ($group_profile_fields as $shortname => $valtype) { + $line_break = '
'; + if ($valtype == 'longtext') { + $line_break = ''; + } + echo '
$line_break"; + echo elgg_view("input/{$valtype}", array( + 'name' => $shortname, + 'value' => elgg_extract($shortname, $vars) + )); + echo '
'; + } +} +?> + +
+ +
+ + elgg_echo('groups:access:group'), + ACCESS_LOGGED_IN => elgg_echo("LOGGED_IN"), + ACCESS_PUBLIC => elgg_echo("PUBLIC") + ); +?> + +
+ +
+ +label,$b->label);')); + foreach ($tools as $group_option) { + $group_option_toggle_name = $group_option->name . "_enable"; + $value = elgg_extract($group_option_toggle_name, $vars); +?> +
+ + $group_option_toggle_name, + "value" => $value, + 'options' => array( + elgg_echo('groups:yes') => 'yes', + elgg_echo('groups:no') => 'no', + ), + )); + ?> +
+ +
+ 'group_guid', + 'value' => $entity->getGUID(), + )); +} + +echo elgg_view('input/hidden', array( + 'name' => 'container_guid', + 'value' => isset($vars['entity']) ? + $entity->getContainerGUID() : + get_input('container_guid'), +)); + +echo elgg_view('input/submit', array('value' => elgg_echo('save'))); + +if (isset($entity)) { + $delete_url = 'action/groups/delete?guid=' . $entity->getGUID(); + echo elgg_view('output/confirmlink', array( + 'text' => elgg_echo('groups:delete'), + 'href' => $delete_url, + 'confirm' => elgg_echo('groups:deletewarning'), + 'class' => 'elgg-button elgg-button-delete float-alt', + )); +} +?> +
diff --git a/views/default/forms/subgroups/add.php b/views/default/forms/subgroups/add.php new file mode 100644 index 000000000..f0349a728 --- /dev/null +++ b/views/default/forms/subgroups/add.php @@ -0,0 +1,37 @@ + + + 'group', + 'value' => $vars['group']->guid)); + echo elgg_view('input/submit', array( + 'value' => elgg_echo('subgroups:add:button'))); +?> + + + diff --git a/views/default/group/default.php b/views/default/group/default.php new file mode 100644 index 000000000..9c0356550 --- /dev/null +++ b/views/default/group/default.php @@ -0,0 +1,39 @@ + $group, + 'handler' => 'groups', + 'sort_by' => 'priority', + 'class' => 'elgg-menu-hz', +)); + +if (elgg_in_context('owner_block') || elgg_in_context('widgets')) { + $metadata = ''; +} + +if (elgg_get_context() == 'gallery') { + echo $icon; +} elseif ($vars['full_view']) { + echo elgg_view("groups/profile/profile_block", $vars); +} else { + // brief view + + $params = array( + 'entity' => $group, + 'metadata' => $metadata, + 'subtitle' => $group->briefdescription, + ); + $params = $params + $vars; + $list_body = elgg_view('group/elements/summary', $params); + + echo elgg_view_image_block($icon, $list_body, $vars); +} diff --git a/views/default/group/elements/summary.php b/views/default/group/elements/summary.php new file mode 100644 index 000000000..a95d1e296 --- /dev/null +++ b/views/default/group/elements/summary.php @@ -0,0 +1,67 @@ +title)) { + $text = $entity->title; + } else { + $text = $entity->name; + } + $params = array( + 'text' => $text, + 'href' => $entity->getURL(), + 'is_trusted' => true, + ); + $title_link = elgg_view('output/url', $params); +} + +$metadata = elgg_extract('metadata', $vars, ''); +$subtitle = elgg_extract('subtitle', $vars, ''); +$content = elgg_extract('content', $vars, ''); + +$container = get_entity($entity->container_guid); + +$tags = elgg_extract('tags', $vars, ''); +if ($tags !== false) { + $tags = elgg_view('output/tags', array('tags' => $entity->tags)); +} + +if ($metadata) { + echo $metadata; +} +if ($title_link) { + echo "

$title_link

"; +} +if(elgg_instanceof($container, 'group')) { + $container_link = elgg_view('output/url', array( + 'text' => $container->name, + 'href' => $container->getURL(), + 'is_trusted' => true, + )); + $container_link = elgg_echo('subgroups:owner:single', array($container_link)); + echo "
$container_link
"; +} +echo "
$subtitle
"; + +$subgroups = elgg_view('subgroups/subgroups_icons', array('entity' => $entity)); +echo "
$subgroups
"; + +echo $tags; + +echo elgg_view('object/summary/extend', $vars); + +if ($content) { + echo "
$content
"; +} diff --git a/views/default/groups/css/elements/components.php b/views/default/groups/css/elements/components.php new file mode 100644 index 000000000..0198fa309 --- /dev/null +++ b/views/default/groups/css/elements/components.php @@ -0,0 +1,6 @@ +/* *************************************** + Gallery +*************************************** */ +.elgg-gallery-groups > li { + margin: 0 2px; +} diff --git a/views/default/groups/group_sort_menu.php b/views/default/groups/group_sort_menu.php new file mode 100644 index 000000000..7e4d1bca6 --- /dev/null +++ b/views/default/groups/group_sort_menu.php @@ -0,0 +1,46 @@ + array( + 'text' => elgg_echo('groups:newest'), + 'href' => 'groups/all?filter=newest', + 'priority' => 200, + ), + + 'popular' => array( + 'text' => elgg_echo('groups:popular'), + 'href' => 'groups/all?filter=popular', + 'priority' => 400, + ), + + 'discussion' => array( + 'text' => elgg_echo('groups:latestdiscussion'), + 'href' => 'groups/all?filter=discussion', + 'priority' => 500, + ), +); + +if ($user = elgg_get_logged_in_user_entity()) { + $tabs['member'] = array( + 'text' => elgg_echo('groups:yours'), + 'href' => "groups/member/$user->username", + 'priority' => 300, + ); +} + +foreach ($tabs as $name => $tab) { + $tab['name'] = $name; + + if ($vars['selected'] == $name) { + $tab['selected'] = true; + } + + elgg_register_menu_item('filter', $tab); +} + +echo elgg_view_menu('filter', array('sort_by' => 'priority', 'class' => 'elgg-menu-hz')); diff --git a/views/default/groups/profile/fields.php b/views/default/groups/profile/fields.php new file mode 100644 index 000000000..41b0de9a0 --- /dev/null +++ b/views/default/groups/profile/fields.php @@ -0,0 +1,41 @@ + 0) { + + $even_odd = 'odd'; + foreach ($profile_fields as $key => $valtype) { + // do not show the name or hidden values + if ($key == 'name' || $valtype == 'hidden') { + continue; + } + + $value = $group->$key; + if (empty($value)) { + continue; + } + + $options = array('value' => $group->$key); + if ($valtype == 'tags') { + $options['tag_names'] = $key; + } + + if ($output = elgg_view("output/$valtype", $options)) { + + echo "
"; + echo ""; + echo elgg_echo("groups:$key"); + echo ": "; + echo $output; + echo "
"; + + $even_odd = ($even_odd == 'even') ? 'odd' : 'even'; + } + } +} diff --git a/views/default/groups/sidebar/subgroups.php b/views/default/groups/sidebar/subgroups.php new file mode 100644 index 000000000..35ffbaef9 --- /dev/null +++ b/views/default/groups/sidebar/subgroups.php @@ -0,0 +1,44 @@ + 'subgroups/owner/' . $owner->guid, + 'text' => elgg_echo('subgroups:more'), + 'is_trusted' => true, +)); + +$params = array( + 'type' => 'group', + 'container_guid' => $owner->guid, + 'limit' => $limit, + 'types' => 'group', + 'list_type' => 'gallery', + 'gallery_class' => 'elgg-gallery-groups', + 'full_view' => false +); + +$params['count'] = true; +if(elgg_get_entities($params) == 0) { + return true; +} +$params['count'] = false; + +$body = elgg_list_entities($params); +$body .= "
$all_link
"; + +echo elgg_view_module('aside', elgg_echo('subgroups'), $body); diff --git a/views/default/icon/default.php b/views/default/icon/default.php new file mode 100644 index 000000000..3ef1a05a1 --- /dev/null +++ b/views/default/icon/default.php @@ -0,0 +1,58 @@ +name)) { + $title = $entity->name; +} else { + $title = $entity->title; +} +$title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false); + +$url = $entity->getURL(); +if (isset($vars['href'])) { + $url = $vars['href']; +} + +$img = elgg_view('output/img', array( + 'src' => $entity->getIconURL($vars['size']), + 'alt' => $title, + 'class' => $class, +)); + +if ($url) { + $params = array( + 'href' => $url, + 'text' => $img, + 'title' => $title, + 'is_trusted' => true, + ); + $class = elgg_extract('link_class', $vars, ''); + if ($class) { + $params['class'] = $class; + } + + echo elgg_view('output/url', $params); +} else { + echo $img; +} diff --git a/views/default/input/autocomplete.php b/views/default/input/autocomplete.php new file mode 100644 index 000000000..4eedac22a --- /dev/null +++ b/views/default/input/autocomplete.php @@ -0,0 +1,57 @@ + '', + 'disabled' => false, +); + +$vars = array_merge($defaults, $vars); + +$params = array(); +if (isset($vars['match_on'])) { + $params['match_on'] = $vars['match_on']; + unset($vars['match_on']); +} +if (isset($vars['match_owner'])) { + $params['match_owner'] = $vars['match_owner']; + unset($vars['match_owner']); +} +$ac_url_params = http_build_query($params); + +elgg_load_js('elgg.autocomplete'); +elgg_load_js('jquery.ui.autocomplete.html'); + +?> + + + /> diff --git a/views/default/navigation/breadcrumbs.php b/views/default/navigation/breadcrumbs.php new file mode 100644 index 000000000..6ceb5eacc --- /dev/null +++ b/views/default/navigation/breadcrumbs.php @@ -0,0 +1,83 @@ +guid; + $alias = $page_owner->alias; + + $title = $breadcrumbs[1]['title']; + $name = $page_owner->name; + + if(strpos($link, $guid) || $alias && strpos($link, $alias) || !$link && $title == $name) { + $first_crumb = array_shift($breadcrumbs); + $container = get_entity($page_owner->container_guid); + while(elgg_instanceof($container, 'group')) { + + // TODO: I should find a better solution for this. + if(strpos($first_crumb['link'], 'groups') !== false) { + $container_link = str_replace('all', "profile/$container->guid", $first_crumb['link']); + } elseif(strpos($first_crumb['link'], 'discussion') !== false) { + $container_link = str_replace('all', "owner/$container->guid", $first_crumb['link']); + } else { + $container_link = str_replace('all', "group/$container->guid", $first_crumb['link']); + } + + $container_link = elgg_trigger_plugin_hook('container_crumb_link', 'breadcrumbs', array('container' => $container, 'first_crumb' => $first_crumb), $container_link); + + array_unshift($breadcrumbs, array( + 'title' => $container->name, + 'link' => $container_link, + )); + $container = get_entity($container->container_guid); + } + array_unshift($breadcrumbs, $first_crumb); + } +} + + +$class = 'elgg-menu elgg-breadcrumbs'; +$additional_class = elgg_extract('class', $vars, ''); +if ($additional_class) { + $class = "$class $additional_class"; +} + +if (is_array($breadcrumbs) && count($breadcrumbs) > 0) { + echo "
    "; + foreach ($breadcrumbs as $breadcrumb) { + if (!empty($breadcrumb['link'])) { + $crumb = elgg_view('output/url', array( + 'href' => $breadcrumb['link'], + 'text' => $breadcrumb['title'], + 'is_trusted' => true, + )); + } else { + $crumb = $breadcrumb['title']; + } + echo "
  • $crumb
  • "; + } + echo '
'; +} diff --git a/views/default/subgroups/group_module.php b/views/default/subgroups/group_module.php new file mode 100644 index 000000000..083e50b16 --- /dev/null +++ b/views/default/subgroups/group_module.php @@ -0,0 +1,51 @@ +subgroups_enable != "yes") { + return true; +} + +$all_link = elgg_view('output/url', array( + 'href' => "subgroups/owner/$group->guid/all", + 'text' => elgg_echo('link:view:all'), + 'is_trusted' => true, +)); + +$options = array( + 'type' => 'group', + 'container_guid' => $group->guid, + 'type' => 'group', + 'limit' => 6, + 'full_view' => false, + 'pagination' => false, +); + +elgg_push_context('widgets'); +$content = elgg_list_entities($options); +elgg_pop_context(); + +if (!$content) { + $content = '

' . elgg_echo('subgroups:none') . '

'; +} +if($group->canEdit()) { + $new_link = elgg_view('output/url', array( + 'href' => "subgroups/add/$group->guid", + 'text' => elgg_echo('subgroups:add'), + 'is_trusted' => true, + )); +} else { + $new_link = false; +} + +echo elgg_view('groups/profile/module', array( + 'title' => elgg_echo('subgroups:group'), + 'content' => $content, + 'all_link' => $all_link, + 'add_link' => $new_link, +)); diff --git a/views/default/subgroups/groups_i_can_edit.php b/views/default/subgroups/groups_i_can_edit.php new file mode 100644 index 000000000..45b0c9e6e --- /dev/null +++ b/views/default/subgroups/groups_i_can_edit.php @@ -0,0 +1,71 @@ + 'group', + 'owner_guid' => $user_guid, + 'limit' => 0, +)); +$entities = array_merge( + $entities, + elgg_get_entities_from_relationship(array( + 'type' => 'group', + 'relationship' => 'operator', + 'relationship_guid' => $user_guid, + 'limit' => 0, + )) +); + +$all_entities = array(); +while (!empty($entities)) { + $entity = array_pop($entities); + $childs = elgg_get_entities(array( + 'type' => 'group', + 'container_guid' => $entity->guid, + )); + foreach ($childs as $child) { + array_push($entities, $child); + } + $all_entities[] = $entity; +} + +$results = array(); +foreach ($all_entities as $entity) { + + if (!preg_match("/^{$q}/i", $entity->name)) { + continue; + } + + $output = elgg_view_list_item($entity, array( + 'use_hover' => false, + 'class' => 'elgg-autocomplete-item', + )); + + $icon = elgg_view_entity_icon($entity, 'tiny', array( + 'use_hover' => false, + )); + $results[$entity->name . $entity->guid] = array( + 'type' => 'group', + 'name' => $entity->name, + 'desc' => strip_tags($entity->description), + 'guid' => $entity->guid, + 'label' => $output, + 'value' => $entity->guid, + 'icon' => $icon, + 'url' => $entity->getURL(), + ); +} + +ksort($results); +header("Content-Type: application/json"); +echo json_encode(array_values($results)); +exit; diff --git a/views/default/subgroups/subgroups_icons.php b/views/default/subgroups/subgroups_icons.php new file mode 100644 index 000000000..dfd5b29fa --- /dev/null +++ b/views/default/subgroups/subgroups_icons.php @@ -0,0 +1,11 @@ + $subgroup, + 'size' => 'tiny' + )); + echo " "; +} -- cgit v1.2.3