diff options
Diffstat (limited to 'engine/classes/ElggRelationship.php')
| -rw-r--r-- | engine/classes/ElggRelationship.php | 231 | 
1 files changed, 231 insertions, 0 deletions
| diff --git a/engine/classes/ElggRelationship.php b/engine/classes/ElggRelationship.php new file mode 100644 index 000000000..d2e88882a --- /dev/null +++ b/engine/classes/ElggRelationship.php @@ -0,0 +1,231 @@ +<?php +/** + * Relationship class. + * + * @package    Elgg.Core + * @subpackage Core + *  + * @property int    $id           The unique identifier (read-only) + * @property int    $guid_one     The GUID of the subject of the relationship + * @property string $relationship The name of the relationship + * @property int    $guid_two     The GUID of the object of the relationship + * @property int    $time_created A UNIX timestamp of when the relationship was created (read-only, set on first save) + */ +class ElggRelationship extends ElggData implements +	Importable +{ + +	/** +	 * Create a relationship object, optionally from a given id value or row. +	 * +	 * @param mixed $id ElggRelationship id, database row, or null for new relationship +	 */ +	function __construct($id = null) { +		$this->initializeAttributes(); + +		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 Name +	 * +	 * @return mixed +	 */ +	function get($name) { +		if (array_key_exists($name, $this->attributes)) { +			return $this->attributes[$name]; +		} + +		return null; +	} + +	/** +	 * Class member set overloading +	 * +	 * @param string $name  Name +	 * @param mixed  $value Value +	 * +	 * @return mixed +	 */ +	function set($name, $value) { +		$this->attributes[$name] = $value; +		return true; +	} + +	/** +	 * Save the relationship +	 * +	 * @return int the relationship id +	 * @throws IOException +	 */ +	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(elgg_echo('IOException:UnableToSaveNew', array(get_class()))); +		} + +		return $this->id; +	} + +	/** +	 * Delete a given relationship. +	 * +	 * @return bool +	 */ +	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. +	 * +	 * @return array +	 */ +	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 ODD $data ODD data + +	 * @return bool +	 * @throws ImportException|InvalidParameterException +	 */ +	public function import(ODD $data) { +		if (!($data 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(elgg_echo('ImportException:ProblemSaving', array(get_class()))); +				} + +				return true; +			} +		} + +		return false; +	} + +	// 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; +	} + +	/** +	 * 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. +	 * +	 * @param int $id ID +	 * +	 * @return ElggRelationship +	 */ +	public function getObjectFromID($id) { +		return get_relationship($id); +	} + +	/** +	 * Return a type of the object - eg. object, group, user, relationship, metadata, annotation etc +	 * +	 * @return string 'relationship' +	 */ +	public function getType() { +		return 'relationship'; +	} + +	/** +	 * Return a subtype. For metadata & annotations this is the 'name' and for relationship this +	 * is the relationship type. +	 * +	 * @return string +	 */ +	public function getSubtype() { +		return $this->relationship; +	} + +} | 
