aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/relationships.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib/relationships.php')
-rw-r--r--engine/lib/relationships.php1886
1 files changed, 953 insertions, 933 deletions
diff --git a/engine/lib/relationships.php b/engine/lib/relationships.php
index 27a9917ba..22d3c1faa 100644
--- a/engine/lib/relationships.php
+++ b/engine/lib/relationships.php
@@ -1,1013 +1,1033 @@
<?php
+/**
+ * Elgg relationships.
+ * Stub containing relationship functions, making import and export easier.
+ *
+ * @package Elgg
+ * @subpackage Core
+ * @author Curverider Ltd <info@elgg.com>
+ * @link http://elgg.org/
+ */
+
+/**
+ * Relationship class.
+ *
+ * @author Curverider Ltd
+ * @package Elgg
+ * @subpackage Core
+ */
+class ElggRelationship implements
+ Importable,
+ Exportable,
+ Loggable, // Can events related to this object class be logged
+ Iterator, // Override foreach behaviour
+ ArrayAccess // Override for array access
+ {
/**
- * Elgg relationships.
- * Stub containing relationship functions, making import and export easier.
- *
- * @package Elgg
- * @subpackage Core
- * @author Curverider Ltd <info@elgg.com>
- * @link http://elgg.org/
+ * This contains the site's main properties (id, etc)
+ * @var array
*/
+ protected $attributes;
/**
- * Relationship class.
- *
- * @author Curverider Ltd
- * @package Elgg
- * @subpackage Core
+ * Construct a new site object, optionally from a given id value or row.
+ *
+ * @param mixed $id
*/
- class ElggRelationship implements
- Importable,
- Exportable,
- Loggable, // Can events related to this object class be logged
- Iterator, // Override foreach behaviour
- ArrayAccess // Override for array access
- {
- /**
- * This contains the site's main properties (id, etc)
- * @var array
- */
- protected $attributes;
-
- /**
- * Construct a new site object, optionally from a given id value or row.
- *
- * @param mixed $id
- */
- function __construct($id = null)
- {
- $this->attributes = array();
-
- if (!empty($id)) {
-
- if ($id instanceof stdClass)
- $relationship = $id; // Create from db row
- else
- $relationship = get_relationship($id);
-
- if ($relationship) {
- $objarray = (array) $relationship;
- foreach($objarray as $key => $value) {
- $this->attributes[$key] = $value;
- }
- }
- }
- }
-
- /**
- * Class member get overloading
- *
- * @param string $name
- * @return mixed
- */
- protected function __get($name) {
- if (isset($this->attributes[$name]))
- return $this->attributes[$name];
-
- return null;
- }
-
- /**
- * Class member set overloading
- *
- * @param string $name
- * @param mixed $value
- * @return mixed
- */
- protected function __set($name, $value) {
- $this->attributes[$name] = $value;
- return true;
- }
+ function __construct($id = null) {
+ $this->attributes = array();
- /**
- * Save the relationship
- *
- * @return int the relationship id
- */
- public function save()
- {
- if ($this->id > 0)
- {
- delete_relationship($this->id);
+ if (!empty($id)) {
+ if ($id instanceof stdClass) {
+ $relationship = $id; // Create from db row
+ } else {
+ $relationship = get_relationship($id);
}
- $this->id = add_entity_relationship($this->guid_one, $this->relationship, $this->guid_two);
- if (!$this->id) throw new IOException(sprintf(elgg_new('IOException:UnableToSaveNew'), get_class()));
-
- return $this->id;
-
- }
-
- /**
- * Delete a given relationship.
- */
- public function delete()
- {
- return delete_relationship($this->id);
- }
-
- /**
- * Get a URL for this relationship.
- *
- * @return string
- */
- public function getURL()
- {
- return get_relationship_url($this->id);
- }
-
- // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
-
- /**
- * Return an array of fields which can be exported.
- */
- public function getExportableValues()
- {
- return array(
- 'id',
- 'guid_one',
- 'relationship',
- 'guid_two'
- );
- }
-
- /**
- * Export this relationship
- *
- * @return array
- */
- public function export()
- {
- $uuid = get_uuid_from_object($this);
- $relationship = new ODDRelationship(
- guid_to_uuid($this->guid_one),
- $this->relationship,
- guid_to_uuid($this->guid_two)
- );
-
- $relationship->setAttribute('uuid', $uuid);
-
- return $relationship;
- }
-
- // IMPORTABLE INTERFACE ////////////////////////////////////////////////////////////
-
- /**
- * Import a relationship
- *
- * @param array $data
- * @param int $version
- * @return ElggRelationship
- * @throws ImportException
- */
- public function import(ODD $data)
- {
- if (!($element instanceof ODDRelationship))
- throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnexpectedODDClass'));
-
- $uuid_one = $data->getAttribute('uuid1');
- $uuid_two = $data->getAttribute('uuid2');
-
- // See if this entity has already been imported, if so then we need to link to it
- $entity1 = get_entity_from_uuid($uuid_one);
- $entity2 = get_entity_from_uuid($uuid_two);
- if (($entity1) && ($entity2))
- {
- // Set the item ID
- $this->attributes['guid_one'] = $entity1->getGUID();
- $this->attributes['guid_two'] = $entity2->getGUID();
-
- // Map verb to relationship
- //$verb = $data->getAttribute('verb');
- //$relationship = get_relationship_from_verb($verb);
- $relationship = $data->getAttribute('type');
-
- if ($relationship)
- {
- $this->attributes['relationship'] = $relationship;
- // save
- $result = $this->save();
- if (!$result)
- throw new ImportException(sprintf(elgg_echo('ImportException:ProblemSaving'), get_class()));
-
- return $this;
+ if ($relationship) {
+ $objarray = (array) $relationship;
+ foreach($objarray as $key => $value) {
+ $this->attributes[$key] = $value;
}
}
}
-
- // 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->id; }
-
- /**
- * 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_relationship($id); }
-
- /**
- * Return the GUID of the owner of this object.
- */
- public function getObjectOwnerGUID() { return $this->owner_guid; }
-
- /**
- * Return a type of the object - eg. object, group, user, relationship, metadata, annotation etc
- */
- public function getType() { return 'relationship'; }
-
- /**
- * Return a subtype. For metadata & annotations this is the 'name' and for relationship this is the relationship type.
- */
- public function getSubtype() { return $this->relationship; }
-
- // 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);
- }
- }
-
-
+ }
+
/**
- * Convert a database row to a new ElggRelationship
+ * Class member get overloading
*
- * @param stdClass $row
- * @return stdClass or ElggMetadata
+ * @param string $name
+ * @return mixed
*/
- function row_to_elggrelationship($row)
- {
- if (!($row instanceof stdClass))
- return $row;
-
- return new ElggRelationship($row);
+ protected function __get($name) {
+ if (isset($this->attributes[$name])) {
+ return $this->attributes[$name];
+ }
+
+ return null;
}
-
+
/**
- * Return a relationship.
+ * Class member set overloading
*
- * @param int $id
+ * @param string $name
+ * @param mixed $value
+ * @return mixed
*/
- function get_relationship($id)
- {
- global $CONFIG;
-
- $id = (int)$id;
-
- return row_to_elggrelationship(get_data_row("SELECT * from {$CONFIG->dbprefix}entity_relationships where id=$id"));
+ protected function __set($name, $value) {
+ $this->attributes[$name] = $value;
+ return true;
}
-
+
/**
- * Delete a specific relationship.
+ * Save the relationship
*
- * @param int $id
+ * @return int the relationship id
*/
- function delete_relationship($id)
- {
- global $CONFIG;
-
- $id = (int)$id;
-
- $result = delete_data("delete from {$CONFIG->dbprefix}entity_relationships where id=$id");
-
- return $result;
- }
-
+ public function save() {
+ if ($this->id > 0) {
+ delete_relationship($this->id);
+ }
+
+ $this->id = add_entity_relationship($this->guid_one, $this->relationship, $this->guid_two);
+ if (!$this->id) {
+ throw new IOException(sprintf(elgg_new('IOException:UnableToSaveNew'), get_class()));
+ }
+
+ return $this->id;
+ }
+
/**
- * Define an arbitrary relationship between two entities.
- * This relationship could be a friendship, a group membership or a site membership.
- *
- * This function lets you make the statement "$guid_one has $relationship with $guid_two".
- *
- * @param int $guid_one
- * @param string $relationship
- * @param int $guid_two
+ * Delete a given relationship.
*/
- function add_entity_relationship($guid_one, $relationship, $guid_two)
- {
- global $CONFIG;
-
- $guid_one = (int)$guid_one;
- $relationship = sanitise_string($relationship);
- $guid_two = (int)$guid_two;
-
- // Check for duplicates
- if (check_entity_relationship($guid_one, $relationship, $guid_two))
- return false;
-
- $result = insert_data("INSERT into {$CONFIG->dbprefix}entity_relationships (guid_one, relationship, guid_two) values ($guid_one, '$relationship', $guid_two)");
-
- if ($result!==false) {
- $obj = get_relationship($result);
- if (trigger_elgg_event('create', $relationship, $obj)) {
- return true;
- } else {
- delete_relationship($result);
- }
- }
-
- return false;
+ public function delete() {
+ return delete_relationship($this->id);
}
-
+
/**
- * Determine whether or not a relationship between two entities exists and returns the relationship object if it does
+ * Get a URL for this relationship.
*
- * @param int $guid_one The GUID of the entity "owning" the relationship
- * @param string $relationship The type of relationship
- * @param int $guid_two The GUID of the entity the relationship is with
- * @return object|false Depending on success
+ * @return string
*/
- function check_entity_relationship($guid_one, $relationship, $guid_two)
- {
- global $CONFIG;
-
- $guid_one = (int)$guid_one;
- $relationship = sanitise_string($relationship);
- $guid_two = (int)$guid_two;
-
- if ($row = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entity_relationships WHERE guid_one=$guid_one AND relationship='$relationship' AND guid_two=$guid_two limit 1")) {
- return $row;
- }
- return false;
+ public function getURL() {
+ return get_relationship_url($this->id);
}
+ // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
/**
- * Remove an arbitrary relationship between two entities.
- *
- * @param int $guid_one
- * @param string $relationship
- * @param int $guid_two
+ * Return an array of fields which can be exported.
*/
- function remove_entity_relationship($guid_one, $relationship, $guid_two)
- {
- global $CONFIG;
-
- $guid_one = (int)$guid_one;
- $relationship = sanitise_string($relationship);
- $guid_two = (int)$guid_two;
-
- $obj = check_entity_relationship($guid_one, $relationship, $guid_two);
- if ($obj == false) return false;
-
- if (trigger_elgg_event('delete', $relationship, $obj)) {
- return delete_data("DELETE from {$CONFIG->dbprefix}entity_relationships where guid_one=$guid_one and relationship='$relationship' and guid_two=$guid_two");
- } else {
- return false;
- }
+ public function getExportableValues() {
+ return array(
+ 'id',
+ 'guid_one',
+ 'relationship',
+ 'guid_two'
+ );
}
/**
- * Removes all arbitrary relationships originating from a particular entity
+ * Export this relationship
*
- * @param int $guid_one The GUID of the entity
- * @param string $relationship The name of the relationship (optionally)
- * @param true|false $inverse Whether we're deleting inverse relationships (default false)
- * @param string $type The type of entity to limit this relationship delete to (defaults to all)
- * @return true|false Depending on success
+ * @return array
*/
- function remove_entity_relationships($guid_one, $relationship = "", $inverse = false, $type = '') {
-
- global $CONFIG;
-
- $guid_one = (int) $guid_one;
-
- if (!empty($relationship)) {
- $relationship = sanitise_string($relationship);
- $where = "and er.relationship='$relationship'";
- } else {
- $where = "";
+ public function export() {
+ $uuid = get_uuid_from_object($this);
+ $relationship = new ODDRelationship(
+ guid_to_uuid($this->guid_one),
+ $this->relationship,
+ guid_to_uuid($this->guid_two)
+ );
+
+ $relationship->setAttribute('uuid', $uuid);
+
+ return $relationship;
+ }
+
+ // IMPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Import a relationship
+ *
+ * @param array $data
+ * @param int $version
+ * @return ElggRelationship
+ * @throws ImportException
+ */
+ public function import(ODD $data) {
+ if (!($element instanceof ODDRelationship)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnexpectedODDClass'));
}
-
- if (!empty($type)) {
- $type = sanitise_string($type);
- if (!$inverse) {
- $join = " join {$CONFIG->dbprefix}entities e on e.guid = er.guid_two ";
- } else {
- $join = " join {$CONFIG->dbprefix}entities e on e.guid = er.guid_one ";
- $where .= " and ";
+
+ $uuid_one = $data->getAttribute('uuid1');
+ $uuid_two = $data->getAttribute('uuid2');
+
+ // See if this entity has already been imported, if so then we need to link to it
+ $entity1 = get_entity_from_uuid($uuid_one);
+ $entity2 = get_entity_from_uuid($uuid_two);
+ if (($entity1) && ($entity2)) {
+ // Set the item ID
+ $this->attributes['guid_one'] = $entity1->getGUID();
+ $this->attributes['guid_two'] = $entity2->getGUID();
+
+ // Map verb to relationship
+ //$verb = $data->getAttribute('verb');
+ //$relationship = get_relationship_from_verb($verb);
+ $relationship = $data->getAttribute('type');
+
+ if ($relationship) {
+ $this->attributes['relationship'] = $relationship;
+ // save
+ $result = $this->save();
+ if (!$result) {
+ throw new ImportException(sprintf(elgg_echo('ImportException:ProblemSaving'), get_class()));
+ }
+
+ return $this;
}
- $where .= " and e.type = '{$type}' ";
- } else {
- $join = "";
- }
-
- if (!$inverse) {
- $sql = "DELETE er from {$CONFIG->dbprefix}entity_relationships as er {$join} where guid_one={$guid_one} {$where}";
- return delete_data($sql);
- } else {
- $sql = "DELETE er from {$CONFIG->dbprefix}entity_relationships as er {$join} where guid_two={$guid_one} {$where}";
- return delete_data($sql);
}
-
}
+ // SYSTEM LOG INTERFACE ////////////////////////////////////////////////////////////
+
/**
- * Get all the relationships for a given guid.
- *
- * @param int $guid
+ * Return an identification for the object for storage in the system log.
+ * This id must be an integer.
+ *
+ * @return int
*/
- function get_entity_relationships($guid)
- {
- global $CONFIG;
-
- $guid = (int)$guid;
-
- $query = "SELECT * from {$CONFIG->dbprefix}entity_relationships where guid_one=$guid";
-
- return get_data($query, "row_to_elggrelationship");
- }
-
+ public function getSystemLogID() {
+ return $this->id;
+ }
+
/**
- * Return entities matching a given query joining against a relationship.
- *
- * @param string $relationship The relationship eg "friends_of"
- * @param int $relationship_guid The guid of the entity to use query
- * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of"
- * @param string $type
- * @param string $subtype
- * @param int $owner_guid
- * @param string $order_by
- * @param int $limit
- * @param int $offset
- * @param boolean $count Set to true if you want to count the number of entities instead (default false)
- * @param int $site_guid The site to get entities for. Leave as 0 (default) for the current site; -1 for all sites.
- * @return array|int|false An array of entities, or the number of entities, or false on failure
+ * Return the class name of the object.
*/
- function get_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0)
- {
- global $CONFIG;
-
- $relationship = sanitise_string($relationship);
- $relationship_guid = (int)$relationship_guid;
- $inverse_relationship = (bool)$inverse_relationship;
- $type = sanitise_string($type);
- $subtype = get_subtype_id($type, $subtype);
- $owner_guid = (int)$owner_guid;
- if ($order_by == "") $order_by = "time_created desc";
- else $order_by = "time_created, {$order_by}";
- $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;
-
- //$access = get_access_list();
-
- $where = array();
-
- if ($relationship!="")
- $where[] = "r.relationship='$relationship'";
- if ($relationship_guid)
- $where[] = ($inverse_relationship ? "r.guid_two='$relationship_guid'" : "r.guid_one='$relationship_guid'");
- if ($type != "")
- $where[] = "e.type='$type'";
- if ($subtype)
- $where[] = "e.subtype=$subtype";
- if ($owner_guid != "")
- $where[] = "e.container_guid='$owner_guid'";
- if ($site_guid > 0)
- $where[] = "e.site_guid = {$site_guid}";
-
- // Select what we're joining based on the options
- $joinon = "e.guid = r.guid_one";
- if (!$inverse_relationship)
- $joinon = "e.guid = r.guid_two";
-
- if ($count) {
- $query = "SELECT count(distinct e.guid) as total ";
- } else {
- $query = "SELECT distinct e.* ";
- }
- $query .= " from {$CONFIG->dbprefix}entity_relationships r JOIN {$CONFIG->dbprefix}entities e on $joinon where ";
- foreach ($where as $w)
- $query .= " $w and ";
- $query .= get_access_sql_suffix("e"); // Add access controls
- if (!$count) {
- $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
- return get_data($query, "entity_row_to_elggstar");
- } else {
- if ($count = get_data_row($query)) {
- return $count->total;
- }
- }
- return false;
-
+ public function getClassName() {
+ return get_class($this);
}
/**
- * Returns a viewable list of entities by relationship
- *
- * @see elgg_view_entity_list
- *
- * @param string $relationship The relationship eg "friends_of"
- * @param int $relationship_guid The guid of the entity to use query
- * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of"
- * @param string $type The type of entity (eg 'object')
- * @param string $subtype The entity subtype
- * @param int $owner_guid The owner (default: all)
- * @param int $limit The number of entities to display on a page
- * @param true|false $fullview Whether or not to display the full view (default: true)
- * @param true|false $viewtypetoggle Whether or not to allow gallery view
- * @param true|false $pagination Whether to display pagination (default: true)
- * @return string The viewable list of entities
+ * 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_relationship($id);
+ }
+
+ /**
+ * Return the GUID of the owner of this object.
*/
- function list_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $viewtypetoggle = false, $pagination = true) {
-
- $limit = (int) $limit;
- $offset = (int) get_input('offset');
- $count = get_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship, $type, $subtype, $owner_guid, "", $limit, $offset, true);
- $entities = get_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship, $type, $subtype, $owner_guid, "", $limit, $offset);
+ public function getObjectOwnerGUID() {
+ return $this->owner_guid;
+ }
- return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $viewtypetoggle, $pagination);
-
+ /**
+ * Return a type of the object - eg. object, group, user, relationship, metadata, annotation etc
+ */
+ public function getType() {
+ return 'relationship';
}
/**
- * Gets the number of entities by a the number of entities related to them in a particular way.
- * This is a good way to get out the users with the most friends, or the groups with the most members.
- *
- * @param string $relationship The relationship eg "friends_of"
- * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of" (default: true)
- * @param string $type The type of entity (default: all)
- * @param string $subtype The entity subtype (default: all)
- * @param int $owner_guid The owner of the entities (default: none)
- * @param int $limit
- * @param int $offset
- * @param boolean $count Set to true if you want to count the number of entities instead (default false)
- * @param int $site_guid The site to get entities for. Leave as 0 (default) for the current site; -1 for all sites.
- * @return array|int|false An array of entities, or the number of entities, or false on failure
+ * Return a subtype. For metadata & annotations this is the 'name' and for relationship this is the relationship type.
*/
-
- function get_entities_by_relationship_count($relationship, $inverse_relationship = true, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
-
- global $CONFIG;
-
- $relationship = sanitise_string($relationship);
- $inverse_relationship = (bool)$inverse_relationship;
- $type = sanitise_string($type);
- if ($subtype AND !$subtype = get_subtype_id($type, $subtype))
- return false;
- $owner_guid = (int)$owner_guid;
- $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;
-
- //$access = get_access_list();
-
- $where = array();
-
- if ($relationship!="")
- $where[] = "r.relationship='$relationship'";
- if ($inverse_relationship) {
- $on = 'e.guid = r.guid_two';
- } else {
- $on = 'e.guid = r.guid_one';
+ public function getSubtype() {
+ return $this->relationship;
+ }
+
+ // 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;
}
- if ($type != "")
- $where[] = "e.type='$type'";
- if ($subtype)
- $where[] = "e.subtype=$subtype";
- if ($owner_guid != "")
- $where[] = "e.container_guid='$owner_guid'";
- if ($site_guid > 0)
- $where[] = "e.site_guid = {$site_guid}";
-
- if ($count) {
- $query = "SELECT count(distinct e.guid) as total ";
- } else {
- $query = "SELECT e.*, count(e.guid) as total ";
+ }
+
+ function offsetGet($key) {
+ if ( array_key_exists($key, $this->attributes) ) {
+ return $this->attributes[$key];
}
-
- $query .= " from {$CONFIG->dbprefix}entity_relationships r JOIN {$CONFIG->dbprefix}entities e on {$on} where ";
-
- if (!empty($where))
- foreach ($where as $w)
- $query .= " $w and ";
- $query .= get_access_sql_suffix("e"); // Add access controls
-
- if (!$count) {
- $query .= " group by e.guid ";
- $query .= " order by total desc limit {$offset}, {$limit}"; // Add order and limit
- return get_data($query, "entity_row_to_elggstar");
+ }
+
+ 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);
+ }
+}
+
+
+/**
+ * Convert a database row to a new ElggRelationship
+ *
+ * @param stdClass $row
+ * @return stdClass or ElggMetadata
+ */
+function row_to_elggrelationship($row) {
+ if (!($row instanceof stdClass)) {
+ return $row;
+ }
+
+ return new ElggRelationship($row);
+}
+
+/**
+ * Return a relationship.
+ *
+ * @param int $id
+ */
+function get_relationship($id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ return row_to_elggrelationship(get_data_row("SELECT * from {$CONFIG->dbprefix}entity_relationships where id=$id"));
+}
+
+/**
+ * Delete a specific relationship.
+ *
+ * @param int $id
+ */
+function delete_relationship($id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ $result = delete_data("delete from {$CONFIG->dbprefix}entity_relationships where id=$id");
+
+ return $result;
+}
+
+/**
+ * Define an arbitrary relationship between two entities.
+ * This relationship could be a friendship, a group membership or a site membership.
+ *
+ * This function lets you make the statement "$guid_one has $relationship with $guid_two".
+ *
+ * @param int $guid_one
+ * @param string $relationship
+ * @param int $guid_two
+ */
+function add_entity_relationship($guid_one, $relationship, $guid_two) {
+ global $CONFIG;
+
+ $guid_one = (int)$guid_one;
+ $relationship = sanitise_string($relationship);
+ $guid_two = (int)$guid_two;
+
+ // Check for duplicates
+ if (check_entity_relationship($guid_one, $relationship, $guid_two)) {
+ return false;
+ }
+
+ $result = insert_data("INSERT into {$CONFIG->dbprefix}entity_relationships (guid_one, relationship, guid_two) values ($guid_one, '$relationship', $guid_two)");
+
+ if ($result!==false) {
+ $obj = get_relationship($result);
+ if (trigger_elgg_event('create', $relationship, $obj)) {
+ return true;
} else {
- if ($count = get_data_row($query)) {
- return $count->total;
- }
+ delete_relationship($result);
}
-
+ }
+
+ return false;
+}
+
+/**
+ * Determine whether or not a relationship between two entities exists and returns the relationship object if it does
+ *
+ * @param int $guid_one The GUID of the entity "owning" the relationship
+ * @param string $relationship The type of relationship
+ * @param int $guid_two The GUID of the entity the relationship is with
+ * @return object|false Depending on success
+ */
+function check_entity_relationship($guid_one, $relationship, $guid_two) {
+ global $CONFIG;
+
+ $guid_one = (int)$guid_one;
+ $relationship = sanitise_string($relationship);
+ $guid_two = (int)$guid_two;
+
+ if ($row = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entity_relationships WHERE guid_one=$guid_one AND relationship='$relationship' AND guid_two=$guid_two limit 1")) {
+ return $row;
+ }
+
+ return false;
+}
+
+/**
+ * Remove an arbitrary relationship between two entities.
+ *
+ * @param int $guid_one
+ * @param string $relationship
+ * @param int $guid_two
+ */
+function remove_entity_relationship($guid_one, $relationship, $guid_two) {
+ global $CONFIG;
+
+ $guid_one = (int)$guid_one;
+ $relationship = sanitise_string($relationship);
+ $guid_two = (int)$guid_two;
+
+ $obj = check_entity_relationship($guid_one, $relationship, $guid_two);
+ if ($obj == false) {
return false;
-
}
-
- /**
- * Displays a human-readable list of entities
- *
- * @param string $relationship The relationship eg "friends_of"
- * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of" (default: true)
- * @param string $type The type of entity (eg 'object')
- * @param string $subtype The entity subtype
- * @param int $owner_guid The owner (default: all)
- * @param int $limit The number of entities to display on a page
- * @param true|false $fullview Whether or not to display the full view (default: true)
- * @param true|false $viewtypetoggle Whether or not to allow gallery view
- * @param true|false $pagination Whether to display pagination (default: true)
- * @return string The viewable list of entities
- */
-
- function list_entities_by_relationship_count($relationship, $inverse_relationship = true, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $viewtypetoggle = false, $pagination = true) {
-
- $limit = (int) $limit;
- $offset = (int) get_input('offset');
- $count = get_entities_by_relationship_count($relationship,$inverse_relationship,$type,$subtype,$owner_guid,0,0,true);
- $entities = get_entities_by_relationship_count($relationship,$inverse_relationship,$type,$subtype,$owner_guid,$limit,$offset);
-
- return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $viewtypetoggle, $pagination);
-
- }
-
- /**
- * Gets the number of entities by a the number of entities related to them in a particular way also constrained by
- * metadata
- *
- * @param string $relationship The relationship eg "friends_of"
- * @param int $relationship_guid The guid of the entity to use query
- * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of" (default: true)
- * @param String $meta_name The metadata name
- * @param String $meta_value The metadata value
- * @param string $type The type of entity (default: all)
- * @param string $subtype The entity subtype (default: all)
- * @param int $owner_guid The owner of the entities (default: none)
- * @param int $limit
- * @param int $offset
- * @param boolean $count Set to true if you want to count the number of entities instead (default false)
- * @param int $site_guid The site to get entities for. Leave as 0 (default) for the current site; -1 for all sites.
- * @return array|int|false An array of entities, or the number of entities, or false on failure
- */
- function get_entities_from_relationships_and_meta($relationship, $relationship_guid, $inverse_relationship = false, $meta_name = "", $meta_value = "", $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $count = false, $site_guid = 0)
- {
-
- global $CONFIG;
-
+
+ if (trigger_elgg_event('delete', $relationship, $obj)) {
+ return delete_data("DELETE from {$CONFIG->dbprefix}entity_relationships where guid_one=$guid_one and relationship='$relationship' and guid_two=$guid_two");
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Removes all arbitrary relationships originating from a particular entity
+ *
+ * @param int $guid_one The GUID of the entity
+ * @param string $relationship The name of the relationship (optionally)
+ * @param true|false $inverse Whether we're deleting inverse relationships (default false)
+ * @param string $type The type of entity to limit this relationship delete to (defaults to all)
+ * @return true|false Depending on success
+ */
+function remove_entity_relationships($guid_one, $relationship = "", $inverse = false, $type = '') {
+ global $CONFIG;
+
+ $guid_one = (int) $guid_one;
+
+ if (!empty($relationship)) {
$relationship = sanitise_string($relationship);
- $inverse_relationship = (bool)$inverse_relationship;
- $relationship_guid = (int)$relationship_guid;
+ $where = "and er.relationship='$relationship'";
+ } else {
+ $where = "";
+ }
+
+ if (!empty($type)) {
$type = sanitise_string($type);
- if ($subtype AND !$subtype = get_subtype_id($type, $subtype))
- return false;
- $owner_guid = (int)$owner_guid;
- $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;
-
- $meta_n = get_metastring_id($meta_name);
- $meta_v = get_metastring_id($meta_value);
-
- //$access = get_access_list();
-
- $where = array();
-
- if ($relationship!="")
- $where[] = "r.relationship='$relationship'";
-
- $on = "e.guid = r.guid_one";
- if (!$inverse_relationship)
- $on = "e.guid = r.guid_two";
-
- if ($type != "")
- $where[] = "e.type='$type'";
- if ($subtype)
- $where[] = "e.subtype=$subtype";
- if ($owner_guid != "")
- $where[] = "e.container_guid='$owner_guid'";
- if ($site_guid > 0)
- $where[] = "e.site_guid = {$site_guid}";
- if ($relationship_guid)
- $where[] = ($inverse_relationship ? "r.guid_two='$relationship_guid'" : "r.guid_one='$relationship_guid'");
-
-
- $metajoin = "";
- if (($meta_name!=="") || ($meta_value!=="")) {
- $metajoin = " JOIN {$CONFIG->dbprefix}metadata m on e.guid=m.entity_guid";
-
- if ($meta_name!=="")
- $where[] = "m.name_id='$meta_n'";
- if ($meta_value!=="")
- $where[] = "m.value_id='$meta_v'";
- }
-
- if ($count) {
- $query = "SELECT count(distinct e.guid) as total ";
+ if (!$inverse) {
+ $join = " join {$CONFIG->dbprefix}entities e on e.guid = er.guid_two ";
} else {
- $query = "SELECT distinct e.*, count(e.guid) as total ";
+ $join = " join {$CONFIG->dbprefix}entities e on e.guid = er.guid_one ";
+ $where .= " and ";
}
-
- $query .= " from {$CONFIG->dbprefix}entity_relationships r JOIN {$CONFIG->dbprefix}entities e on {$on} {$metajoin} where ";
-
- if (!empty($where))
- foreach ($where as $w)
+ $where .= " and e.type = '{$type}' ";
+ } else {
+ $join = "";
+ }
+
+ if (!$inverse) {
+ $sql = "DELETE er from {$CONFIG->dbprefix}entity_relationships as er {$join} where guid_one={$guid_one} {$where}";
+ return delete_data($sql);
+ } else {
+ $sql = "DELETE er from {$CONFIG->dbprefix}entity_relationships as er {$join} where guid_two={$guid_one} {$where}";
+ return delete_data($sql);
+ }
+}
+
+/**
+ * Get all the relationships for a given guid.
+ *
+ * @param int $guid
+ */
+function get_entity_relationships($guid) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+
+ $query = "SELECT * from {$CONFIG->dbprefix}entity_relationships where guid_one=$guid";
+
+ return get_data($query, "row_to_elggrelationship");
+}
+
+/**
+ * Return entities matching a given query joining against a relationship.
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of"
+ * @param string $type
+ * @param string $subtype
+ * @param int $owner_guid
+ * @param string $order_by
+ * @param int $limit
+ * @param int $offset
+ * @param boolean $count Set to true if you want to count the number of entities instead (default false)
+ * @param int $site_guid The site to get entities for. Leave as 0 (default) for the current site; -1 for all sites.
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ */
+function get_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+ global $CONFIG;
+
+ $relationship = sanitise_string($relationship);
+ $relationship_guid = (int)$relationship_guid;
+ $inverse_relationship = (bool)$inverse_relationship;
+ $type = sanitise_string($type);
+ $subtype = get_subtype_id($type, $subtype);
+ $owner_guid = (int)$owner_guid;
+ if ($order_by == "") {
+ $order_by = "time_created desc";
+ } else {
+ $order_by = "time_created, {$order_by}";
+ }
+ $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;
+ }
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($relationship!="") {
+ $where[] = "r.relationship='$relationship'";
+ }
+
+ if ($relationship_guid) {
+ $where[] = ($inverse_relationship ? "r.guid_two='$relationship_guid'" : "r.guid_one='$relationship_guid'");
+ }
+
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+
+ if ($subtype) {
+ $where[] = "e.subtype=$subtype";
+ }
+
+ if ($owner_guid != "") {
+ $where[] = "e.container_guid='$owner_guid'";
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ // Select what we're joining based on the options
+ $joinon = "e.guid = r.guid_one";
+ if (!$inverse_relationship) {
+ $joinon = "e.guid = r.guid_two";
+ }
+
+ if ($count) {
+ $query = "SELECT count(distinct e.guid) as total ";
+ } else {
+ $query = "SELECT distinct e.* ";
+ }
+ $query .= " from {$CONFIG->dbprefix}entity_relationships r JOIN {$CONFIG->dbprefix}entities e on $joinon where ";
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+ $query .= get_access_sql_suffix("e"); // Add access controls
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Returns a viewable list of entities by relationship
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of"
+ * @param string $type The type of entity (eg 'object')
+ * @param string $subtype The entity subtype
+ * @param int $owner_guid The owner (default: all)
+ * @param int $limit The number of entities to display on a page
+ * @param true|false $fullview Whether or not to display the full view (default: true)
+ * @param true|false $viewtypetoggle Whether or not to allow gallery view
+ * @param true|false $pagination Whether to display pagination (default: true)
+ * @return string The viewable list of entities
+ */
+function list_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $viewtypetoggle = false, $pagination = true) {
+ $limit = (int) $limit;
+ $offset = (int) get_input('offset');
+ $count = get_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship, $type, $subtype, $owner_guid, "", $limit, $offset, true);
+ $entities = get_entities_from_relationship($relationship, $relationship_guid, $inverse_relationship, $type, $subtype, $owner_guid, "", $limit, $offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $viewtypetoggle, $pagination);
+}
+
+/**
+ * Gets the number of entities by a the number of entities related to them in a particular way.
+ * This is a good way to get out the users with the most friends, or the groups with the most members.
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of" (default: true)
+ * @param string $type The type of entity (default: all)
+ * @param string $subtype The entity subtype (default: all)
+ * @param int $owner_guid The owner of the entities (default: none)
+ * @param int $limit
+ * @param int $offset
+ * @param boolean $count Set to true if you want to count the number of entities instead (default false)
+ * @param int $site_guid The site to get entities for. Leave as 0 (default) for the current site; -1 for all sites.
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ */
+
+function get_entities_by_relationship_count($relationship, $inverse_relationship = true, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+ global $CONFIG;
+
+ $relationship = sanitise_string($relationship);
+ $inverse_relationship = (bool)$inverse_relationship;
+ $type = sanitise_string($type);
+ if ($subtype AND !$subtype = get_subtype_id($type, $subtype)) {
+ return false;
+ }
+ $owner_guid = (int)$owner_guid;
+ $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;
+ }
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($relationship!="") {
+ $where[] = "r.relationship='$relationship'";
+ }
+
+ if ($inverse_relationship) {
+ $on = 'e.guid = r.guid_two';
+ } else {
+ $on = 'e.guid = r.guid_one';
+ }
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+
+ if ($subtype) {
+ $where[] = "e.subtype=$subtype";
+ }
+
+ if ($owner_guid != "") {
+ $where[] = "e.container_guid='$owner_guid'";
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if ($count) {
+ $query = "SELECT count(distinct e.guid) as total ";
+ } else {
+ $query = "SELECT e.*, count(e.guid) as total ";
+ }
+
+ $query .= " from {$CONFIG->dbprefix}entity_relationships r JOIN {$CONFIG->dbprefix}entities e on {$on} where ";
+
+ if (!empty($where)) {
+ foreach ($where as $w) {
$query .= " $w and ";
- $query .= get_access_sql_suffix("e"); // Add access controls
- if (($meta_name!=="") || ($meta_value!=="")) $query .= ' and ' . get_access_sql_suffix("m"); // Add access controls
-
- if (!$count) {
- $query .= " group by e.guid ";
- $query .= " order by total desc limit {$offset}, {$limit}"; // Add order and limit
-
- return get_data($query, "entity_row_to_elggstar");
- } else {
- if ($count = get_data_row($query)) {
- return $count->total;
- }
}
-
+ }
+ $query .= get_access_sql_suffix("e"); // Add access controls
+
+ if (!$count) {
+ $query .= " group by e.guid ";
+ $query .= " order by total desc limit {$offset}, {$limit}"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Displays a human-readable list of entities
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of" (default: true)
+ * @param string $type The type of entity (eg 'object')
+ * @param string $subtype The entity subtype
+ * @param int $owner_guid The owner (default: all)
+ * @param int $limit The number of entities to display on a page
+ * @param true|false $fullview Whether or not to display the full view (default: true)
+ * @param true|false $viewtypetoggle Whether or not to allow gallery view
+ * @param true|false $pagination Whether to display pagination (default: true)
+ * @return string The viewable list of entities
+ */
+
+function list_entities_by_relationship_count($relationship, $inverse_relationship = true, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $viewtypetoggle = false, $pagination = true) {
+ $limit = (int) $limit;
+ $offset = (int) get_input('offset');
+ $count = get_entities_by_relationship_count($relationship,$inverse_relationship,$type,$subtype,$owner_guid,0,0,true);
+ $entities = get_entities_by_relationship_count($relationship,$inverse_relationship,$type,$subtype,$owner_guid,$limit,$offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $viewtypetoggle, $pagination);
+}
+
+/**
+ * Gets the number of entities by a the number of entities related to them in a particular way also constrained by
+ * metadata
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of" (default: true)
+ * @param String $meta_name The metadata name
+ * @param String $meta_value The metadata value
+ * @param string $type The type of entity (default: all)
+ * @param string $subtype The entity subtype (default: all)
+ * @param int $owner_guid The owner of the entities (default: none)
+ * @param int $limit
+ * @param int $offset
+ * @param boolean $count Set to true if you want to count the number of entities instead (default false)
+ * @param int $site_guid The site to get entities for. Leave as 0 (default) for the current site; -1 for all sites.
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ */
+function get_entities_from_relationships_and_meta($relationship, $relationship_guid, $inverse_relationship = false, $meta_name = "", $meta_value = "", $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+ global $CONFIG;
+
+ $relationship = sanitise_string($relationship);
+ $inverse_relationship = (bool)$inverse_relationship;
+ $relationship_guid = (int)$relationship_guid;
+ $type = sanitise_string($type);
+ if ($subtype AND !$subtype = get_subtype_id($type, $subtype)) {
return false;
}
-
- /**
- * Sets the URL handler for a particular relationship type
- *
- * @param string $function_name The function to register
- * @param string $relationship_type The relationship type.
- * @return true|false Depending on success
- */
- function register_relationship_url_handler($function_name, $relationship_type = "all") {
- global $CONFIG;
-
- if (!is_callable($function_name)) return false;
-
- if (!isset($CONFIG->relationship_url_handler)) {
- $CONFIG->relationship_url_handler = array();
+
+ $owner_guid = (int)$owner_guid;
+ $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;
+ }
+
+ $meta_n = get_metastring_id($meta_name);
+ $meta_v = get_metastring_id($meta_value);
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($relationship!="") {
+ $where[] = "r.relationship='$relationship'";
+ }
+
+ $on = "e.guid = r.guid_one";
+ if (!$inverse_relationship) {
+ $on = "e.guid = r.guid_two";
+ }
+
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+ if ($subtype) {
+ $where[] = "e.subtype=$subtype";
+ }
+ if ($owner_guid != "") {
+ $where[] = "e.container_guid='$owner_guid'";
+ }
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+ if ($relationship_guid) {
+ $where[] = ($inverse_relationship ? "r.guid_two='$relationship_guid'" : "r.guid_one='$relationship_guid'");
+ }
+
+
+ $metajoin = "";
+ if (($meta_name!=="") || ($meta_value!=="")) {
+ $metajoin = " JOIN {$CONFIG->dbprefix}metadata m on e.guid=m.entity_guid";
+
+ if ($meta_name!=="") {
+ $where[] = "m.name_id='$meta_n'";
+ }
+ if ($meta_value!=="") {
+ $where[] = "m.value_id='$meta_v'";
}
-
- $CONFIG->relationship_url_handler[$relationship_type] = $function_name;
-
- return true;
-
}
-
- /**
- * Get the url for a given relationship.
- *
- * @param unknown_type $id
- * @return unknown
- */
- function get_relationship_url($id)
- {
- global $CONFIG;
-
- $id = (int)$id;
-
- if ($relationship = get_relationship($id))
- {
- $view = elgg_get_viewtype();
-
- $guid = $relationship->guid_one;
- $type = $relationship->relationship;
-
- $url = "";
-
- $function = "";
- if (isset($CONFIG->relationship_url_handler[$type]))
- $function = $CONFIG->relationship_url_handler[$type];
- if (isset($CONFIG->relationship_url_handler['all']))
- $function = $CONFIG->relationship_url_handler['all'];
-
- if (is_callable($function)) {
- $url = $function($relationship);
- }
-
- if ($url == "") {
-
- $nameid = $relationship->id;
-
- $url = $CONFIG->wwwroot . "export/$view/$guid/relationship/$nameid/";
- }
-
- return $url;
-
+
+ if ($count) {
+ $query = "SELECT count(distinct e.guid) as total ";
+ } else {
+ $query = "SELECT distinct e.*, count(e.guid) as total ";
+ }
+
+ $query .= " from {$CONFIG->dbprefix}entity_relationships r JOIN {$CONFIG->dbprefix}entities e on {$on} {$metajoin} where ";
+
+ if (!empty($where)) {
+ foreach ($where as $w) {
+ $query .= " $w and ";
}
-
+ }
+ $query .= get_access_sql_suffix("e"); // Add access controls
+ if (($meta_name!=="") || ($meta_value!=="")) {
+ $query .= ' and ' . get_access_sql_suffix("m"); // Add access controls
+ }
+
+ if (!$count) {
+ $query .= " group by e.guid ";
+ $query .= " order by total desc limit {$offset}, {$limit}"; // Add order and limit
+
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Sets the URL handler for a particular relationship type
+ *
+ * @param string $function_name The function to register
+ * @param string $relationship_type The relationship type.
+ * @return true|false Depending on success
+ */
+function register_relationship_url_handler($function_name, $relationship_type = "all") {
+ global $CONFIG;
+
+ if (!is_callable($function_name)) {
return false;
}
-
- /**** HELPER FUNCTIONS FOR RELATIONSHIPS OF TYPE 'ATTACHED' ****/
-
- /**
- * Function to determine if the object trying to attach to other, has already done so
- * @param int $guid_one This is the target object
- * @param int $guid_two This is the object trying to attach to $guid_one
- * @return true | false
- **/
-
- function already_attached($guid_one, $guid_two){
-
- if($attached = check_entity_relationship($guid_one, "attached", $guid_two)){
- return true;
- }else{
- return false;
- }
- }
-
- /**
- * Function to get all objects attached to a particular object
- * @param int $guid
- * @param string $type - the type of object to return e.g. 'file', 'friend_of' etc
- * @return an array of objects
- **/
-
- function get_attachments($guid, $type=""){
-
- $attached = get_entities_from_relationship("attached", $guid, $inverse_relationship = false, $type, $subtype = "", $owner_guid = 0, $order_by = "time_created desc", $limit = 10, $offset = 0, $count = false, $site_guid = 0);
- return $attached;
-
- }
-
- /**
- * Function to remove a particular attachment between two objects
- * @param int $guid_one This is the target object
- * @param int $guid_two This is the object to remove from $guid_one
- * @return a view
- **/
-
- function remove_attachment($guid_one, $guid_two){
-
- if(already_attached($guid_one, $guid_two))
- remove_entity_relationship($guid_one, "attached", $guid_two);
-
- }
-
-
-
- /**
- * Function to start the process of attaching one object to another
- * @param int $guid_one This is the target object
- * @param int $guid_two This is the object trying to attach to $guid_one
- * @return a view
- **/
-
- function make_attachment($guid_one, $guid_two){
-
- if(!(already_attached($guid_one, $guid_two)))
- if(add_entity_relationship($guid_one, "attached", $guid_two))
- return true;
-
- }
-
- /**
- * Handler called by trigger_plugin_hook on the "import" event.
- */
- function import_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params)
- {
- $element = $params['element'];
-
- $tmp = NULL;
-
- if ($element instanceof ODDRelationship)
- {
- $tmp = new ElggRelationship();
- $tmp->import($element);
-
- return $tmp;
+
+ if (!isset($CONFIG->relationship_url_handler)) {
+ $CONFIG->relationship_url_handler = array();
+ }
+
+ $CONFIG->relationship_url_handler[$relationship_type] = $function_name;
+
+ return true;
+}
+
+/**
+ * Get the url for a given relationship.
+ *
+ * @param unknown_type $id
+ * @return unknown
+ */
+function get_relationship_url($id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ if ($relationship = get_relationship($id)) {
+ $view = elgg_get_viewtype();
+
+ $guid = $relationship->guid_one;
+ $type = $relationship->relationship;
+
+ $url = "";
+
+ $function = "";
+ if (isset($CONFIG->relationship_url_handler[$type])) {
+ $function = $CONFIG->relationship_url_handler[$type];
+ }
+ if (isset($CONFIG->relationship_url_handler['all'])) {
+ $function = $CONFIG->relationship_url_handler['all'];
+ }
+
+ if (is_callable($function)) {
+ $url = $function($relationship);
}
+
+ if ($url == "") {
+ $nameid = $relationship->id;
+
+ $url = $CONFIG->wwwroot . "export/$view/$guid/relationship/$nameid/";
+ }
+
+ return $url;
}
-
- /**
- * Handler called by trigger_plugin_hook on the "export" event.
- */
- function export_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params)
- {
- global $CONFIG;
-
- // Sanity check values
- if ((!is_array($params)) && (!isset($params['guid'])))
- throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport'));
-
- if (!is_array($returnvalue))
- throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonArrayReturnValue'));
-
- $guid = (int)$params['guid'];
-
- $result = get_entity_relationships($guid);
-
- if ($result)
- {
- foreach ($result as $r)
- $returnvalue[] = $r->export();
+
+ return false;
+}
+
+/**** HELPER FUNCTIONS FOR RELATIONSHIPS OF TYPE 'ATTACHED' ****/
+
+/**
+ * Function to determine if the object trying to attach to other, has already done so
+ * @param int $guid_one This is the target object
+ * @param int $guid_two This is the object trying to attach to $guid_one
+ * @return true | false
+ **/
+
+function already_attached($guid_one, $guid_two){
+ if ($attached = check_entity_relationship($guid_one, "attached", $guid_two)){
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Function to get all objects attached to a particular object
+ * @param int $guid
+ * @param string $type - the type of object to return e.g. 'file', 'friend_of' etc
+ * @return an array of objects
+**/
+
+function get_attachments($guid, $type=""){
+ $attached = get_entities_from_relationship("attached", $guid, $inverse_relationship = false, $type, $subtype = "", $owner_guid = 0, $order_by = "time_created desc", $limit = 10, $offset = 0, $count = false, $site_guid = 0);
+ return $attached;
+}
+
+/**
+ * Function to remove a particular attachment between two objects
+ * @param int $guid_one This is the target object
+ * @param int $guid_two This is the object to remove from $guid_one
+ * @return a view
+**/
+
+function remove_attachment($guid_one, $guid_two){
+ if(already_attached($guid_one, $guid_two)) {
+ remove_entity_relationship($guid_one, "attached", $guid_two);
+ }
+}
+
+/**
+ * Function to start the process of attaching one object to another
+ * @param int $guid_one This is the target object
+ * @param int $guid_two This is the object trying to attach to $guid_one
+ * @return a view
+**/
+
+function make_attachment($guid_one, $guid_two){
+ if (!(already_attached($guid_one, $guid_two))) {
+ if (add_entity_relationship($guid_one, "attached", $guid_two)) {
+ return true;
}
-
- return $returnvalue;
- }
-
- /**
- * An event listener which will notify users based on certain events.
- *
- * @param unknown_type $event
- * @param unknown_type $object_type
- * @param unknown_type $object
- */
- function relationship_notification_hook($event, $object_type, $object)
- {
- global $CONFIG;
-
- if (
- ($object instanceof ElggRelationship) &&
- ($event == 'create') &&
- ($object_type == 'friend')
- )
- {
- $user_one = get_entity($object->guid_one);
- $user_two = get_entity($object->guid_two);
-
- // Notify target user
- return notify_user($object->guid_two, $object->guid_one, sprintf(elgg_echo('friend:newfriend:subject'), $user_one->name),
- sprintf(elgg_echo("friend:newfriend:body"), $user_one->name, $CONFIG->site->url . "pg/profile/" . $user_one->username)
- );
+ }
+}
+
+/**
+ * Handler called by trigger_plugin_hook on the "import" event.
+ */
+function import_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ $element = $params['element'];
+
+ $tmp = NULL;
+
+ if ($element instanceof ODDRelationship) {
+ $tmp = new ElggRelationship();
+ $tmp->import($element);
+
+ return $tmp;
+ }
+}
+
+/**
+ * Handler called by trigger_plugin_hook on the "export" event.
+ */
+function export_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ global $CONFIG;
+
+ // Sanity check values
+ if ((!is_array($params)) && (!isset($params['guid']))) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport'));
+ }
+
+ if (!is_array($returnvalue)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonArrayReturnValue'));
+ }
+
+ $guid = (int)$params['guid'];
+
+ $result = get_entity_relationships($guid);
+
+ if ($result) {
+ foreach ($result as $r) {
+ $returnvalue[] = $r->export();
}
}
-
- /** Register the import hook */
- register_plugin_hook("import", "all", "import_relationship_plugin_hook", 3);
-
- /** Register the hook, ensuring entities are serialised first */
- register_plugin_hook("export", "all", "export_relationship_plugin_hook", 3);
-
- /** Register event to listen to some events **/
- register_elgg_event_handler('create','friend','relationship_notification_hook');
-?> \ No newline at end of file
+
+ return $returnvalue;
+}
+
+/**
+ * An event listener which will notify users based on certain events.
+ *
+ * @param unknown_type $event
+ * @param unknown_type $object_type
+ * @param unknown_type $object
+ */
+function relationship_notification_hook($event, $object_type, $object) {
+ global $CONFIG;
+
+ if (
+ ($object instanceof ElggRelationship) &&
+ ($event == 'create') &&
+ ($object_type == 'friend')
+ )
+ {
+ $user_one = get_entity($object->guid_one);
+ $user_two = get_entity($object->guid_two);
+
+ // Notify target user
+ return notify_user($object->guid_two, $object->guid_one, sprintf(elgg_echo('friend:newfriend:subject'), $user_one->name),
+ sprintf(elgg_echo("friend:newfriend:body"), $user_one->name, $CONFIG->site->url . "pg/profile/" . $user_one->username)
+ );
+ }
+}
+
+/** Register the import hook */
+register_plugin_hook("import", "all", "import_relationship_plugin_hook", 3);
+
+/** Register the hook, ensuring entities are serialised first */
+register_plugin_hook("export", "all", "export_relationship_plugin_hook", 3);
+
+/** Register event to listen to some events **/
+register_elgg_event_handler('create','friend','relationship_notification_hook'); \ No newline at end of file