diff options
Diffstat (limited to 'engine/classes/ElggObject.php')
| -rw-r--r-- | engine/classes/ElggObject.php | 192 |
1 files changed, 93 insertions, 99 deletions
diff --git a/engine/classes/ElggObject.php b/engine/classes/ElggObject.php index d19e1c844..aeaa3ba5c 100644 --- a/engine/classes/ElggObject.php +++ b/engine/classes/ElggObject.php @@ -12,20 +12,27 @@ * * @internal Title and description are stored in the objects_entity table. * - * @package Elgg.Core + * @package Elgg.Core * @subpackage DataModel.Object + * + * @property string $title The title, name, or summary of this object + * @property string $description The body, description, or content of the object + * @property array $tags Array of tags that describe the object */ class ElggObject extends ElggEntity { + /** * Initialise the attributes array to include the type, * title, and description. + * + * @return void */ - protected function initialise_attributes() { - parent::initialise_attributes(); + protected function initializeAttributes() { + parent::initializeAttributes(); $this->attributes['type'] = "object"; - $this->attributes['title'] = ""; - $this->attributes['description'] = ""; + $this->attributes['title'] = NULL; + $this->attributes['description'] = NULL; $this->attributes['tables_split'] = 2; } @@ -34,49 +41,47 @@ class ElggObject extends ElggEntity { * * If no arguments are passed, create a new entity. * - * If an argument is passed attempt to load a full Object entity. Arguments - * can be: + * If an argument is passed, attempt to load a full ElggObject entity. + * Arguments can be: * - The GUID of an object entity. - * - A DB result object with a guid property + * - A DB result object from the entities table with a guid property + * + * @param mixed $guid If an int, load that GUID. If a db row, then will attempt to + * load the rest of the data. * - * @param mixed $guid If an int, load that GUID. If a db row then will attempt to load the rest of the data. * @throws IOException If passed an incorrect guid * @throws InvalidParameterException If passed an Elgg* Entity that isn't an ElggObject */ function __construct($guid = null) { - $this->initialise_attributes(); + $this->initializeAttributes(); + + // compatibility for 1.7 api. + $this->initialise_attributes(false); if (!empty($guid)) { - // Is $guid is a DB row - either a entity row, or a object table row. + // Is $guid is a DB row from the entity table if ($guid instanceof stdClass) { // Load the rest - if (!$this->load($guid->guid)) { - throw new IOException(sprintf(elgg_echo('IOException:FailedToLoadGUID'), get_class(), $guid->guid)); + if (!$this->load($guid)) { + $msg = elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid->guid)); + throw new IOException($msg); } - } - - // Is $guid is an ElggObject? Use a copy constructor - else if ($guid instanceof ElggObject) { + } else if ($guid instanceof ElggObject) { + // $guid is an ElggObject so this is a copy constructor elgg_deprecated_notice('This type of usage of the ElggObject constructor was deprecated. Please use the clone method.', 1.7); foreach ($guid->attributes as $key => $value) { $this->attributes[$key] = $value; } - } - - // Is this is an ElggEntity but not an ElggObject = ERROR! - else if ($guid instanceof ElggEntity) { + } else if ($guid instanceof ElggEntity) { + // @todo remove - do not need separate exception throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonElggObject')); - } - - // We assume if we have got this far, $guid is an int - else if (is_numeric($guid)) { + } else if (is_numeric($guid)) { + // $guid is a GUID so load if (!$this->load($guid)) { - throw new IOException(sprintf(elgg_echo('IOException:FailedToLoadGUID'), get_class(), $guid)); + throw new IOException(elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid))); } - } - - else { + } else { throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnrecognisedValue')); } } @@ -85,33 +90,24 @@ class ElggObject extends ElggEntity { /** * Loads the full ElggObject when given a guid. * - * @param int $guid + * @param mixed $guid GUID of an ElggObject or the stdClass object from entities table + * * @return bool * @throws InvalidClassException */ 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']!='object') { - throw new InvalidClassException(sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $guid, get_class())); - } + $attr_loader = new ElggAttributeLoader(get_class(), 'object', $this->attributes); + $attr_loader->requires_access_control = !($this instanceof ElggPlugin); + $attr_loader->secondary_loader = 'get_object_entity_as_row'; - // Load missing data - $row = get_object_entity_as_row($guid); - if (($row) && (!$this->isFullyLoaded())) { - // If $row isn't a cached copy then increment the counter - $this->attributes['tables_loaded'] ++; + $attrs = $attr_loader->getRequiredAttributes($guid); + if (!$attrs) { + return false; } - // Now put these into the attributes array as core values - $objarray = (array) $row; - foreach($objarray as $key => $value) { - $this->attributes[$key] = $value; - } + $this->attributes = $attrs; + $this->attributes['tables_loaded'] = 2; + _elgg_cache_entity($this); return true; } @@ -130,7 +126,12 @@ class ElggObject extends ElggEntity { } // Save ElggObject-specific attributes - return create_object_entity($this->get('guid'), $this->get('title'), $this->get('description'), $this->get('container_guid')); + + _elgg_disable_caching_for_entity($this->guid); + $ret = create_object_entity($this->get('guid'), $this->get('title'), $this->get('description')); + _elgg_enable_caching_for_entity($this->guid); + + return $ret; } /** @@ -138,13 +139,16 @@ class ElggObject extends ElggEntity { * * Site membership is determined by relationships and not site_guid.d * - * @param string $subtype Optionally, the subtype of result we want to limit to - * @param int $limit The number of results to return - * @param int $offset Any indexing offset * @todo This should be moved to ElggEntity * @todo Unimplemented + * + * @param string $subtype Optionally, the subtype of result we want to limit to + * @param int $limit The number of results to return + * @param int $offset Any indexing offset + * + * @return array|false */ - function getSites($subtype="", $limit = 10, $offset = 0) { + function getSites($subtype = "", $limit = 10, $offset = 0) { return get_site_objects($this->getGUID(), $subtype, $limit, $offset); } @@ -152,71 +156,61 @@ class ElggObject extends ElggEntity { * Add this object to a site * * @param int $site_guid The guid of the site to add it to + * * @return bool */ function addToSite($site_guid) { return add_site_object($this->getGUID(), $site_guid); } - /** - * Set the container for this object. - * - * @param int $container_guid The ID of the container. - * @return bool + /* + * EXPORTABLE INTERFACE */ - function setContainer($container_guid) { - $container_guid = (int)$container_guid; - - return $this->set('container_guid', $container_guid); - } /** - * Returns the container GUID of this object. + * Return an array of fields which can be exported. * - * @return int + * @return array */ - function getContainer() { - return $this->get('container_guid'); + public function getExportableValues() { + return array_merge(parent::getExportableValues(), array( + 'title', + 'description', + )); } /** - * Returns the contain entity for this object. + * Can a user comment on this object? * - * @return mixed ElggGroup object or false. + * @see ElggEntity::canComment() + * + * @param int $user_guid User guid (default is logged in user) + * @return bool + * @since 1.8.0 */ - function getContainerEntity() { - $result = get_entity($this->getContainer()); - - if (($result) && ($result instanceof ElggGroup)) { + public function canComment($user_guid = 0) { + $result = parent::canComment($user_guid); + if ($result !== null) { return $result; } - return false; - } + if ($user_guid == 0) { + $user_guid = elgg_get_logged_in_user_guid(); + } - /** - * Get the collections associated with a object. - * - * @param string $subtype Optionally, the subtype of result we want to limit to - * @param int $limit The number of results to return - * @param int $offset Any indexing offset - * @return unknown - */ - //public function getCollections($subtype="", $limit = 10, $offset = 0) { get_object_collections($this->getGUID(), $subtype, $limit, $offset); } + // must be logged in to comment + if (!$user_guid) { + return false; + } - /* - * EXPORTABLE INTERFACE - */ + // must be member of group + if (elgg_instanceof($this->getContainerEntity(), 'group')) { + if (!$this->getContainerEntity()->canWriteToContainer($user_guid)) { + return false; + } + } - /** - * Return an array of fields which can be exported. - * - * @return array - */ - public function getExportableValues() { - return array_merge(parent::getExportableValues(), array( - 'title', - 'description', - )); + // no checks on read access since a user cannot see entities outside his access + return true; } -}
\ No newline at end of file +} |
