diff options
Diffstat (limited to 'mod/groups/actions')
21 files changed, 600 insertions, 466 deletions
diff --git a/mod/groups/actions/addtogroup.php b/mod/groups/actions/addtogroup.php deleted file mode 100644 index d75c5fdb8..000000000 --- a/mod/groups/actions/addtogroup.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php -/** - * Add a user to a group - * - * @package ElggGroups - */ -$logged_in_user = elgg_get_logged_in_user_entity(); - -$user_guid = get_input('user_guid'); -if (!is_array($user_guid)) - $user_guid = array($user_guid); -$group_guid = get_input('group_guid'); - -if (sizeof($user_guid)) { - foreach ($user_guid as $u_id) { - $user = get_entity($u_id); - $group = get_entity($group_guid); - - set_page_owner($group->guid); - - if ($user && $group) { - - //if (elgg_get_logged_in_user_guid() == $group->owner_guid) - if ($group->canEdit()) { - - // If the group is open or the user has requested membership - if ( - (check_entity_relationship($user->guid, 'membership_request', $group->guid)) || - ($group->isPublicMembership()) - ) { - - if (!$group->isMember($user)) { - // Remove relationships - remove_entity_relationship($group->guid, 'invited', $user->guid); - remove_entity_relationship($user->guid, 'membership_request', $group->guid); - - //add_entity_relationship($user->guid, 'member', $group->guid); - $group->join($user); - - // send welcome email - notify_user($user->getGUID(), $group->owner_guid, - elgg_echo('groups:welcome:subject', array($group->name)), - elgg_echo('groups:welcome:body', array($user->name, $group->name, $group->getURL())), - NULL); - - system_message(elgg_echo('groups:addedtogroup')); - } - else - register_error(elgg_echo("groups:cantjoin")); - } - else { - if ($user->isFriend()) { - - // Create relationship - add_entity_relationship($group->guid, 'invited', $user->guid); - - // Send email - $url = elgg_get_site_url() . "pg/groups/invited?user_guid={$user->guid}&group_guid={$group->guid}"; - if (notify_user($user->getGUID(), $group->owner_guid, - elgg_echo('groups:invite:subject', array($user->name, $group->name)), - elgg_echo('groups:invite:body', array($user->name, $logged_in_user->name, $group->name, $url)), - NULL)) - system_message(elgg_echo("groups:userinvited")); - else - register_error(elgg_echo("groups:usernotinvited")); - } - else - register_error(elgg_echo("groups:usernotinvited")); - } - } - else - register_error(elgg_echo("groups:notowner")); - } - } -} - -forward(REFERER); diff --git a/mod/groups/actions/delete.php b/mod/groups/actions/delete.php deleted file mode 100644 index a99b3a2c6..000000000 --- a/mod/groups/actions/delete.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * Delete a group - */ - -$guid = (int)get_input('group_guid'); -$entity = get_entity($guid); - -if (($entity) && ($entity instanceof ElggGroup)) -{ - if ($entity->delete()) - system_message(elgg_echo('group:deleted')); - else - register_error(elgg_echo('group:notdeleted')); -} -else - register_error(elgg_echo('group:notdeleted')); - -$url_name = elgg_get_logged_in_user_entity()->username; -forward(elgg_get_site_url() . "pg/groups/member/{$url_name}"); diff --git a/mod/groups/actions/discussion/delete.php b/mod/groups/actions/discussion/delete.php index c3de612d7..f307aa091 100644 --- a/mod/groups/actions/discussion/delete.php +++ b/mod/groups/actions/discussion/delete.php @@ -26,4 +26,4 @@ if ($result) { register_error(elgg_echo('discussion:error:notdeleted')); } -forward("pg/discussion/owner/$container->guid"); +forward("discussion/owner/$container->guid"); diff --git a/mod/groups/actions/discussion/reply/delete.php b/mod/groups/actions/discussion/reply/delete.php new file mode 100644 index 000000000..88c6b79d6 --- /dev/null +++ b/mod/groups/actions/discussion/reply/delete.php @@ -0,0 +1,26 @@ +<?php +/** + * Delete discussion reply + */ + +$id = (int) get_input('annotation_id'); + +$reply = elgg_get_annotation_from_id($id); +if (!$reply || $reply->name != 'group_topic_post') { + register_error(elgg_echo('discussion:reply:error:notdeleted')); + forward(REFERER); +} + +if (!$reply->canEdit()) { + register_error(elgg_echo('discussion:error:permissions')); + forward(REFERER); +} + +$result = $reply->delete(); +if ($result) { + system_message(elgg_echo('discussion:reply:deleted')); +} else { + register_error(elgg_echo('discussion:reply:error:notdeleted')); +} + +forward(REFERER); diff --git a/mod/groups/actions/discussion/reply/save.php b/mod/groups/actions/discussion/reply/save.php new file mode 100644 index 000000000..f8be8aa2c --- /dev/null +++ b/mod/groups/actions/discussion/reply/save.php @@ -0,0 +1,58 @@ +<?php +/** + * Post a reply to discussion topic + * + */ + +// Get input +$entity_guid = (int) get_input('entity_guid'); +$text = get_input('group_topic_post'); +$annotation_id = (int) get_input('annotation_id'); + +// reply cannot be empty +if (empty($text)) { + register_error(elgg_echo('grouppost:nopost')); + forward(REFERER); +} + +$topic = get_entity($entity_guid); +if (!$topic) { + register_error(elgg_echo('grouppost:nopost')); + forward(REFERER); +} + +$user = elgg_get_logged_in_user_entity(); + +$group = $topic->getContainerEntity(); +if (!$group->canWriteToContainer()) { + register_error(elgg_echo('groups:notmember')); + forward(REFERER); +} + +// if editing a reply, make sure it's valid +if ($annotation_id) { + $annotation = elgg_get_annotation_from_id($annotation_id); + if (!$annotation->canEdit()) { + register_error(elgg_echo('groups:notowner')); + forward(REFERER); + } + + $annotation->value = $text; + if (!$annotation->save()) { + system_message(elgg_echo('groups:forumpost:error')); + forward(REFERER); + } + system_message(elgg_echo('groups:forumpost:edited')); +} else { + // add the reply to the forum topic + $reply_id = $topic->annotate('group_topic_post', $text, $topic->access_id, $user->guid); + if ($reply_id == false) { + system_message(elgg_echo('groupspost:failure')); + forward(REFERER); + } + + add_to_river('river/annotation/group_topic_post/reply', 'reply', $user->guid, $topic->guid, "", 0, $reply_id); + system_message(elgg_echo('groupspost:success')); +} + +forward(REFERER); diff --git a/mod/groups/actions/discussion/save.php b/mod/groups/actions/discussion/save.php index f553b562c..b3e9da654 100644 --- a/mod/groups/actions/discussion/save.php +++ b/mod/groups/actions/discussion/save.php @@ -4,7 +4,7 @@ */ // Get variables -$title = get_input("title"); +$title = htmlspecialchars(get_input('title', '', false), ENT_QUOTES, 'UTF-8'); $desc = get_input("description"); $status = get_input("status"); $access_id = (int) get_input("access_id"); @@ -21,7 +21,7 @@ if (!$title || !$desc) { } $container = get_entity($container_guid); -if (!$container || (!$container->isMember() && !$container->canEdit())) { +if (!$container || !$container->canWriteToContainer(0, 'object', 'groupforumtopic')) { register_error(elgg_echo('discussion:error:permissions')); forward(REFERER); } @@ -67,7 +67,7 @@ elgg_clear_sticky_form('topic'); // handle results differently for new topics and topic edits if ($new_topic) { system_message(elgg_echo('discussion:topic:created')); - add_to_river('river/forum/topic/create', 'create', elgg_get_logged_in_user_guid(), $topic->guid); + add_to_river('river/object/groupforumtopic/create', 'create', elgg_get_logged_in_user_guid(), $topic->guid); } else { system_message(elgg_echo('discussion:topic:updated')); } diff --git a/mod/groups/actions/edit.php b/mod/groups/actions/edit.php deleted file mode 100644 index baa1a7065..000000000 --- a/mod/groups/actions/edit.php +++ /dev/null @@ -1,161 +0,0 @@ -<?php -/** - * Elgg groups plugin edit action. - * - * @package ElggGroups - */ - -// Load configuration -global $CONFIG; - -/** - * wrapper for recursive array walk decoding - */ -function profile_array_decoder(&$v) { - $v = html_entity_decode($v, ENT_COMPAT, 'UTF-8'); -} - -// Get group fields -$input = array(); -foreach ($CONFIG->group as $shortname => $valuetype) { - // another work around for Elgg's encoding problems: #561, #1963 - $input[$shortname] = get_input($shortname); - if (is_array($input[$shortname])) { - array_walk_recursive($input[$shortname], 'profile_array_decoder'); - } else { - $input[$shortname] = html_entity_decode($input[$shortname], ENT_COMPAT, 'UTF-8'); - } - - if ($valuetype == 'tags') { - $input[$shortname] = string_to_tag_array($input[$shortname]); - } -} - -$input['name'] = get_input('name'); -$input['name'] = html_entity_decode($input['name'], ENT_COMPAT, 'UTF-8'); - -$user = elgg_get_logged_in_user_entity(); - -$group_guid = (int)get_input('group_guid'); -$new_group_flag = $group_guid == 0; - -$group = new ElggGroup($group_guid); // load if present, if not create a new group -if (($group_guid) && (!$group->canEdit())) { - register_error(elgg_echo("groups:cantedit")); - - forward(REFERER); - exit; -} - -// Assume we can edit or this is a new group -if (sizeof($input) > 0) { - foreach($input as $shortname => $value) { - $group->$shortname = $value; - } -} - -// Validate create -if (!$group->name) { - register_error(elgg_echo("groups:notitle")); - - forward(REFERER); - exit; -} - -// Group membership - should these be treated with same constants as access permissions? -switch (get_input('membership')) { - case ACCESS_PUBLIC: - $group->membership = ACCESS_PUBLIC; - break; - default: - $group->membership = ACCESS_PRIVATE; -} - -// Set access - all groups are public from elgg's point of view, unless the override is in place -if (elgg_get_plugin_setting('hidden_groups', 'groups') == 'yes') { - $visibility = (int)get_input('vis','',false); - - $group->access_id = $visibility; -} else { - $group->access_id = ACCESS_PUBLIC; -} - -// Set group tool options -//$group->files_enable = get_input('files_enable', 'yes'); -//$group->pages_enable = get_input('pages_enable', 'yes'); -//$group->forum_enable = get_input('forum_enable', 'yes'); - -// Set group tool options -if (isset($CONFIG->group_tool_options)) { - foreach($CONFIG->group_tool_options as $group_option) { - $group_option_toggle_name = $group_option->name."_enable"; - if ($group_option->default_on) { - $group_option_default_value = 'yes'; - } else { - $group_option_default_value = 'no'; - } - $group->$group_option_toggle_name = get_input($group_option_toggle_name, $group_option_default_value); - } -} - -$group->save(); - -// group creator needs to be member of new group and river entry created -if ($new_group_flag) { - set_page_owner($group->guid); - $group->join($user); - add_to_river('river/group/create', 'create', $user->guid, $group->guid); -} - - - -// Now see if we have a file icon -if ((isset($_FILES['icon'])) && (substr_count($_FILES['icon']['type'],'image/'))) { - $prefix = "groups/".$group->guid; - - $filehandler = new ElggFile(); - $filehandler->owner_guid = $group->owner_guid; - $filehandler->setFilename($prefix . ".jpg"); - $filehandler->open("write"); - $filehandler->write(get_uploaded_file('icon')); - $filehandler->close(); - - $thumbtiny = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(),25,25, true); - $thumbsmall = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(),40,40, true); - $thumbmedium = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(),100,100, true); - $thumblarge = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(),200,200, false); - if ($thumbtiny) { - - $thumb = new ElggFile(); - $thumb->owner_guid = $group->owner_guid; - $thumb->setMimeType('image/jpeg'); - - $thumb->setFilename($prefix."tiny.jpg"); - $thumb->open("write"); - $thumb->write($thumbtiny); - $thumb->close(); - - $thumb->setFilename($prefix."small.jpg"); - $thumb->open("write"); - $thumb->write($thumbsmall); - $thumb->close(); - - $thumb->setFilename($prefix."medium.jpg"); - $thumb->open("write"); - $thumb->write($thumbmedium); - $thumb->close(); - - $thumb->setFilename($prefix."large.jpg"); - $thumb->open("write"); - $thumb->write($thumblarge); - $thumb->close(); - - $group->icontime = time(); - } -} - -system_message(elgg_echo("groups:saved")); - - -forward($group->getUrl()); - diff --git a/mod/groups/actions/featured.php b/mod/groups/actions/featured.php deleted file mode 100644 index 72ca7eebd..000000000 --- a/mod/groups/actions/featured.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Feature a group - * - * @package ElggGroups - */ - - -$group_guid = get_input('group_guid'); -$action = get_input('action_type'); - -$group = get_entity($group_guid); - -if ($group) { - //get the action, is it to feature or unfeature - if ($action == "feature") { - $group->featured_group = "yes"; - system_message(elgg_echo('groups:featuredon')); - } - - if ($action == "unfeature") { - $group->featured_group = "no"; - system_message(elgg_echo('groups:unfeatured')); - } -} - -forward(REFERER); diff --git a/mod/groups/actions/groups/delete.php b/mod/groups/actions/groups/delete.php new file mode 100644 index 000000000..2ff6c339c --- /dev/null +++ b/mod/groups/actions/groups/delete.php @@ -0,0 +1,42 @@ +<?php +/** + * Delete a group + */ + +$guid = (int) get_input('guid'); +if (!$guid) { + // backward compatible + elgg_deprecated_notice("Use 'guid' for group delete action", 1.8); + $guid = (int)get_input('group_guid'); +} +$entity = get_entity($guid); + +if (!$entity->canEdit()) { + register_error(elgg_echo('group:notdeleted')); + forward(REFERER); +} + +if (($entity) && ($entity instanceof ElggGroup)) { + // delete group icons + $owner_guid = $entity->owner_guid; + $prefix = "groups/" . $entity->guid; + $imagenames = array('.jpg', 'tiny.jpg', 'small.jpg', 'medium.jpg', 'large.jpg'); + $img = new ElggFile(); + $img->owner_guid = $owner_guid; + foreach ($imagenames as $name) { + $img->setFilename($prefix . $name); + $img->delete(); + } + + // delete group + if ($entity->delete()) { + system_message(elgg_echo('group:deleted')); + } else { + register_error(elgg_echo('group:notdeleted')); + } +} else { + register_error(elgg_echo('group:notdeleted')); +} + +$url_name = elgg_get_logged_in_user_entity()->username; +forward(elgg_get_site_url() . "groups/member/{$url_name}"); diff --git a/mod/groups/actions/groups/edit.php b/mod/groups/actions/groups/edit.php new file mode 100644 index 000000000..f19b90566 --- /dev/null +++ b/mod/groups/actions/groups/edit.php @@ -0,0 +1,235 @@ +<?php +/** + * Elgg groups plugin edit action. + * + * @package ElggGroups + */ + +elgg_make_sticky_form('groups'); + +/** + * wrapper for recursive array walk decoding + */ +function profile_array_decoder(&$v) { + $v = _elgg_html_decode($v); +} + +// Get group fields +$input = array(); +foreach (elgg_get_config('group') as $shortname => $valuetype) { + $input[$shortname] = get_input($shortname); + + // @todo treat profile fields as unescaped: don't filter, encode on output + if (is_array($input[$shortname])) { + array_walk_recursive($input[$shortname], 'profile_array_decoder'); + } else { + $input[$shortname] = _elgg_html_decode($input[$shortname]); + } + + if ($valuetype == 'tags') { + $input[$shortname] = string_to_tag_array($input[$shortname]); + } +} + +$input['name'] = htmlspecialchars(get_input('name', '', false), ENT_QUOTES, 'UTF-8'); + +$user = elgg_get_logged_in_user_entity(); + +$group_guid = (int)get_input('group_guid'); +$is_new_group = $group_guid == 0; + +if ($is_new_group + && (elgg_get_plugin_setting('limited_groups', 'groups') == 'yes') + && !$user->isAdmin()) { + register_error(elgg_echo("groups:cantcreate")); + forward(REFERER); +} + +$group = new ElggGroup($group_guid); // load if present, if not create a new group +if ($group_guid && !$group->canEdit()) { + register_error(elgg_echo("groups:cantedit")); + forward(REFERER); +} + +// Assume we can edit or this is a new group +if (sizeof($input) > 0) { + foreach($input as $shortname => $value) { + // update access collection name if group name changes + if (!$is_new_group && $shortname == 'name' && $value != $group->name) { + $group_name = html_entity_decode($value, ENT_QUOTES, 'UTF-8'); + $ac_name = sanitize_string(elgg_echo('groups:group') . ": " . $group_name); + $acl = get_access_collection($group->group_acl); + if ($acl) { + // @todo Elgg api does not support updating access collection name + $db_prefix = elgg_get_config('dbprefix'); + $query = "UPDATE {$db_prefix}access_collections SET name = '$ac_name' + WHERE id = $group->group_acl"; + update_data($query); + } + } + + $group->$shortname = $value; + } +} + +// Validate create +if (!$group->name) { + register_error(elgg_echo("groups:notitle")); + forward(REFERER); +} + + +// Set group tool options +$tool_options = elgg_get_config('group_tool_options'); +if ($tool_options) { + foreach ($tool_options as $group_option) { + $option_toggle_name = $group_option->name . "_enable"; + $option_default = $group_option->default_on ? 'yes' : 'no'; + $group->$option_toggle_name = get_input($option_toggle_name, $option_default); + } +} + +// Group membership - should these be treated with same constants as access permissions? +$is_public_membership = (get_input('membership') == ACCESS_PUBLIC); +$group->membership = $is_public_membership ? ACCESS_PUBLIC : ACCESS_PRIVATE; + +if ($is_new_group) { + $group->access_id = ACCESS_PUBLIC; +} + +$old_owner_guid = $is_new_group ? 0 : $group->owner_guid; +$new_owner_guid = (int) get_input('owner_guid'); + +$owner_has_changed = false; +$old_icontime = null; +if (!$is_new_group && $new_owner_guid && $new_owner_guid != $old_owner_guid) { + // verify new owner is member and old owner/admin is logged in + if (is_group_member($group_guid, $new_owner_guid) && ($old_owner_guid == $user->guid || $user->isAdmin())) { + $group->owner_guid = $new_owner_guid; + $group->container_guid = $new_owner_guid; + + $metadata = elgg_get_metadata(array( + 'guid' => $group_guid, + 'limit' => false, + )); + if ($metadata) { + foreach ($metadata as $md) { + if ($md->owner_guid == $old_owner_guid) { + $md->owner_guid = $new_owner_guid; + $md->save(); + } + } + } + + // @todo Remove this when #4683 fixed + $owner_has_changed = true; + $old_icontime = $group->icontime; + } +} + +$must_move_icons = ($owner_has_changed && $old_icontime); + +$group->save(); + +// Invisible group support +// @todo this requires save to be called to create the acl for the group. This +// is an odd requirement and should be removed. Either the acl creation happens +// in the action or the visibility moves to a plugin hook +if (elgg_get_plugin_setting('hidden_groups', 'groups') == 'yes') { + $visibility = (int)get_input('vis', '', false); + if ($visibility != ACCESS_PUBLIC && $visibility != ACCESS_LOGGED_IN) { + $visibility = $group->group_acl; + } + + if ($group->access_id != $visibility) { + $group->access_id = $visibility; + } +} + +$group->save(); + +// group saved so clear sticky form +elgg_clear_sticky_form('groups'); + +// group creator needs to be member of new group and river entry created +if ($is_new_group) { + + // @todo this should not be necessary... + elgg_set_page_owner_guid($group->guid); + + $group->join($user); + add_to_river('river/group/create', 'create', $user->guid, $group->guid, $group->access_id); +} + +$has_uploaded_icon = (!empty($_FILES['icon']['type']) && substr_count($_FILES['icon']['type'], 'image/')); + +if ($has_uploaded_icon) { + + $icon_sizes = elgg_get_config('icon_sizes'); + + $prefix = "groups/" . $group->guid; + + $filehandler = new ElggFile(); + $filehandler->owner_guid = $group->owner_guid; + $filehandler->setFilename($prefix . ".jpg"); + $filehandler->open("write"); + $filehandler->write(get_uploaded_file('icon')); + $filehandler->close(); + $filename = $filehandler->getFilenameOnFilestore(); + + $sizes = array('tiny', 'small', 'medium', 'large'); + + $thumbs = array(); + foreach ($sizes as $size) { + $thumbs[$size] = get_resized_image_from_existing_file( + $filename, + $icon_sizes[$size]['w'], + $icon_sizes[$size]['h'], + $icon_sizes[$size]['square'] + ); + } + + if ($thumbs['tiny']) { // just checking if resize successful + $thumb = new ElggFile(); + $thumb->owner_guid = $group->owner_guid; + $thumb->setMimeType('image/jpeg'); + + foreach ($sizes as $size) { + $thumb->setFilename("{$prefix}{$size}.jpg"); + $thumb->open("write"); + $thumb->write($thumbs[$size]); + $thumb->close(); + } + + $group->icontime = time(); + } +} + +// @todo Remove this when #4683 fixed +if ($must_move_icons) { + $filehandler = new ElggFile(); + $filehandler->setFilename('groups'); + $filehandler->owner_guid = $old_owner_guid; + $old_path = $filehandler->getFilenameOnFilestore(); + + $sizes = array('', 'tiny', 'small', 'medium', 'large'); + + if ($has_uploaded_icon) { + // delete those under old owner + foreach ($sizes as $size) { + unlink("$old_path/{$group_guid}{$size}.jpg"); + } + } else { + // move existing to new owner + $filehandler->owner_guid = $group->owner_guid; + $new_path = $filehandler->getFilenameOnFilestore(); + + foreach ($sizes as $size) { + rename("$old_path/{$group_guid}{$size}.jpg", "$new_path/{$group_guid}{$size}.jpg"); + } + } +} + +system_message(elgg_echo("groups:saved")); + +forward($group->getUrl()); diff --git a/mod/groups/actions/groups/featured.php b/mod/groups/actions/groups/featured.php new file mode 100644 index 000000000..4cb9f8122 --- /dev/null +++ b/mod/groups/actions/groups/featured.php @@ -0,0 +1,27 @@ +<?php +/** + * Feature a group + * + * @package ElggGroups + */ + +$group_guid = get_input('group_guid'); +$action = get_input('action_type'); + +$group = get_entity($group_guid); + +if (!elgg_instanceof($group, 'group')) { + register_error(elgg_echo('groups:featured_error')); + forward(REFERER); +} + +//get the action, is it to feature or unfeature +if ($action == "feature") { + $group->featured_group = "yes"; + system_message(elgg_echo('groups:featuredon', array($group->name))); +} else { + $group->featured_group = "no"; + system_message(elgg_echo('groups:unfeatured', array($group->name))); +} + +forward(REFERER); diff --git a/mod/groups/actions/groups/membership/add.php b/mod/groups/actions/groups/membership/add.php new file mode 100644 index 000000000..de0cba613 --- /dev/null +++ b/mod/groups/actions/groups/membership/add.php @@ -0,0 +1,42 @@ +<?php +/** + * Add users to a group + * + * @package ElggGroups + */ +$logged_in_user = elgg_get_logged_in_user_entity(); + +$user_guid = get_input('user_guid'); +if (!is_array($user_guid)) { + $user_guid = array($user_guid); +} +$group_guid = get_input('group_guid'); +$group = get_entity($group_guid); + +if (sizeof($user_guid)) { + foreach ($user_guid as $u_id) { + $user = get_user($u_id); + + if ($user && $group && $group->canEdit()) { + if (!$group->isMember($user)) { + if (groups_join_group($group, $user)) { + + // send welcome email to user + notify_user($user->getGUID(), $group->owner_guid, + elgg_echo('groups:welcome:subject', array($group->name)), + elgg_echo('groups:welcome:body', array( + $user->name, + $group->name, + $group->getURL()) + )); + + system_message(elgg_echo('groups:addedtogroup')); + } else { + // huh + } + } + } + } +} + +forward(REFERER); diff --git a/mod/groups/actions/groupskillinvitation.php b/mod/groups/actions/groups/membership/delete_invite.php index 516490bc9..d21aa0309 100644 --- a/mod/groups/actions/groupskillinvitation.php +++ b/mod/groups/actions/groups/membership/delete_invite.php @@ -1,6 +1,6 @@ <?php /** - * Delete an invitation to join a closed group. + * Delete an invitation to join a group. * * @package ElggGroups */ @@ -9,7 +9,11 @@ $user_guid = get_input('user_guid', elgg_get_logged_in_user_guid()); $group_guid = get_input('group_guid'); $user = get_entity($user_guid); + +// invisible groups require overriding access to delete invite +$old_access = elgg_set_ignore_access(true); $group = get_entity($group_guid); +elgg_set_ignore_access($old_access); // If join request made if (check_entity_relationship($group->guid, 'invited', $user->guid)) { diff --git a/mod/groups/actions/groupskillrequest.php b/mod/groups/actions/groups/membership/delete_request.php index 9d45bb25f..883c9d748 100644 --- a/mod/groups/actions/groupskillrequest.php +++ b/mod/groups/actions/groups/membership/delete_request.php @@ -1,6 +1,6 @@ <?php /** - * Delete a user request to join a closed group. + * Delete a request to join a closed group. * * @package ElggGroups */ diff --git a/mod/groups/actions/groups/membership/invite.php b/mod/groups/actions/groups/membership/invite.php new file mode 100644 index 000000000..a96165b0e --- /dev/null +++ b/mod/groups/actions/groups/membership/invite.php @@ -0,0 +1,56 @@ +<?php +/** + * Invite users to join a group + * + * @package ElggGroups + */ + +$logged_in_user = elgg_get_logged_in_user_entity(); + +$user_guids = get_input('user_guid'); +if (!is_array($user_guids)) { + $user_guids = array($user_guids); +} +$group_guid = get_input('group_guid'); +$group = get_entity($group_guid); + +if (count($user_guids) > 0 && elgg_instanceof($group, 'group') && $group->canEdit()) { + foreach ($user_guids as $guid) { + $user = get_user($guid); + if (!$user) { + continue; + } + + if (check_entity_relationship($group->guid, 'invited', $user->guid)) { + register_error(elgg_echo("groups:useralreadyinvited")); + continue; + } + + if (check_entity_relationship($user->guid, 'member', $group->guid)) { + // @todo add error message + continue; + } + + // Create relationship + add_entity_relationship($group->guid, 'invited', $user->guid); + + // Send notification + $url = elgg_normalize_url("groups/invitations/$user->username"); + $result = notify_user($user->getGUID(), $group->owner_guid, + elgg_echo('groups:invite:subject', array($user->name, $group->name)), + elgg_echo('groups:invite:body', array( + $user->name, + $logged_in_user->name, + $group->name, + $url, + )), + NULL); + if ($result) { + system_message(elgg_echo("groups:userinvited")); + } else { + register_error(elgg_echo("groups:usernotinvited")); + } + } +} + +forward(REFERER); diff --git a/mod/groups/actions/groups/membership/join.php b/mod/groups/actions/groups/membership/join.php new file mode 100644 index 000000000..b4f4e280c --- /dev/null +++ b/mod/groups/actions/groups/membership/join.php @@ -0,0 +1,72 @@ +<?php +/** + * Join a group + * + * Three states: + * open group so user joins + * closed group so request sent to group owner + * closed group with invite so user joins + * + * @package ElggGroups + */ + +global $CONFIG; + +$user_guid = get_input('user_guid', elgg_get_logged_in_user_guid()); +$group_guid = get_input('group_guid'); + +$user = get_entity($user_guid); + +// access bypass for getting invisible group +$ia = elgg_set_ignore_access(true); +$group = get_entity($group_guid); +elgg_set_ignore_access($ia); + +if (($user instanceof ElggUser) && ($group instanceof ElggGroup)) { + + // join or request + $join = false; + if ($group->isPublicMembership() || $group->canEdit($user->guid)) { + // anyone can join public groups and admins can join any group + $join = true; + } else { + if (check_entity_relationship($group->guid, 'invited', $user->guid)) { + // user has invite to closed group + $join = true; + } + } + + if ($join) { + if (groups_join_group($group, $user)) { + system_message(elgg_echo("groups:joined")); + forward($group->getURL()); + } else { + register_error(elgg_echo("groups:cantjoin")); + } + } else { + add_entity_relationship($user->guid, 'membership_request', $group->guid); + + // Notify group owner + $url = "{$CONFIG->url}groups/requests/$group->guid"; + $subject = elgg_echo('groups:request:subject', array( + $user->name, + $group->name, + )); + $body = elgg_echo('groups:request:body', array( + $group->getOwnerEntity()->name, + $user->name, + $group->name, + $user->getURL(), + $url, + )); + if (notify_user($group->owner_guid, $user->getGUID(), $subject, $body)) { + system_message(elgg_echo("groups:joinrequestmade")); + } else { + register_error(elgg_echo("groups:joinrequestnotmade")); + } + } +} else { + register_error(elgg_echo("groups:cantjoin")); +} + +forward(REFERER); diff --git a/mod/groups/actions/leave.php b/mod/groups/actions/groups/membership/leave.php index 390870df1..4f34c7dde 100644 --- a/mod/groups/actions/leave.php +++ b/mod/groups/actions/groups/membership/leave.php @@ -17,7 +17,7 @@ if (!$user_guid) { $group = get_entity($group_guid); -set_page_owner($group->guid); +elgg_set_page_owner_guid($group->guid); if (($user instanceof ElggUser) && ($group instanceof ElggGroup)) { if ($group->getOwnerGUID() != elgg_get_logged_in_user_guid()) { diff --git a/mod/groups/actions/groups/membership/remove.php b/mod/groups/actions/groups/membership/remove.php new file mode 100644 index 000000000..650d35286 --- /dev/null +++ b/mod/groups/actions/groups/membership/remove.php @@ -0,0 +1,31 @@ +<?php +/** + * Remove a user from a group + * + * @package ElggGroups + */ + +$user_guid = get_input('user_guid'); +$group_guid = get_input('group_guid'); + +$user = get_entity($user_guid); +$group = get_entity($group_guid); + +elgg_set_page_owner_guid($group->guid); + +if (($user instanceof ElggUser) && ($group instanceof ElggGroup) && $group->canEdit()) { + // Don't allow removing group owner + if ($group->getOwnerGUID() != $user->getGUID()) { + if ($group->leave($user)) { + system_message(elgg_echo("groups:removed", array($user->name))); + } else { + register_error(elgg_echo("groups:cantremove")); + } + } else { + register_error(elgg_echo("groups:cantremove")); + } +} else { + register_error(elgg_echo("groups:cantremove")); +} + +forward(REFERER); diff --git a/mod/groups/actions/invite.php b/mod/groups/actions/invite.php deleted file mode 100644 index 1f8281071..000000000 --- a/mod/groups/actions/invite.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php -/** - * Invite a user to join a group - * - * @package ElggGroups - */ - -$logged_in_user = elgg_get_logged_in_user_entity(); - -$user_guid = get_input('user_guid'); -if (!is_array($user_guid)) { - $user_guid = array($user_guid); -} -$group_guid = get_input('group_guid'); - -if (sizeof($user_guid)) { - foreach ($user_guid as $u_id) { - $user = get_entity($u_id); - $group = get_entity($group_guid); - - if ( $user && $group) { - - if (($group instanceof ElggGroup) && ($group->canEdit())) { - if (!check_entity_relationship($group->guid, 'invited', $user->guid)) { - if ($user->isFriend()) { - - // Create relationship - add_entity_relationship($group->guid, 'invited', $user->guid); - - // Send email - $url = elgg_normalize_url("pg/groups/invitations/$user->username"); - $result = notify_user($user->getGUID(), $group->owner_guid, - elgg_echo('groups:invite:subject', array($user->name, $group->name)), - elgg_echo('groups:invite:body', array($user->name, $logged_in_user->name, $group->name, $url)), - NULL); - if ($result) { - system_message(elgg_echo("groups:userinvited")); - } else { - register_error(elgg_echo("groups:usernotinvited")); - } - } else { - register_error(elgg_echo("groups:usernotinvited")); - } - } else { - register_error(elgg_echo("groups:useralreadyinvited")); - } - } else { - register_error(elgg_echo("groups:notowner")); - } - } - } -} - -forward(REFERER); diff --git a/mod/groups/actions/join.php b/mod/groups/actions/join.php deleted file mode 100644 index 72294c3ad..000000000 --- a/mod/groups/actions/join.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php -/** - * Join a group action. - * - * @package ElggGroups - */ - -$user_guid = get_input('user_guid', elgg_get_logged_in_user_guid()); -$group_guid = get_input('group_guid'); - -// @todo fix for #287 -// disable access to get entity. -$invitations = groups_get_invited_groups($user_guid, TRUE); - -if (in_array($group_guid, $invitations)) { - $ia = elgg_set_ignore_access(TRUE); -} - -$user = get_entity($user_guid); -$group = get_entity($group_guid); - -set_page_owner($group->guid); - -if (($user instanceof ElggUser) && ($group instanceof ElggGroup)) { - if ($group->isPublicMembership() || $group->canEdit($user->guid)) { - if ($group->join($user)) { - system_message(elgg_echo("groups:joined")); - - // Remove any invite or join request flags - remove_entity_relationship($group->guid, 'invited', $user->guid); - remove_entity_relationship($user->guid, 'membership_request', $group->guid); - - // add to river - add_to_river('river/relationship/member/create','join',$user->guid,$group->guid); - - forward($group->getURL()); - } else { - register_error(elgg_echo("groups:cantjoin")); - } - } else { - // Closed group, request membership - system_message(elgg_echo('groups:privategroup')); - forward(elgg_add_action_tokens_to_url("action/groups/joinrequest?user_guid=$user_guid&group_guid=$group_guid", FALSE)); - } -} else { - register_error(elgg_echo("groups:cantjoin")); -} - -forward(REFERER); - diff --git a/mod/groups/actions/joinrequest.php b/mod/groups/actions/joinrequest.php deleted file mode 100644 index 1631712b6..000000000 --- a/mod/groups/actions/joinrequest.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * User requests to join a closed group. - * - * @package ElggGroups - */ - -$user_guid = get_input('user_guid', elgg_get_logged_in_user_guid()); -$group_guid = get_input('group_guid'); - - -// @todo fix for #287 -// disable access to get entity. -$invitations = groups_get_invited_groups($user_guid, TRUE); - -if (in_array($group_guid, $invitations)) { - $ia = elgg_set_ignore_access(TRUE); -} - - -$user = get_entity($user_guid); -$group = get_entity($group_guid); - -set_page_owner($group->guid); - -// If not a member of this group -if (($group) && ($user) && (!$group->isMember($user))) { - // If open group or invite exists - if ( - ($group->isPublicMembership()) || - (check_entity_relationship($group->guid, 'invited', $user->guid)) - ) { - //$ia = elgg_set_ignore_access(TRUE); - if ($group->join($user)) { - // Remove relationships - remove_entity_relationship($group->guid, 'invited', $user->guid); - remove_entity_relationship($user->guid, 'membership_request', $group->guid); - - // Group joined - system_message(elgg_echo('groups:joined')); - elgg_set_ignore_access($ia); - - forward($group->getURL()); - } else { - elgg_set_ignore_access($ia); - system_message(elgg_echo('groups:cantjoin')); - } - } else { - // If join request not already made - if (!check_entity_relationship($user->guid, 'membership_request', $group->guid)) { - // Add membership requested - add_entity_relationship($user->guid, 'membership_request', $group->guid); - - // Send email - $url = elgg_normalize_url("mod/groups/membershipreq.php?group_guid={$group->guid}"); - if (notify_user($group->owner_guid, $user->getGUID(), - elgg_echo('groups:request:subject', array($user->name, $group->name)), - elgg_echo('groups:request:body', array($group->getOwnerEntity()->name, $user->name, $group->name, $user->getURL(), $url)), - NULL)) { - system_message(elgg_echo("groups:joinrequestmade")); - } else { - register_error(elgg_echo("groups:joinrequestnotmade")); - } - } else { - system_message(elgg_echo("groups:joinrequestmade")); - } - } -} - -forward(REFERER);
\ No newline at end of file |
