/elgg/engine/lib/entities.php
PHP | 3760 lines | 2100 code | 556 blank | 1104 comment | 461 complexity | f5ac119ced48d6b116fc94a607e7b78d MD5 | raw file
Possible License(s): GPL-3.0, GPL-2.0, BSD-3-Clause, LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- <?php
- /**
- * Elgg entities.
- * Functions to manage all elgg entities (sites, groups, objects and users).
- *
- * @package Elgg
- * @subpackage Core
- */
- /// Cache objects in order to minimise database access.
- global $ENTITY_CACHE;
- $ENTITY_CACHE = NULL;
- /// Cache subtype searches
- global $SUBTYPE_CACHE;
- $SUBTYPE_CACHE = NULL;
- /// Require the locatable interface
- // @todo Move this into start.php?
- require_once('location.php');
- /**
- * ElggEntity The elgg entity superclass
- * This class holds methods for accessing the main entities table.
- *
- * @package Elgg
- * @subpackage Core
- */
- abstract class ElggEntity implements
- Notable, // Calendar interface
- Locatable, // Geocoding interface
- Exportable, // Allow export of data
- Importable, // Allow import of data
- Loggable, // Can events related to this object class be logged
- Iterator, // Override foreach behaviour
- ArrayAccess // Override for array access
- {
- /**
- * The main attributes of an entity.
- * Blank entries for all database fields should be created by the constructor.
- * Subclasses should add to this in their constructors.
- * Any field not appearing in this will be viewed as a
- */
- protected $attributes;
- /**
- * If set, overrides the value of getURL()
- */
- protected $url_override;
- /**
- * Icon override, overrides the value of getIcon().
- */
- protected $icon_override;
- /**
- * Temporary cache for metadata, permitting meta data access before a guid has obtained.
- */
- protected $temp_metadata;
- /**
- * Temporary cache for annotations, permitting meta data access before a guid has obtained.
- */
- protected $temp_annotations;
- /**
- * Volatile data structure for this object, allows for storage of data
- * in-memory that isn't sync'd back to the metadata table.
- */
- protected $volatile;
- /**
- * Initialise the attributes array.
- * This is vital to distinguish between metadata and base parameters.
- *
- * Place your base parameters here.
- *
- * @return void
- */
- protected function initialise_attributes() {
- initialise_entity_cache();
- // Create attributes array if not already created
- if (!is_array($this->attributes)) {
- $this->attributes = array();
- }
- if (!is_array($this->temp_metadata)) {
- $this->temp_metadata = array();
- }
- if (!is_array($this->temp_annotations)) {
- $this->temp_annotations = array();
- }
- if (!is_array($this->volatile)) {
- $this->volatile = array();
- }
- $this->attributes['guid'] = "";
- $this->attributes['type'] = "";
- $this->attributes['subtype'] = "";
- $this->attributes['owner_guid'] = get_loggedin_userid();
- $this->attributes['container_guid'] = get_loggedin_userid();
- $this->attributes['site_guid'] = 0;
- $this->attributes['access_id'] = ACCESS_PRIVATE;
- $this->attributes['time_created'] = "";
- $this->attributes['time_updated'] = "";
- $this->attributes['last_action'] = '';
- $this->attributes['enabled'] = "yes";
- // There now follows a bit of a hack
- /* Problem: To speed things up, some objects are split over several tables, this means that it requires
- * n number of database reads to fully populate an entity. This causes problems for caching and create events
- * since it is not possible to tell whether a subclassed entity is complete.
- * Solution: We have two counters, one 'tables_split' which tells whatever is interested how many tables
- * are going to need to be searched in order to fully populate this object, and 'tables_loaded' which is how
- * many have been loaded thus far.
- * If the two are the same then this object is complete.
- *
- * Use: isFullyLoaded() to check
- */
- $this->attributes['tables_split'] = 1;
- $this->attributes['tables_loaded'] = 0;
- }
- /**
- * Clone an entity
- *
- * Resets the guid so that the entity can be saved as a distinct entity from
- * the original. Creation time will be set when this new entity is saved.
- * The owner and container guids come from the original entity. The clone
- * method copies metadata but does not copy over annotations, or private settings.
- *
- * Note: metadata will have its owner and access id set when the entity is saved
- * and it will be the same as that of the entity.
- */
- public function __clone() {
- $orig_entity = get_entity($this->guid);
- if (!$orig_entity) {
- elgg_log("Failed to clone entity with GUID $this->guid", "ERROR");
- return;
- }
- $metadata_array = get_metadata_for_entity($this->guid);
- $this->attributes['guid'] = "";
- $this->attributes['subtype'] = $orig_entity->getSubtype();
- // copy metadata over to new entity - slightly convoluted due to
- // handling of metadata arrays
- if (is_array($metadata_array)) {
- // create list of metadata names
- $metadata_names = array();
- foreach ($metadata_array as $metadata) {
- $metadata_names[] = $metadata['name'];
- }
- // arrays are stored with multiple enties per name
- $metadata_names = array_unique($metadata_names);
- // move the metadata over
- foreach ($metadata_names as $name) {
- $this->set($name, $orig_entity->$name);
- }
- }
- }
- /**
- * Return the value of a given key.
- * If $name is a key field (as defined in $this->attributes) that value is returned, otherwise it will
- * then look to see if the value is in this object's metadata.
- *
- * Q: Why are we not using __get overload here?
- * A: Because overload operators cause problems during subclassing, so we put the code here and
- * create overloads in subclasses.
- *
- * subtype is returned as an id rather than the subtype string. Use getSubtype()
- * to get the subtype string.
- *
- * @param string $name
- * @return mixed Returns the value of a given value, or null.
- */
- public function get($name) {
- // See if its in our base attribute
- if (isset($this->attributes[$name])) {
- return $this->attributes[$name];
- }
- // No, so see if its in the meta data for this entity
- $meta = $this->getMetaData($name);
- // getMetaData returns NULL if $name is not found
- return $meta;
- }
- /**
- * Set the value of a given key, replacing it if necessary.
- * If $name is a base attribute (as defined in $this->attributes) that value is set, otherwise it will
- * set the appropriate item of metadata.
- *
- * Note: It is important that your class populates $this->attributes with keys for all base attributes, anything
- * not in their gets set as METADATA.
- *
- * Q: Why are we not using __set overload here?
- * A: Because overload operators cause problems during subclassing, so we put the code here and
- * create overloads in subclasses.
- *
- * @param string $name
- * @param mixed $value
- */
- public function set($name, $value) {
- if (array_key_exists($name, $this->attributes)) {
- // Certain properties should not be manually changed!
- switch ($name) {
- case 'guid':
- case 'time_created':
- case 'time_updated':
- case 'last_action':
- return FALSE;
- break;
- default:
- $this->attributes[$name] = $value;
- break;
- }
- } else {
- return $this->setMetaData($name, $value);
- }
- return TRUE;
- }
- /**
- * Get a given piece of metadata.
- *
- * @param string $name
- */
- public function getMetaData($name) {
- if ((int) ($this->guid) > 0) {
- $md = get_metadata_byname($this->getGUID(), $name);
- } else {
- if (isset($this->temp_metadata[$name])) {
- return $this->temp_metadata[$name];
- }
- }
- if ($md && !is_array($md)) {
- return $md->value;
- } else if ($md && is_array($md)) {
- return metadata_array_to_values($md);
- }
- return null;
- }
- /**
- * 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);
- }
- /**
- * Supporting isset.
- *
- * @param string $name The name of the attribute or metadata.
- * @return bool
- */
- function __isset($name) {
- return $this->$name !== NULL;
- }
- /**
- * Supporting unsetting of magic attributes.
- *
- * @param string $name The name of the attribute or metadata.
- */
- function __unset($name) {
- if (array_key_exists($name, $this->attributes)) {
- $this->attributes[$name] = "";
- }
- else {
- $this->clearMetaData($name);
- }
- }
- /**
- * Set a piece of metadata.
- *
- * @param string $name Name of the metadata
- * @param mixed $value Value of the metadata
- * @param string $value_type Types supported: integer and string. Will auto-identify if not set
- * @param bool $multiple (does not support associative arrays)
- * @return bool
- */
- public function setMetaData($name, $value, $value_type = "", $multiple = false) {
- if (is_array($value)) {
- unset($this->temp_metadata[$name]);
- remove_metadata($this->getGUID(), $name);
- foreach ($value as $v) {
- if ((int) $this->guid > 0) {
- $multiple = true;
- if (!create_metadata($this->getGUID(), $name, $v, $value_type,
- $this->getOwner(), $this->getAccessID(), $multiple)) {
- return false;
- }
- } else {
- if (($multiple) && (isset($this->temp_metadata[$name]))) {
- if (!is_array($this->temp_metadata[$name])) {
- $tmp = $this->temp_metadata[$name];
- $this->temp_metadata[$name] = array();
- $this->temp_metadata[$name][] = $tmp;
- }
- $this->temp_metadata[$name][] = $value;
- }
- else {
- $this->temp_metadata[$name] = $value;
- }
- }
- }
- return true;
- } else {
- unset($this->temp_metadata[$name]);
- if ((int) $this->guid > 0) {
- $result = create_metadata($this->getGUID(), $name, $value, $value_type, $this->getOwner(), $this->getAccessID(), $multiple);
- return (bool)$result;
- } else {
- if (($multiple) && (isset($this->temp_metadata[$name]))) {
- if (!is_array($this->temp_metadata[$name])) {
- $tmp = $this->temp_metadata[$name];
- $this->temp_metadata[$name] = array();
- $this->temp_metadata[$name][] = $tmp;
- }
- $this->temp_metadata[$name][] = $value;
- }
- else {
- $this->temp_metadata[$name] = $value;
- }
- return true;
- }
- }
- }
- /**
- * Clear metadata.
- */
- public function clearMetaData($name = "") {
- if (empty($name)) {
- return clear_metadata($this->getGUID());
- } else {
- return remove_metadata($this->getGUID(),$name);
- }
- }
- /**
- * Get a piece of volatile (non-persisted) data on this entity
- */
- public function getVolatileData($name) {
- if (!is_array($this->volatile)) {
- $this->volatile = array();
- }
- if (array_key_exists($name, $this->volatile)) {
- return $this->volatile[$name];
- } else {
- return NULL;
- }
- }
- /**
- * Set a piece of volatile (non-persisted) data on this entity
- */
- public function setVolatileData($name, $value) {
- if (!is_array($this->volatile)) {
- $this->volatile = array();
- }
- $this->volatile[$name] = $value;
- }
- /**
- * Remove all entities associated with this entity
- *
- * @return true
- */
- public function clearRelationships() {
- remove_entity_relationships($this->getGUID());
- remove_entity_relationships($this->getGUID(),"",true);
- return true;
- }
- /**
- * Add a relationship.
- *
- * @param int $guid Relationship to link to.
- * @param string $relationship The type of relationship.
- * @return bool
- */
- public function addRelationship($guid, $relationship) {
- return add_entity_relationship($this->getGUID(), $relationship, $guid);
- }
- /**
- * Remove a relationship
- *
- * @param int $guid
- * @param str $relationship
- * @return bool
- */
- public function removeRelationship($guid, $relationship) {
- return remove_entity_relationship($this->getGUID(), $relationship, $guid);
- }
- /**
- * Adds a private setting to this entity.
- *
- * @param $name
- * @param $value
- * @return unknown_type
- */
- function setPrivateSetting($name, $value) {
- return set_private_setting($this->getGUID(), $name, $value);
- }
- /**
- * Gets private setting for this entity
- *
- * @param $name
- * @return unknown_type
- */
- function getPrivateSetting($name) {
- return get_private_setting($this->getGUID(), $name);
- }
- /**
- * Removes private setting for this entity.
- *
- * @param $name
- * @return unknown_type
- */
- function removePrivateSetting($name) {
- return remove_private_setting($this->getGUID(), $name);
- }
- /**
- * Adds an annotation to an entity. By default, the type is detected automatically; however,
- * it can also be set. Note that by default, annotations are private.
- *
- * @param string $name
- * @param mixed $value
- * @param int $access_id
- * @param int $owner_id
- * @param string $vartype
- */
- function annotate($name, $value, $access_id = ACCESS_PRIVATE, $owner_id = 0, $vartype = "") {
- if ((int) $this->guid > 0) {
- return create_annotation($this->getGUID(), $name, $value, $vartype, $owner_id, $access_id);
- } else {
- $this->temp_annotations[$name] = $value;
- }
- return true;
- }
- /**
- * Get the annotations for an entity.
- *
- * @param string $name
- * @param int $limit
- * @param int $offset
- * @param string $order
- */
- function getAnnotations($name, $limit = 50, $offset = 0, $order="asc") {
- if ((int) ($this->guid) > 0) {
- return get_annotations($this->getGUID(), "", "", $name, "", 0, $limit, $offset, $order);
- } else {
- return $this->temp_annotations[$name];
- }
- }
- /**
- * Remove all annotations or all annotations for this entity.
- *
- * @param string $name
- */
- function clearAnnotations($name = "") {
- return clear_annotations($this->getGUID(), $name);
- }
- /**
- * Return the annotations for the entity.
- *
- * @param string $name The type of annotation.
- */
- function countAnnotations($name = "") {
- return count_annotations($this->getGUID(), "", "", $name);
- }
- /**
- * Get the average of an integer type annotation.
- *
- * @param string $name
- */
- function getAnnotationsAvg($name) {
- return get_annotations_avg($this->getGUID(), "", "", $name);
- }
- /**
- * Get the sum of integer type annotations of a given name.
- *
- * @param string $name
- */
- function getAnnotationsSum($name) {
- return get_annotations_sum($this->getGUID(), "", "", $name);
- }
- /**
- * Get the minimum of integer type annotations of given name.
- *
- * @param string $name
- */
- function getAnnotationsMin($name) {
- return get_annotations_min($this->getGUID(), "", "", $name);
- }
- /**
- * Get the maximum of integer type annotations of a given name.
- *
- * @param string $name
- */
- function getAnnotationsMax($name) {
- return get_annotations_max($this->getGUID(), "", "", $name);
- }
- /**
- * Gets an array of entities from a specific relationship type
- *
- * @param string $relationship Relationship type (eg "friends")
- * @param true|false $inverse Is this an inverse relationship?
- * @param int $limit Number of elements to return
- * @param int $offset Indexing offset
- * @return array|false An array of entities or false on failure
- */
- function getEntitiesFromRelationship($relationship, $inverse = false, $limit = 50, $offset = 0) {
- return elgg_get_entities_from_relationship(array(
- 'relationship' => $relationship,
- 'relationship_guid' => $this->getGUID(),
- 'inverse_relationship' => $inverse,
- 'limit' => $limit,
- 'offset' => $offset
- ));
- }
- /**
- * Gets the number of of entities from a specific relationship type
- *
- * @param string $relationship Relationship type (eg "friends")
- * @param bool $inverse_relationship
- * @return int|false The number of entities or false on failure
- */
- function countEntitiesFromRelationship($relationship, $inverse_relationship = FALSE) {
- return elgg_get_entities_from_relationship(array(
- 'relationship' => $relationship,
- 'relationship_guid' => $this->getGUID(),
- 'inverse_relationship' => $inverse_relationship,
- 'count' => TRUE
- ));
- }
- /**
- * Determines whether or not the specified user (by default the current one) can edit the entity
- *
- * @param int $user_guid The user GUID, optionally (defaults to the currently logged in user)
- * @return true|false
- */
- function canEdit($user_guid = 0) {
- return can_edit_entity($this->getGUID(), $user_guid);
- }
- /**
- * Determines whether or not the specified user (by default the current one) can edit metadata on the entity
- *
- * @param ElggMetadata $metadata The piece of metadata to specifically check
- * @param int $user_guid The user GUID, optionally (defaults to the currently logged in user)
- * @return true|false
- */
- function canEditMetadata($metadata = null, $user_guid = 0) {
- return can_edit_entity_metadata($this->getGUID(), $user_guid, $metadata);
- }
- /**
- * Returns whether the given user (or current user) has the ability to write to this container.
- *
- * @param int $user_guid The user.
- * @return bool
- */
- public function canWriteToContainer($user_guid = 0) {
- return can_write_to_container($user_guid, $this->getGUID());
- }
- /**
- * Obtain this entity's access ID
- *
- * @return int The access ID
- */
- public function getAccessID() {
- return $this->get('access_id');
- }
- /**
- * Obtain this entity's GUID
- *
- * @return int GUID
- */
- public function getGUID() {
- return $this->get('guid');
- }
- /**
- * Get the owner of this entity
- *
- * @return int The owner GUID
- */
- public function getOwner() {
- return $this->get('owner_guid');
- }
- /**
- * Returns the actual entity of the user who owns this entity, if any
- *
- * @return ElggEntity The owning user
- */
- public function getOwnerEntity() {
- return get_entity($this->get('owner_guid'));
- }
- /**
- * Gets the type of entity this is
- *
- * @return string Entity type
- */
- public function getType() {
- return $this->get('type');
- }
- /**
- * Returns the subtype of this entity
- *
- * @return string The entity subtype
- */
- public function getSubtype() {
- // If this object hasn't been saved, then return the subtype string.
- if (!((int) $this->guid > 0)) {
- return $this->get('subtype');
- }
- return get_subtype_from_id($this->get('subtype'));
- }
- /**
- * Gets the UNIX epoch time that this entity was created
- *
- * @return int UNIX epoch time
- */
- public function getTimeCreated() {
- return $this->get('time_created');
- }
- /**
- * Gets the UNIX epoch time that this entity was last updated
- *
- * @return int UNIX epoch time
- */
- public function getTimeUpdated() {
- return $this->get('time_updated');
- }
- /**
- * Gets the display URL for this entity
- *
- * @return string The URL
- */
- public function getURL() {
- if (!empty($this->url_override)) {
- return $this->url_override;
- }
- return get_entity_url($this->getGUID());
- }
- /**
- * Overrides the URL returned by getURL
- *
- * @param string $url The new item URL
- * @return string The URL
- */
- public function setURL($url) {
- $this->url_override = $url;
- return $url;
- }
- /**
- * Return a url for the entity's icon, trying multiple alternatives.
- *
- * @param string $size Either 'large','medium','small' or 'tiny'
- * @return string The url or false if no url could be worked out.
- */
- public function getIcon($size = 'medium') {
- if (isset($this->icon_override[$size])) {
- return $this->icon_override[$size];
- }
- return get_entity_icon_url($this, $size);
- }
- /**
- * Set an icon override for an icon and size.
- *
- * @param string $url The url of the icon.
- * @param string $size The size its for.
- * @return bool
- */
- public function setIcon($url, $size = 'medium') {
- $url = sanitise_string($url);
- $size = sanitise_string($size);
- if (!$this->icon_override) {
- $this->icon_override = array();
- }
- $this->icon_override[$size] = $url;
- return true;
- }
- /**
- * Tests to see whether the object has been fully loaded.
- *
- * @return bool
- */
- public function isFullyLoaded() {
- return ! ($this->attributes['tables_loaded'] < $this->attributes['tables_split']);
- }
- /**
- * Save generic attributes to the entities table.
- */
- public function save() {
- $guid = (int) $this->guid;
- if ($guid > 0) {
- cache_entity($this);
- return update_entity(
- $this->get('guid'),
- $this->get('owner_guid'),
- $this->get('access_id'),
- $this->get('container_guid')
- );
- } else {
- // Create a new entity (nb: using attribute array directly 'cos set function does something special!)
- $this->attributes['guid'] = create_entity($this->attributes['type'], $this->attributes['subtype'], $this->attributes['owner_guid'], $this->attributes['access_id'], $this->attributes['site_guid'], $this->attributes['container_guid']);
- if (!$this->attributes['guid']) {
- throw new IOException(elgg_echo('IOException:BaseEntitySaveFailed'));
- }
- // Save any unsaved metadata
- // @todo How to capture extra information (access id etc)
- if (sizeof($this->temp_metadata) > 0) {
- foreach($this->temp_metadata as $name => $value) {
- $this->$name = $value;
- unset($this->temp_metadata[$name]);
- }
- }
- // Save any unsaved annotations metadata.
- // @todo How to capture extra information (access id etc)
- if (sizeof($this->temp_annotations) > 0) {
- foreach($this->temp_annotations as $name => $value) {
- $this->annotate($name, $value);
- unset($this->temp_annotations[$name]);
- }
- }
- // set the subtype to id now rather than a string
- $this->attributes['subtype'] = get_subtype_id($this->attributes['type'], $this->attributes['subtype']);
- // Cache object handle
- if ($this->attributes['guid']) {
- cache_entity($this);
- }
- return $this->attributes['guid'];
- }
- }
- /**
- * Load the basic entity information and populate base attributes array.
- *
- * @param int $guid
- */
- protected function load($guid) {
- $row = get_entity_as_row($guid);
- if ($row) {
- // Create the array if necessary - all subclasses should test before creating
- if (!is_array($this->attributes)) {
- $this->attributes = array();
- }
- // Now put these into the attributes array as core values
- $objarray = (array) $row;
- foreach($objarray as $key => $value) {
- $this->attributes[$key] = $value;
- }
- // Increment the portion counter
- if (!$this->isFullyLoaded()) {
- $this->attributes['tables_loaded']++;
- }
- // Cache object handle
- if ($this->attributes['guid']) {
- cache_entity($this);
- }
- return true;
- }
- return false;
- }
- /**
- * Disable this entity.
- *
- * @param string $reason Optional reason
- * @param bool $recursive Recursively disable all contained entities?
- */
- public function disable($reason = "", $recursive = true) {
- return disable_entity($this->get('guid'), $reason, $recursive);
- }
- /**
- * Re-enable this entity.
- */
- public function enable() {
- return enable_entity($this->get('guid'));
- }
- /**
- * Is this entity enabled?
- *
- * @return boolean
- */
- public function isEnabled() {
- if ($this->enabled == 'yes') {
- return true;
- }
- return false;
- }
- /**
- * Delete this entity.
- */
- public function delete() {
- return delete_entity($this->get('guid'));
- }
- // LOCATABLE INTERFACE /////////////////////////////////////////////////////////////
- /** Interface to set the location */
- public function setLocation($location) {
- return $this->location = $location;
- }
- /**
- * Set latitude and longitude tags for a given entity.
- *
- * @param float $lat
- * @param float $long
- */
- public function setLatLong($lat, $long) {
- $this->set('geo:lat', $lat);
- $this->set('geo:long', $long);
- return true;
- }
- /**
- * Get the contents of the ->geo:lat field.
- *
- */
- public function getLatitude() {
- return $this->get('geo:lat');
- }
- /**
- * Get the contents of the ->geo:lat field.
- *
- */
- public function getLongitude() {
- return $this->get('geo:long');
- }
- /**
- * Get the ->location metadata.
- *
- */
- public function getLocation() {
- return $this->get('location');
- }
- // NOTABLE INTERFACE ///////////////////////////////////////////////////////////////
- /**
- * Calendar functionality.
- * This function sets the time of an object on a calendar listing.
- *
- * @param int $hour If ommitted, now is assumed.
- * @param int $minute If ommitted, now is assumed.
- * @param int $second If ommitted, now is assumed.
- * @param int $day If ommitted, now is assumed.
- * @param int $month If ommitted, now is assumed.
- * @param int $year If ommitted, now is assumed.
- * @param int $duration Duration of event, remainder of the day is assumed.
- */
- public function setCalendarTimeAndDuration($hour = NULL, $minute = NULL, $second = NULL, $day = NULL, $month = NULL, $year = NULL, $duration = NULL) {
- $start = mktime($hour, $minute, $second, $month, $day, $year);
- $end = $start + abs($duration);
- if (!$duration) {
- $end = get_day_end($day,$month,$year);
- }
- $this->calendar_start = $start;
- $this->calendar_end = $end;
- return true;
- }
- /**
- * Return the start timestamp.
- */
- public function getCalendarStartTime() {
- return (int)$this->calendar_start;
- }
- /**
- * Return the end timestamp.
- */
- public function getCalendarEndTime() {
- return (int)$this->calendar_end;
- }
- // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
- /**
- * Return an array of fields which can be exported.
- */
- public function getExportableValues() {
- return array(
- 'guid',
- 'type',
- 'subtype',
- 'time_created',
- 'time_updated',
- 'container_guid',
- 'owner_guid',
- 'site_guid'
- );
- }
- /**
- * Export this class into an array of ODD Elements containing all necessary fields.
- * Override if you wish to return more information than can be found in $this->attributes (shouldn't happen)
- */
- public function export() {
- $tmp = array();
- // Generate uuid
- $uuid = guid_to_uuid($this->getGUID());
- // Create entity
- $odd = new ODDEntity(
- $uuid,
- $this->attributes['type'],
- get_subtype_from_id($this->attributes['subtype'])
- );
- $tmp[] = $odd;
- $exportable_values = $this->getExportableValues();
- // Now add its attributes
- foreach ($this->attributes as $k => $v) {
- $meta = NULL;
- if (in_array( $k, $exportable_values)) {
- switch ($k) {
- case 'guid' : // Dont use guid in OpenDD
- case 'type' : // Type and subtype already taken care of
- case 'subtype' :
- break;
- case 'time_created' : // Created = published
- $odd->setAttribute('published', date("r", $v));
- break;
- case 'site_guid' : // Container
- $k = 'site_uuid';
- $v = guid_to_uuid($v);
- $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
- break;
- case 'container_guid' : // Container
- $k = 'container_uuid';
- $v = guid_to_uuid($v);
- $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
- break;
- case 'owner_guid' : // Convert owner guid to uuid, this will be stored in metadata
- $k = 'owner_uuid';
- $v = guid_to_uuid($v);
- $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
- break;
- default :
- $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
- }
- // set the time of any metadata created
- if ($meta) {
- $meta->setAttribute('published', date("r",$this->time_created));
- $tmp[] = $meta;
- }
- }
- }
- // Now we do something a bit special.
- /*
- * This provides a rendered view of the entity to foreign sites.
- */
- elgg_set_viewtype('default');
- $view = elgg_view_entity($this, true);
- elgg_set_viewtype();
- $tmp[] = new ODDMetaData($uuid . "volatile/renderedentity/", $uuid, 'renderedentity', $view , 'volatile');
- return $tmp;
- }
- // IMPORTABLE INTERFACE ////////////////////////////////////////////////////////////
- /**
- * Import data from an parsed xml data array.
- *
- * @param array $data
- * @return bool
- */
- public function import(ODD $data) {
- if (!($data instanceof ODDEntity)) {
- throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnexpectedODDClass'));
- }
- // Set type and subtype
- $this->attributes['type'] = $data->getAttribute('class');
- $this->attributes['subtype'] = $data->getAttribute('subclass');
- // Set owner
- $this->attributes['owner_guid'] = get_loggedin_userid(); // Import as belonging to importer.
- // Set time
- $this->attributes['time_created'] = strtotime($data->getAttribute('published'));
- $this->attributes['time_updated'] = time();
- return true;
- }
- // SYSTEM LOG INTERFACE ////////////////////////////////////////////////////////////
- /**
- * Return an identification for the object for storage in the system log.
- * This id must be an integer.
- *
- * @return int
- */
- public function getSystemLogID() {
- return $this->getGUID();
- }
- /**
- * Return the class name of the object.
- */
- public function getClassName() {
- return get_class($this);
- }
- /**
- * For a given ID, return the object associated with it.
- * This is used by the river functionality primarily.
- * This is useful for checking access permissions etc on objects.
- */
- public function getObjectFromID($id) {
- return get_entity($id);
- }
- /**
- * Return the GUID of the owner of this object.
- */
- public function getObjectOwnerGUID() {
- return $this->owner_guid;
- }
- /**
- * Returns tags for this entity.
- *
- * @param array $tag_names Optionally restrict by tag metadata names.
- * @return array
- */
- public function getTags($tag_names = NULL) {
- global $CONFIG;
- if ($tag_names && !is_array($tag_names)) {
- $tag_names = array($tag_names);
- }
- $valid_tags = elgg_get_registered_tag_metadata_names();
- $entity_tags = array();
- foreach ($valid_tags as $tag_name) {
- if (is_array($tag_names) && !in_array($tag_name, $tag_names)) {
- continue;
- }
- if ($tags = $this->$tag_name) {
- // if a single tag, metadata returns a string.
- // if multiple tags, metadata returns an array.
- if (is_array($tags)) {
- $entity_tags = array_merge($entity_tags, $tags);
- } else {
- $entity_tags[] = $tags;
- }
- }
- }
- return $entity_tags;
- }
- // ITERATOR INTERFACE //////////////////////////////////////////////////////////////
- /*
- * This lets an entity's attributes be displayed using foreach as a normal array.
- * Example: http://www.sitepoint.com/print/php5-standard-library
- */
- private $valid = FALSE;
- function rewind() {
- $this->valid = (FALSE !== reset($this->attributes));
- }
- function current() {
- return current($this->attributes);
- }
- function key() {
- return key($this->attributes);
- }
- function next() {
- $this->valid = (FALSE !== next($this->attributes));
- }
- function valid() {
- return $this->valid;
- }
- // ARRAY ACCESS INTERFACE //////////////////////////////////////////////////////////
- /*
- * This lets an entity's attributes be accessed like an associative array.
- * Example: http://www.sitepoint.com/print/php5-standard-library
- */
- function offsetSet($key, $value) {
- if ( array_key_exists($key, $this->attributes) ) {
- $this->attributes[$key] = $value;
- }
- }
- function offsetGet($key) {
- if ( array_key_exists($key, $this->attributes) ) {
- return $this->attributes[$key];
- }
- }
- function offsetUnset($key) {
- if ( array_key_exists($key, $this->attributes) ) {
- $this->attributes[$key] = ""; // Full unsetting is dangerious for our objects
- }
- }
- function offsetExists($offset) {
- return array_key_exists($offset, $this->attributes);
- }
- }
- /**
- * Initialise the entity cache.
- */
- function initialise_entity_cache() {
- global $ENTITY_CACHE;
- if (!$ENTITY_CACHE) {
- //select_default_memcache('entity_cache'); // @todo Replace with memcache?
- $ENTITY_CACHE = array();
- }
- }
- /**
- * Invalidate this class' entry in the cache.
- *
- * @param int $guid The guid
- */
- function invalidate_cache_for_entity($guid) {
- global $ENTITY_CACHE;
- $guid = (int)$guid;
- unset($ENTITY_CACHE[$guid]);
- //$ENTITY_CACHE->delete($guid);
- }
- /**
- * Cache an entity.
- *
- * @param ElggEntity $entity Entity to cache
- */
- function cache_entity(ElggEntity $entity) {
- global $ENTITY_CACHE;
- $ENTITY_CACHE[$entity->guid] = $entity;
- }
- /**
- * Retrieve a entity from the cache.
- *
- * @param int $guid The guid
- */
- function retrieve_cached_entity($guid) {
- global $ENTITY_CACHE;
- $guid = (int)$guid;
- if (isset($ENTITY_CACHE[$guid])) {
- if ($ENTITY_CACHE[$guid]->isFullyLoaded()) {
- return $ENTITY_CACHE[$guid];
- }
- }
- return false;
- }
- /**
- * As retrieve_cached_entity, but returns the result as a stdClass (compatible with load functions that
- * expect a database row.)
- *
- * @param int $guid The guid
- */
- function retrieve_cached_entity_row($guid) {
- $obj = retrieve_cached_entity($guid);
- if ($obj) {
- $tmp = new stdClass;
- foreach ($obj as $k => $v) {
- $tmp->$k = $v;
- }
- return $tmp;
- }
- return false;
- }
- /**
- * Return the integer ID for a given subtype, or false.
- *
- * @todo Move to a nicer place?
- *
- * @param string $type
- * @param string $subtype
- */
- function get_subtype_id($type, $subtype) {
- global $CONFIG, $SUBTYPE_CACHE;
- $type = sanitise_string($type);
- $subtype = sanitise_string($subtype);
- if ($subtype=="") {
- //return $subtype;
- return FALSE;
- }
- // Todo: cache here? Or is looping less efficient that going to the db each time?
- $result = get_data_row("SELECT * from {$CONFIG->dbprefix}entity_subtypes
- where type='$type' and subtype='$subtype'");
- if ($result) {
- if (!$SUBTYPE_CACHE) {
- //select_default_memcache('subtype_cache');
- $SUBTYPE_CACHE = array();
- }
- $SUBTYPE_CACHE[$result->id] = $result;
- return $result->id;
- }
- return FALSE;
- }
- /**
- * For a given subtype ID, return its identifier text.
- *
- * @todo Move to a nicer place?
- *
- * @param int $subtype_id
- */
- function get_subtype_from_id($subtype_id) {
- global $CONFIG, $SUBTYPE_CACHE;
- $subtype_id = (int)$subtype_id;
- if (!$subtype_id) {
- return false;
- }
- if (isset($SUBTYPE_CACHE[$subtype_id])) {
- return $SUBTYPE_CACHE[$subtype_id]->subtype;
- }
- $result = get_data_row("SELECT * from {$CONFIG->dbprefix}entity_subtypes where id=$subtype_id");
- if ($result) {
- if (!$SUBTYPE_CACHE) {
- //select_default_memcache('subtype_cache');
- $SUBTYPE_CACHE = array();
- }
- $SUBTYPE_CACHE[$subtype_id] = $result;
- return $result->subtype;
- }
- return false;
- }
- /**
- * This function tests to see if a subtype has a registered class handler.
- *
- * @param string $type The type
- * @param string $subtype The subtype
- * @return a class name or null
- */
- function get_subtype_class($type, $subtype) {
- global $CONFIG, $SUBTYPE_CACHE;
- $type = sanitise_string($type);
- $subtype = sanitise_string($subtype);
- // Todo: cache here? Or is looping less efficient that going to the db each time?
- $result = get_data_row("SELECT * from {$CONFIG->dbprefix}entity_subtypes
- where type='$type' and subtype='$subtype'");
- if ($result) {
- if (!$SUBTYPE_CACHE) {
- //select_default_memcache('subtype_cache');
- $SUBTYPE_CACHE = array();
- }
- $SUBTYPE_CACHE[$result->id] = $result;
- return $result->class;
- }
- return NULL;
- }
- /**
- * This function tests to see if a subtype has a registered class handler by its id.
- *
- * @param int $subtype_id The subtype
- * @return a class name or null
- */
- function get_subtype_class_from_id($subtype_id) {
- global $CONFIG, $SUBTYPE_CACHE;
- $subtype_id = (int)$subtype_id;
- if (!$subtype_id) {
- return false;
- }
- if (isset($SUBTYPE_CACHE[$subtype_id])) {
- return $SUBTYPE_CACHE[$subtype_id]->class;
- }
- $result = get_data_row("SELECT * from {$CONFIG->dbprefix}entity_subtypes where id=$subtype_id");
- if ($result) {
- if (!$SUBTYPE_CACHE) {
- //select_default_memcache('subtype_cache');
- $SUBTYPE_CACHE = array();
- }
- $SUBTYPE_CACHE[$subtype_id] = $result;
- return $result->class;
- }
- return NULL;
- }
- /**
- * This function will register a new subtype, returning its ID as required.
- *
- * @param string $type The type you're subtyping
- * @param string $subtype The subtype label
- * @param string $class Optional class handler (if you don't want it handled by the generic elgg handler for the type)
- */
- function add_subtype($type, $subtype, $class = "") {
- global $CONFIG;
- $type = sanitise_string($type);
- $subtype = sanitise_string($subtype);
- $class = sanitise_string($class);
- // Short circuit if no subtype is given
- if ($subtype == "") {
- return 0;
- }
- $id = get_subtype_id($type, $subtype);
- if ($id==0) {
- return insert_data("insert into {$CONFIG->dbprefix}entity_subtypes (type, subtype, class) values ('$type','$subtype','$class')");
- }
- return $id;
- }
- /**
- * Update an existing entity.
- *
- * @param int $guid
- * @param int $owner_guid
- * @param int $access_id
- * @param int $container_guid
- */
- function update_entity($guid, $owner_guid, $access_id, $container_guid = null) {
- global $CONFIG, $ENTITY_CACHE;
- $guid = (int)$guid;
- $owner_guid = (int)$owner_guid;
- $access_id = (int)$access_id;
- $container_guid = (int) $container_guid;
- $time = time();
- $entity = get_entity($guid);
- if ($entity->type !== 'group' && is_null($container_guid)) {
- $container_guid = $owner_guid;
- }
- if (!$entity) {
- return FALSE;
- }
- if ($entity->canEdit()) {
- if (trigger_elgg_event('update',$entity->type,$entity)) {
- $ret = update_data("UPDATE {$CONFIG->dbprefix}entities set owner_guid='$owner_guid', access_id='$access_id', container_guid='$container_guid', time_updated='$time' WHERE guid=$guid");
- if ($entity instanceof ElggObject) {
- update_river_access_by_object($guid,$access_id);
- }
- // If memcache is available then delete this entry from the cache
- static $newentity_cache;
- if ((!$newentity_cache) && (is_memcache_available())) {
- $newentity_cache = new ElggMemcache('new_entity_cache');
- }
- if ($newentity_cache) {
- $new_entity = $newentity_cache->delete($guid);
- }
- // Handle cases where there was no error BUT no rows were updated!
- if ($ret===false) {
- return false;
- }
- return true;
- }
- }
- }
- /**
- * Determine whether a given user is able to write to a given container.
- *
- * @param int $user_guid The user guid, or 0 for get_loggedin_userid()
- * @param int $container_guid The container, or 0 for the current page owner.
- */
- function can_write_to_container($user_guid = 0, $container_guid = 0, $entity_type = 'all') {
- global $CONFIG;
- $user_guid = (int)$user_guid;
- $user = get_entity($user_guid);
- if (!$user) {
- $user = get_loggedin_user();
- }
- $container_guid = (int)$container_guid;
- if (!$container_guid) {
- $container_guid = page_owner();
- }
- $return = false;
- // @todo This is probably not a good idea.
- if (!$container_guid) {
- $return = true;
- } else {
- $container = get_entity($container_guid);
- if ($container && $user) {
- // If the user can edit the container, they can also write to it
- $return = $container->canEdit($user->getGUID());
-
- // See if the user is a member of the group.
- if (!$return && $container instanceof ElggGroup) {
- $return = $container->isMember($user);
- }
- }
- }
- // See if anyone else has anything to say
- return trigger_plugin_hook('container_permissions_check', $entity_type,
- array('container' => $container, 'user' => $user), $return);
- }
- /**
- * Create a new entity of a given type.
- *
- * @param string $type The type of the entity (site, user, object).
- * @param string $subtype The subtype of the entity.
- * @param int $owner_guid The GUID of the object's owner.
- * @param int $access_id The access control group to create the entity with.
- * @param int $site_guid The site to add this entity to. Leave as 0 (default) for the current site.
- * @return mixed The new entity's GUID, or false on failure
- */
- function create_entity($type, $subtype, $owner_guid, $access_id, $site_guid = 0, $container_guid = 0) {
- global $CONFIG;
- $type = sanitise_string($type);
- $subtype = add_subtype($type, $subtype);
- $owner_guid = (int)$owner_guid;
- $access_id = (int)$access_id;
- $time = time();
- if ($site_guid == 0) {
- $site_guid = $CONFIG->site_guid;
- }
- $site_guid = (int) $site_guid;
- if ($container_guid == 0 && $type != 'group') {
- $container_guid = $owner_guid;
- }
- $user = get_loggedin_user();
- if (!can_write_to_container($user->guid, $owner_guid, $type)) {
- return false;
- }
- if ($owner_guid != $container_guid) {
- if (!can_write_to_container($user->guid, $container_guid, $type)) {
- return false;
- }
- }
- if ($type=="") {
- throw new InvalidParameterException(elgg_echo('InvalidParameterException:EntityTypeNotSet'));
- }
- return insert_data("INSERT into {$CONFIG->dbprefix}entities
- (type, subtype, owner_guid, site_guid, container_guid, access_id, time_created, time_updated, last_action) values
- ('$type',$subtype, $owner_guid, $site_guid, $container_guid, $access_id, $time, $time, $time)");
- }
- /**
- * Retrieve the entity details for a specific GUID, returning it as a stdClass db row.
- *
- * You will only get an object if a) it exists, b) you have access to it.
- *
- * @param int $guid The GUID of the object to extract
- */
- function get_entity_as_row($guid) {
- global $CONFIG;
- if (!$guid) {
- return false;
- }
- $guid = (int) $guid;
- $access = get_access_sql_suffix();
- return get_data_row("SELECT * from {$CONFIG->dbprefix}entities where guid=$guid and $access");
- }
- /**
- * Create an Elgg* object from a given entity row.
- */
- function entity_row_to_elggstar($row) {
- if (!($row instanceof stdClass)) {
- return $row;
- }
- if ((!isset($row->guid)) || (!isset($row->subtype))) {
- return $row;
- }
- $new_entity = false;
- // Create a memcache cache if we can
- static $newentity_cache;
- if ((!$newentity_cache) && (is_memcache_available())) {
- $newentity_cache = new ElggMemcache('new_entity_cache');
- }
- if ($newentity_cache) {
- $new_entity = $newentity_cache->load($row->guid);
- }
- if ($new_entity) {
- return $new_entity;
- }
- // load class for entity if one is registered
- $classname = get_subtype_class_from_id($row->subtype);
- if ($classname!="") {
- if (class_exists($classname)) {
- $new_entity = new $classname($row);
- if (!($new_entity instanceof ElggEntity)) {
- throw new ClassException(sprintf(elgg_echo('ClassException:ClassnameNotClass'), $classname, 'ElggEntity'));
- }
- } else {
- error_log(sprintf(elgg_echo('ClassNotFoundException:MissingClass'), $classname));
- }
- }
- if (!$new_entity) {
- switch ($row->type) {
- case 'object' :
- $new_entity = new ElggObject($row);
- break;
- case 'user' :
- $new_entity = new ElggUser($row);
- break;
- case 'group' :
- $new_entity = new ElggGroup($row);
- break;
- case 'site' :
- $new_entity = new ElggSite($row);
- break;
- default:
- throw new InstallationException(sprintf(elgg_echo('InstallationException:TypeNotSupported'), $row->type));
- }
- }
- // Cache entity if we have a cache available
- if (($newentity_cache) && ($new_entity)) {
- $newentity_cache->save($new_entity->guid, $new_entity);
- }
- return $new_entity;
- }
- /**
- * Return the entity for a given guid as the correct object.
- * @param int $guid The GUID of the entity
- * @return a child of ElggEntity appropriate for the type.
- */
- function get_entity($guid) {
- static $newentity_cache;
- $new_entity = false;
- if (!is_numeric($guid)) {
- return FALSE;
- }
- if ((!$newentity_cache) && (is_memcache_available())) {
- $newentity_cache = new ElggMemcache('new_entity_cache');
- }
- if ($newentity_cache) {
- $new_entity = $newentity_cache->load($guid);
- }
- if ($new_entity) {
- return $new_entity;
- }
- return entity_row_to_elggstar(get_entity_as_row($guid));
- }
- /**
- * Get all entities. NB: Plural arguments can be written as
- * singular if only specifying a single element. (e.g., 'type' => 'object'
- * vs 'types' => array('object')).
- *
- * @param array $options Array in format:
- *
- * types => NULL|STR entity type (SQL: type IN ('type1', 'type2') Joined with subtypes by AND...see below)
- *
- * subtypes => NULL|STR entity subtype (SQL: subtype IN ('subtype1', 'subtype2))
- *
- * type_subtype_pairs => NULL|ARR (array('type' => 'subtype')) (SQL: type = '$type' AND subtype = '$subtype') pairs
- *
- * owner_guids => NULL|INT entity guid
- *
- * container_guids => NULL|INT container_guid
- *
- * site_guids => NULL (current_site)|INT site_guid
- *
- * order_by => NULL (time_created desc)|STR SQL order by clause
- *
- * limit => NULL (10)|INT SQL limit clause
- *
- * offset => NULL (0)|INT SQL offset clause
- *
- * created_time_lower => NULL|INT Created time lower boundary in epoch time
- *
- * created_time_upper => NULL|INT Created time upper boundary in epoch time
- *
- * modified_time_lower => NULL|INT Modified time lower boundary in epoch time
- *
- * modified_time_upper => NULL|INT Modified time upper boundary in epoch time
- *
- * count => TRUE|FALSE return a count instead of entities
- *
- * wheres => array() Additional where clauses to AND together
- *
- * joins => array() Additional joins
- *
- * callback => string A callback function to pass each row through
- *
- * @return if count, int. if not count, array or false if no entities. false also on errors.
- *
- * @since 1.7.0
- */
- function elgg_get_entities(array $options = array()) {
- global $CONFIG;
- $defaults = array(
- 'types' => ELGG_ENTITIES_ANY_VALUE,
- 'subtypes' => ELGG_ENTITIES_ANY_VALUE,
- 'type_subtype_pairs' => ELGG_ENTITIES_ANY_VALUE,
- 'owner_guids' => ELGG_ENTITIES_ANY_VALUE,
- 'container_guids' => ELGG_ENTITIES_ANY_VALUE,
- 'site_guids' => $CONFIG->site_guid,
- 'modified_time_lower' => ELGG_ENTITIES_ANY_VALUE,
- 'modified_time_upper' => ELGG_ENTITIES_ANY_VALUE,
- 'created_time_lower' => ELGG_ENTITIES_ANY_VALUE,
- 'created_time_upper' => ELGG_ENTITIES_ANY_VALUE,
- 'order_by' => 'e.time_created desc',
- 'group_by' => ELGG_ENTITIES_ANY_VALUE,
- 'limit' => 10,
- 'offset' => 0,
- 'count' => FALSE,
- 'selects' => array(),
- 'wheres' => array(),
- 'joins' => array(),
- 'callback' => 'entity_row_to_elggstar',
- );
- $options = array_merge($defaults, $options);
- // can't use helper function with type_subtype_pair because it's already an array...just need to merge it
- if (isset($options['type_subtype_pair'])) {
- if (isset($options['type_subtype_pairs'])) {
- $options['type_subtype_pairs'] = array_merge($options['type_subtype_pairs'], $options['type_subtype_pair']);
- } else {
- $options['type_subtype_pairs'] = $options['type_subtype_pair'];
- }
- }
- $singulars = array('type', 'subtype', 'owner_guid', 'container_guid', 'site_guid');
- $options = elgg_normalise_plural_options_array($options, $singulars);
- // evaluate where clauses
- if (!is_array($options['wheres'])) {
- $options['wheres'] = array($options['wheres']);
- }
- $wheres = $options['wheres'];
- $wheres[] = elgg_get_entity_type_subtype_where_sql('e', $options['types'], $options['subtypes'], $options['type_subtype_pairs']);
- $wheres[] = elgg_get_entity_site_where_sql('e', $options['site_guids']);
- $wheres[] = elgg_get_entity_owner_where_sql('e', $options['owner_guids']);
- $wheres[] = elgg_get_entity_container_where_sql('e', $options['container_guids']);
- $wheres[] = elgg_get_entity_time_where_sql('e', $options['created_time_upper'],
- $options['created_time_lower'], $options['modified_time_upper'], $options['modified_time_lower']);
- // remove identical where clauses
- $wheres = array_unique($wheres);
- // see if any functions failed
- // remove empty strings on successful functions
- foreach ($wheres as $i => $where) {
- if ($where === FALSE) {
- return FALSE;
- } elseif (empty($where)) {
- unset($wheres[$i]);
- }
- }
- // evaluate join clauses
- if (!is_array($options['joins'])) {
- $options['joins'] = array($options['joins']);
- }
- // remove identical join clauses
- $joins = array_unique($options['joins']);
- foreach ($joins as $i => $join) {
- if ($join === FALSE) {
- return FALSE;
- } elseif (empty($join)) {
- unset($joins[$i]);
- }
- }
- // evalutate selects
- if ($options['selects']) {
- $selects = '';
- foreach ($options['selects'] as $select) {
- $selects = ", $select";
- }
- } else {
- $selects = '';
- }
- if (!$options['count']) {
- $query = "SELECT DISTINCT e.*{$selects} FROM {$CONFIG->dbprefix}entities e ";
- } else {
- $query = "SELECT count(DISTINCT e.guid) as total FROM {$CONFIG->dbprefix}entities e ";
- }
- // add joins
- foreach ($joins as $j) {
- $query .= " $j ";
- }
- // add wheres
- $query .= ' WHERE ';
- foreach ($wheres as $w) {
- $query .= " $w AND ";
- }
- // Add access controls
- $query .= get_access_sql_suffix('e');
- if (!$options['count']) {
- if ($options['group_by'] = sanitise_string($options['group_by'])) {
- $query .= " GROUP BY {$options['group_by']}";
- }
- if ($options['order_by'] = sanitise_string($options['order_by'])) {
- $query .= " ORDER BY {$options['order_by']}";
- }
- if ($options['limit']) {
- $limit = sanitise_int($options['limit']);
- $offset = sanitise_int($options['offset'], true);
- $query .= " LIMIT $offset, $limit";
- }
- try {
- $dt = get_data($query, $options['callback']);
- } catch (Exception $e) {
- return array();
- }
- //@todo normalize this to array()
- return $dt;
- } else {
- $total = get_data_row($query);
- return (int)$total->total;
- }
- }
- /**
- * @deprecated 1.7. Use elgg_get_entities().
- * @param $type
- * @param $subtype
- * @param $owner_guid
- * @param $order_by
- * @param $limit
- * @param $offset
- * @param $count
- * @param $site_guid
- * @param $container_guid
- * @param $timelower
- * @param $timeupper
- * @return unknown_type
- */
- function get_entities($type = "", $subtype = "", $owner_guid = 0, $order_by = "", $limit = 10, $offset = 0,
- $count = false, $site_guid = 0, $container_guid = null, $timelower = 0, $timeupper = 0) {
- elgg_deprecated_notice('get_entities() was deprecated by elgg_get_entities().', 1.7);
- // rewrite owner_guid to container_guid to emulate old functionality
- if ($owner_guid != "") {
- if (is_null($container_guid)) {
- $container_guid = $owner_guid;
- $owner_guid = NULL;
- }
- }
- $options = array();
- if ($type) {
- if (is_array($type)) {
- $options['types'] = $type;
- } else {
- $options['type'] = $type;
- }
- }
- if ($subtype) {
- if (is_array($subtype)) {
- $options['subtypes'] = $subtype;
- } else {
- $options['subtype'] = $subtype;
- }
- }
- if ($owner_guid) {
- if (is_array($owner_guid)) {
- $options['owner_guids'] = $owner_guid;
- } else {
- $options['owner_guid'] = $owner_guid;
- }
- }
- if ($order_by) {
- $options['order_by'] = $order_by;
- }
- // need to pass 0 for all option
- $options['limit'] = $limit;
- if ($offset) {
- $options['offset'] = $offset;
- }
- if ($count) {
- $options[…
Large files files are truncated, but you can click here to view the full file