From 9e047bce2e2f5523c164aa2e09a12dfb3a206091 Mon Sep 17 00:00:00 2001 From: marcus Date: Tue, 1 Jul 2008 13:31:07 +0000 Subject: Group class, refs #106 git-svn-id: https://code.elgg.org/elgg/trunk@1231 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/group.php | 383 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 378 insertions(+), 5 deletions(-) (limited to 'engine/lib/group.php') diff --git a/engine/lib/group.php b/engine/lib/group.php index b6e17e2e4..b88c8ee94 100644 --- a/engine/lib/group.php +++ b/engine/lib/group.php @@ -21,24 +21,397 @@ protected function initialise_attributes() { initialise_entity_cache(); + + $this->attributes['type'] = "group"; + $this->attributes['name'] = ""; + $this->attributes['description'] = ""; + $this->attributes['tables_split'] = 2; } + /** + * Construct a new user entity, optionally from a given id value. + * + * @param mixed $guid If an int, load that GUID. + * If a db row then will attempt to load the rest of the data. + * @throws Exception if there was a problem creating the user. + */ + function __construct($guid = null) + { + $this->initialise_attributes(); + + if (!empty($guid)) + { + // Is $guid is a DB row - either a entity row, or a user table row. + if ($guid instanceof stdClass) { + // Load the rest + if (!$this->load($guid->guid)) + throw new IOException(sprintf(elgg_echo('IOException:FailedToLoadGUID'), get_class(), $guid->guid)); + } + + // Is $guid is an ElggGroup? Use a copy constructor + else if ($guid instanceof ElggGroup) + { + foreach ($guid->attributes as $key => $value) + $this->attributes[$key] = $value; + } + + // Is this is an ElggEntity but not an ElggGroup = ERROR! + else if ($guid instanceof ElggEntity) + throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonElggGroup')); + + // We assume if we have got this far, $guid is an int + else if (is_numeric($guid)) { + if (!$this->load($guid)) IOException(sprintf(elgg_echo('IOException:FailedToLoadGUID'), get_class(), $guid)); + } + + else + throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnrecognisedValue')); + } + } + + /** + * Class member get overloading + * + * @param string $name + * @return mixed + */ + function __get($name) { return $this->get($name); } + + /** + * Class member set overloading + * + * @param string $name + * @param mixed $value + * @return mixed + */ + function __set($name, $value) { return $this->set($name, $value); } + + /** + * Add an ElggObject to this group. + * + * @param ElggObject $object The object. + * @return bool + */ + public function addObjectToGroup(ElggObject $object) + { + return add_object_to_group($this->getGUID(), $object->getGUID()); + } + + /** + * Remove an object from the containing group. + * + * @param int $guid The guid of the object. + * @return bool + */ + public function removeObjectFromGroup($guid) + { + return remove_object_from_group($this->getGUID(), $guid); + } + + /** + * Get objects contained in this group. + * + * @param int $limit + * @param int $offset + * @param string $subtype + * @param int $owner_guid + * @param int $site_guid + * @param string $order_by + * @return mixed + */ + public function getObjects($limit = 10, $offset = 0, $subtype = "", $owner_guid = 0, $site_guid = 0, $order_by = "") + { + return get_objects_in_group($this->getGUID(), $subtype, $owner_guid, $site_guid, $order_by, $limit, $offset, false); + } + + /** + * Delete this group. + */ + public function delete() + { + if (!parent::delete()) + return false; + + return delete_group_entity($this->get('guid')); + } + + + /** + * Override the load function. + * This function will ensure that all data is loaded (were possible), so + * if only part of the ElggGroup is loaded, it'll load the rest. + * + * @param int $guid + */ + protected function load($guid) + { + // Test to see if we have the generic stuff + if (!parent::load($guid)) + return false; + + // Check the type + if ($this->attributes['type']!='group') + throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $guid, get_class())); + + // Load missing data + $row = get_group_entity_as_row($guid); + if (($row) && (!$this->isFullyLoaded())) $this->attributes['tables_loaded'] ++; // If $row isn't a cached copy then increment the counter + + // Now put these into the attributes array as core values + $objarray = (array) $row; + foreach($objarray as $key => $value) + $this->attributes[$key] = $value; + + return true; + } + + /** + * Override the save function. + */ + public function save() + { + // Save generic stuff + if (!parent::save()) + return false; + + // Now save specific stuff + return create_group_entity($this->get('guid'), $this->get('name'), $this->get('description')); + } + } + + /** + * Get the group entity. + * + * @param int $guid + */ + function get_group_entity_as_row($guid) + { + global $CONFIG; + + $guid = (int)$guid; + + $row = retrieve_cached_entity_row($guid); + if ($row) + { + // We have already cached this object, so retrieve its value from the cache + if (isset($CONFIG->debug) && $CONFIG->debug) + error_log("** Retrieving sub part of GUID:$guid from cache"); + + return $row; + } + else + { + // Object not cached, load it. + if (isset($CONFIG->debug) && $CONFIG->debug == true) + error_log("** Sub part of GUID:$guid loaded from DB"); + + return get_data_row("SELECT * from {$CONFIG->dbprefix}groups_entity where guid=$guid"); + } + } + + /** + * Create or update the extras table for a given group. + * Call create_entity first. + * + * @param int $guid + * @param string $name + * @param string $description + */ + 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 + if ($exists = get_data_row("select guid from {$CONFIG->dbprefix}groups_entity where guid = {$guid}")) { + $result = update_data("UPDATE {$CONFIG->dbprefix}groups_entity set name='$name', description='$description' where guid=$guid"); + if ($result!=false) + { + // Update succeeded, continue + $entity = get_entity($guid); + if (trigger_elgg_event('update',$entity->type,$entity)) { + return true; + } else { + delete_entity($guid); + } + } + } + else + { + // Update failed, attempt an insert. + $result = insert_data("INSERT into {$CONFIG->dbprefix}groups_entity (guid, name, description) values ($guid, '$name','$description')"); + if ($result!==false) { + $entity = get_entity($guid); + if (trigger_elgg_event('create',$entity->type,$entity)) { + return true; + } else { + delete_entity($guid); + } + } + } + } + return false; + } + + /** + * Delete a group's extra data. + * + * @param int $guid The guid of the group + * @return bool + */ + function delete_group_entity($guid) + { + global $CONFIG; + + $guid = (int)$guid; + + $row = get_entity_as_row($guid); + + // Check to see if we have access and it exists + if ($row) + { + // Delete any existing stuff + return delete_data("DELETE from {$CONFIG->dbprefix}groups_entity where guid=$guid"); + } + + 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 + */ + function add_object_to_group($group_guid, $object_guid) + { + $group_guid = (int)$group_guid; + $object_guid = (int)$object_guid; - // add to container + $group = get_entity($group_guid); + $object = get_entity($object_guid); - // remove from container + if ((!$group) || (!$object)) return false; + if (!($group instanceof ElggGroup)) + throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $group_guid, 'ElggGroup')); + + if (!($object instanceof ElggObject)) + throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $object_guid, 'ElggObject')); + + $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 + */ + function remove_object_from_group($group_guid, $object_guid) + { + $group_guid = (int)$group_guid; + $object_guid = (int)$object_guid; - // get contained objects (type, subtype, limit, offset) + $group = get_entity($group_guid); + $object = get_entity($object_guid); + if ((!$group) || (!$object)) return false; + if (!($group instanceof ElggGroup)) + throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $group_guid, 'ElggGroup')); + + if (!($object instanceof ElggObject)) + throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $object_guid, 'ElggObject')); + + $object->container_guid = $object->owner_guid; + return $object->save(); + } + + /** + * Return an array of objects in a given container. + * @see get_entities() + * + * @param int $group_guid The container (defaults to current page owner) + * @param string $subtype The subtype + * @param int $owner_guid Owner + * @param int $site_guid The site + * @param string $order_by Order + * @param unknown_type $limit Limit on number of elements to return, by default 10. + * @param unknown_type $offset Where to start, by default 0. + * @param unknown_type $count Whether to return the entities or a count of them. + */ + function get_objects_in_group($group_id, $subtype = "", $owner_guid = 0, $site_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false) + { + global $CONFIG; + if ($subtype === false || $subtype === null || $subtype === 0) + return false; + + $subtype = get_subtype_id('object', $subtype); + if ($order_by == "") $order_by = "e.time_created desc"; + $order_by = sanitise_string($order_by); + $limit = (int)$limit; + $offset = (int)$offset; + $site_guid = (int) $site_guid; + if ($site_guid == 0) + $site_guid = $CONFIG->site_guid; + $container_guid = (int)$group_guid; + if ($container_guid == 0) + $container_guid = page_owner(); + + $where = array(); - // load + $where[] = "e.type='object'"; + if ($subtype!=="") + $where[] = "e.subtype=$subtype"; + if ($owner_guid != "") { + if (!is_array($owner_guid)) { + $owner_guid = (int) $owner_guid; + $where[] = "e.owner_guid = '$owner_guid'"; + } else if (sizeof($owner_guid) > 0) { + // Cast every element to the owner_guid array to int + $owner_guid = array_map("sanitise_int", $owner_guid); + $owner_guid = implode(",",$owner_guid); + $where[] = "e.owner_guid in ({$owner_guid})"; + } + } + if ($site_guid > 0) + $where[] = "e.site_guid = {$site_guid}"; + + if ($container_guid > 0) + $where[] = "o.container_guid = {$container_guid}"; + + if (!$count) { + $query = "SELECT * from {$CONFIG->dbprefix}entities e join {$CONFIG->dbprefix}objects_entity o on e.guid=o.guid where "; + } else { + $query = "select count(e.guid) as total from {$CONFIG->dbprefix}entities e join {$CONFIG->dbprefix}objects_entity o on e.guid=o.guid where "; + } + foreach ($where as $w) + $query .= " $w and "; + $query .= get_access_sql_suffix('e'); // Add access controls + if (!$count) { + $query .= " order by $order_by"; + if ($limit) $query .= " limit $offset, $limit"; // Add order and limit + + $dt = get_data($query, "entity_row_to_elggstar"); + return $dt; + } else { + $total = get_data_row($query); + return $total->total; + } - //save } ?> \ No newline at end of file -- cgit v1.2.3