aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/group.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib/group.php')
-rw-r--r--engine/lib/group.php341
1 files changed, 341 insertions, 0 deletions
diff --git a/engine/lib/group.php b/engine/lib/group.php
new file mode 100644
index 000000000..6ded8a825
--- /dev/null
+++ b/engine/lib/group.php
@@ -0,0 +1,341 @@
+<?php
+/**
+ * Elgg Groups.
+ * Groups contain other entities, or rather act as a placeholder for other entities to
+ * mark any given container as their container.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Group
+ */
+
+/**
+ * Get the group entity.
+ *
+ * @param int $guid GUID for a group
+ *
+ * @return array|false
+ * @access private
+ */
+function get_group_entity_as_row($guid) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}groups_entity where guid=$guid");
+}
+
+/**
+ * Create or update the entities table for a given group.
+ * Call create_entity first.
+ *
+ * @param int $guid GUID
+ * @param string $name Name
+ * @param string $description Description
+ *
+ * @return bool
+ * @access private
+ */
+function create_group_entity($guid, $name, $description) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ $name = sanitise_string($name);
+ $description = sanitise_string($description);
+
+ $row = get_entity_as_row($guid);
+
+ if ($row) {
+ // Exists and you have access to it
+ $exists = get_data_row("SELECT guid from {$CONFIG->dbprefix}groups_entity WHERE guid = {$guid}");
+ if ($exists) {
+ $query = "UPDATE {$CONFIG->dbprefix}groups_entity set"
+ . " name='$name', description='$description' where guid=$guid";
+ $result = update_data($query);
+ if ($result != false) {
+ // Update succeeded, continue
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('update', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ } else {
+ // Update failed, attempt an insert.
+ $query = "INSERT into {$CONFIG->dbprefix}groups_entity"
+ . " (guid, name, description) values ($guid, '$name', '$description')";
+
+ $result = insert_data($query);
+ if ($result !== false) {
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('create', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Add an object to the given group.
+ *
+ * @param int $group_guid The group to add the object to.
+ * @param int $object_guid The guid of the elgg object (must be ElggObject or a child thereof)
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+function add_object_to_group($group_guid, $object_guid) {
+ $group_guid = (int)$group_guid;
+ $object_guid = (int)$object_guid;
+
+ $group = get_entity($group_guid);
+ $object = get_entity($object_guid);
+
+ if ((!$group) || (!$object)) {
+ return false;
+ }
+
+ if (!($group instanceof ElggGroup)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($group_guid, 'ElggGroup'));
+ throw new InvalidClassException($msg);
+ }
+
+ if (!($object instanceof ElggObject)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($object_guid, 'ElggObject'));
+ throw new InvalidClassException($msg);
+ }
+
+ $object->container_guid = $group_guid;
+ return $object->save();
+}
+
+/**
+ * Remove an object from the given group.
+ *
+ * @param int $group_guid The group to remove the object from
+ * @param int $object_guid The object to remove
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+function remove_object_from_group($group_guid, $object_guid) {
+ $group_guid = (int)$group_guid;
+ $object_guid = (int)$object_guid;
+
+ $group = get_entity($group_guid);
+ $object = get_entity($object_guid);
+
+ if ((!$group) || (!$object)) {
+ return false;
+ }
+
+ if (!($group instanceof ElggGroup)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($group_guid, 'ElggGroup'));
+ throw new InvalidClassException($msg);
+ }
+
+ if (!($object instanceof ElggObject)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($object_guid, 'ElggObject'));
+ throw new InvalidClassException($msg);
+ }
+
+ $object->container_guid = $object->owner_guid;
+ return $object->save();
+}
+
+/**
+ * Return a list of this group's members.
+ *
+ * @param int $group_guid The ID of the container/group.
+ * @param int $limit The limit
+ * @param int $offset The offset
+ * @param int $site_guid The site
+ * @param bool $count Return the users (false) or the count of them (true)
+ *
+ * @return mixed
+ */
+function get_group_members($group_guid, $limit = 10, $offset = 0, $site_guid = 0, $count = false) {
+
+ // in 1.7 0 means "not set." rewrite to make sense.
+ if (!$site_guid) {
+ $site_guid = ELGG_ENTITIES_ANY_VALUE;
+ }
+
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'member',
+ 'relationship_guid' => $group_guid,
+ 'inverse_relationship' => TRUE,
+ 'type' => 'user',
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'count' => $count,
+ 'site_guid' => $site_guid
+ ));
+}
+
+/**
+ * Return whether a given user is a member of the group or not.
+ *
+ * @param int $group_guid The group ID
+ * @param int $user_guid The user guid
+ *
+ * @return bool
+ */
+function is_group_member($group_guid, $user_guid) {
+ $object = check_entity_relationship($user_guid, 'member', $group_guid);
+ if ($object) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Join a user to a group.
+ *
+ * @param int $group_guid The group GUID.
+ * @param int $user_guid The user GUID.
+ *
+ * @return bool
+ */
+function join_group($group_guid, $user_guid) {
+ $result = add_entity_relationship($user_guid, 'member', $group_guid);
+
+ if ($result) {
+ $params = array('group' => get_entity($group_guid), 'user' => get_entity($user_guid));
+ elgg_trigger_event('join', 'group', $params);
+ }
+
+ return $result;
+}
+
+/**
+ * Remove a user from a group.
+ *
+ * @param int $group_guid The group.
+ * @param int $user_guid The user.
+ *
+ * @return bool
+ */
+function leave_group($group_guid, $user_guid) {
+ // event needs to be triggered while user is still member of group to have access to group acl
+ $params = array('group' => get_entity($group_guid), 'user' => get_entity($user_guid));
+
+ elgg_trigger_event('leave', 'group', $params);
+ $result = remove_entity_relationship($user_guid, 'member', $group_guid);
+ return $result;
+}
+
+/**
+ * Return all groups a user is a member of.
+ *
+ * @param int $user_guid GUID of user
+ *
+ * @return array|false
+ */
+function get_users_membership($user_guid) {
+ $options = array(
+ 'type' => 'group',
+ 'relationship' => 'member',
+ 'relationship_guid' => $user_guid,
+ 'inverse_relationship' => false,
+ 'limit' => false,
+ );
+ return elgg_get_entities_from_relationship($options);
+}
+
+/**
+ * May the current user access item(s) on this page? If the page owner is a group,
+ * membership, visibility, and logged in status are taken into account.
+ *
+ * @param boolean $forward If set to true (default), will forward the page;
+ * if set to false, will return true or false.
+ *
+ * @return bool If $forward is set to false.
+ */
+function group_gatekeeper($forward = true) {
+
+ $page_owner_guid = elgg_get_page_owner_guid();
+ if (!$page_owner_guid) {
+ return true;
+ }
+ $visibility = ElggGroupItemVisibility::factory($page_owner_guid);
+
+ if (!$visibility->shouldHideItems) {
+ return true;
+ }
+ if ($forward) {
+ // only forward to group if user can see it
+ $group = get_entity($page_owner_guid);
+ $forward_url = $group ? $group->getURL() : '';
+
+ if (!elgg_is_logged_in()) {
+ $_SESSION['last_forward_from'] = current_page_url();
+ $forward_reason = 'login';
+ } else {
+ $forward_reason = 'member';
+ }
+
+ register_error(elgg_echo($visibility->reasonHidden));
+ forward($forward_url, $forward_reason);
+ }
+
+ return false;
+}
+
+/**
+ * Adds a group tool option
+ *
+ * @see remove_group_tool_option().
+ *
+ * @param string $name Name of the group tool option
+ * @param string $label Used for the group edit form
+ * @param bool $default_on True if this option should be active by default
+ *
+ * @return void
+ * @since 1.5.0
+ */
+function add_group_tool_option($name, $label, $default_on = true) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->group_tool_options)) {
+ $CONFIG->group_tool_options = array();
+ }
+
+ $group_tool_option = new stdClass;
+
+ $group_tool_option->name = $name;
+ $group_tool_option->label = $label;
+ $group_tool_option->default_on = $default_on;
+
+ $CONFIG->group_tool_options[] = $group_tool_option;
+}
+
+/**
+ * Removes a group tool option based on name
+ *
+ * @see add_group_tool_option()
+ *
+ * @param string $name Name of the group tool option
+ *
+ * @return void
+ * @since 1.7.5
+ */
+function remove_group_tool_option($name) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->group_tool_options)) {
+ return;
+ }
+
+ foreach ($CONFIG->group_tool_options as $i => $option) {
+ if ($option->name == $name) {
+ unset($CONFIG->group_tool_options[$i]);
+ }
+ }
+}