aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/extender.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib/extender.php')
-rw-r--r--engine/lib/extender.php851
1 files changed, 435 insertions, 416 deletions
diff --git a/engine/lib/extender.php b/engine/lib/extender.php
index 456a1f778..cbcdd6eb7 100644
--- a/engine/lib/extender.php
+++ b/engine/lib/extender.php
@@ -1,450 +1,469 @@
<?php
+/**
+ * Elgg Entity Extender.
+ * This file contains ways of extending an Elgg entity in custom ways.
+ *
+ * @package Elgg
+ * @subpackage Core
+ * @author Curverider Ltd
+ * @link http://elgg.org/
+ */
+
+/**
+ * ElggExtender
+ *
+ * @author Curverider Ltd
+ * @package Elgg
+ * @subpackage Core
+ */
+abstract class ElggExtender implements
+ Exportable,
+ Loggable, // Can events related to this object class be logged
+ Iterator, // Override foreach behaviour
+ ArrayAccess // Override for array access
+{
/**
- * Elgg Entity Extender.
- * This file contains ways of extending an Elgg entity in custom ways.
- *
- * @package Elgg
- * @subpackage Core
- * @author Curverider Ltd
- * @link http://elgg.org/
+ * This contains the site's main properties (id, etc)
+ * @var array
*/
+ protected $attributes;
/**
- * ElggExtender
- *
- * @author Curverider Ltd
- * @package Elgg
- * @subpackage Core
+ * Get an attribute
+ *
+ * @param string $name
+ * @return mixed
*/
- abstract class ElggExtender implements
- 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;
-
- /**
- * Get an attribute
- *
- * @param string $name
- * @return mixed
- */
- protected function get($name) {
- if (isset($this->attributes[$name])) {
-
- // Sanitise value if necessary
- if ($name=='value')
- {
- switch ($this->attributes['value_type'])
- {
- case 'integer' : return (int)$this->attributes['value'];
- //case 'tag' :
- //case 'file' :
- case 'text' : return ($this->attributes['value']);
-
- default : throw new InstallationException(sprintf(elgg_echo('InstallationException:TypeNotSupported'), $this->attributes['value_type']));
- }
+ protected function get($name) {
+ if (isset($this->attributes[$name])) {
+ // Sanitise value if necessary
+ if ($name=='value') {
+ switch ($this->attributes['value_type']) {
+ case 'integer' :
+ return (int)$this->attributes['value'];
+
+ //case 'tag' :
+ //case 'file' :
+ case 'text' :
+ return ($this->attributes['value']);
+
+ default :
+ throw new InstallationException(sprintf(elgg_echo('InstallationException:TypeNotSupported'), $this->attributes['value_type']));
}
-
- return $this->attributes[$name];
}
- return null;
- }
-
- /**
- * Set an attribute
- *
- * @param string $name
- * @param mixed $value
- * @param string $value_type
- * @return boolean
- */
- protected function set($name, $value, $value_type = "") {
-
- $this->attributes[$name] = $value;
- if ($name == 'value')
- $this->attributes['value_type'] = detect_extender_valuetype($value, $value_type);
-
- return true;
- }
-
- /**
- * Return the owner of this annotation.
- *
- * @return mixed
- */
- public function getOwner()
- {
- return $this->owner_guid;
- }
- /**
- * Return the owner entity
- *
- * @return mixed
- */
- public function getOwnerEntity()
- {
- return get_user($this->owner_guid);
+ return $this->attributes[$name];
}
-
- /**
- * Returns the entity this is attached to
- *
- * @return ElggEntity The enttiy
- */
- public function getEntity() {
- return get_entity($this->entity_guid);
- }
-
- /**
- * Save this data to the appropriate database table.
- */
- abstract public function save();
-
- /**
- * Delete this data.
- */
- abstract public function delete();
-
- /**
- * Determines whether or not the specified user can edit this
- *
- * @param int $user_guid The GUID of the user (defaults to currently logged in user)
- * @return true|false
- */
- public function canEdit($user_guid = 0) {
- return can_edit_extender($this->id,$this->type,$user_guid);
- }
-
- /**
- * Return a url for this extender.
- *
- * @return string
- */
- public abstract function getURL();
-
- // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
-
- /**
- * Return an array of fields which can be exported.
- */
- public function getExportableValues()
- {
- return array(
- 'id',
- 'entity_guid',
- 'name',
- 'value',
- 'value_type',
- 'owner_guid',
- 'type',
- );
- }
-
- /**
- * Export this object
- *
- * @return array
- */
- public function export()
- {
- $uuid = get_uuid_from_object($this);
-
- $meta = new ODDMetadata($uuid, guid_to_uuid($this->entity_guid), $this->attributes['name'], $this->attributes['value'], $this->attributes['type'], guid_to_uuid($this->owner_guid));
- $meta->setAttribute('published', date("r", $this->time_created));
-
- return $meta;
- }
-
- // 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); }
-
- /**
- * 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 $this->type; }
-
- /**
- * Return a subtype. For metadata & annotations this is the 'name' and for relationship this is the relationship type.
- */
- public function getSubtype() { return $this->name; }
-
-
- // 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);
- }
- }
-
+ return null;
+ }
+
/**
- * Detect the value_type for a given value.
- * Currently this is very crude.
- *
- * TODO: Make better!
+ * Set an attribute
*
+ * @param string $name
* @param mixed $value
- * @param string $value_type If specified, overrides the detection.
- * @return string
+ * @param string $value_type
+ * @return boolean
*/
- function detect_extender_valuetype($value, $value_type = "")
- {
- if ($value_type!="")
- return $value_type;
-
- // This is crude
- if (is_int($value)) return 'integer';
- if (is_numeric($value)) return 'text'; // Catch floating point values which are not integer
-
- return 'text';
+ protected function set($name, $value, $value_type = "") {
+ $this->attributes[$name] = $value;
+ if ($name == 'value') {
+ $this->attributes['value_type'] = detect_extender_valuetype($value, $value_type);
+ }
+
+ return true;
}
-
+
/**
- * Utility function used by import_extender_plugin_hook() to process an ODDMetaData and add it to an entity.
- * This function does not hit ->save() on the entity (this lets you construct in memory)
+ * Return the owner of this annotation.
*
- * @param ElggEntity The entity to add the data to.
- * @param ODDMetaData $element The OpenDD element
- * @return bool
+ * @return mixed
*/
- function oddmetadata_to_elggextender(ElggEntity $entity, ODDMetaData $element)
- {
- // Get the type of extender (metadata, type, attribute etc)
- $type = $element->getAttribute('type');
- $attr_name = $element->getAttribute('name');
- $attr_val = $element->getBody();
-
- switch ($type)
- {
- case 'volatile' : break; // Ignore volatile items
- case 'annotation' :
- $entity->annotate($attr_name, $attr_val);
- break;
- case 'metadata' :
- $entity->setMetaData($attr_name, $attr_val, "", true);
- break;
- default : // Anything else assume attribute
- $entity->set($attr_name, $attr_val);
- }
-
- // Set time if appropriate
- $attr_time = $element->getAttribute('published');
- if ($attr_time)
- $entity->set('time_updated', $attr_time);
-
- return true;
+ public function getOwner() {
+ return $this->owner_guid;
}
-
+
/**
- * Handler called by trigger_plugin_hook on the "import" event.
+ * Return the owner entity
+ *
+ * @return mixed
*/
- function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params)
- {
- $element = $params['element'];
-
- $tmp = NULL;
-
- if ($element instanceof ODDMetaData)
- {
- // Recall entity
- $entity_uuid = $element->getAttribute('entity_uuid');
- $entity = get_entity_from_uuid($entity_uuid);
- if (!$entity)
- throw new ImportException(sprintf(elgg_echo('ImportException:GUIDNotFound'), $entity_uuid));
-
- oddmetadata_to_elggextender($entity, $element);
-
- // Save
- if (!$entity->save())
- throw new ImportException(sprintf(elgg_echo('ImportException:ProblemUpdatingMeta'), $attr_name, $entity_uuid));
-
- return true;
- }
+ public function getOwnerEntity() {
+ return get_user($this->owner_guid);
+ }
+
+ /**
+ * Returns the entity this is attached to
+ *
+ * @return ElggEntity The enttiy
+ */
+ public function getEntity() {
+ return get_entity($this->entity_guid);
}
-
+
/**
- * Determines whether or not the specified user can edit the specified piece of extender
+ * Save this data to the appropriate database table.
+ */
+ abstract public function save();
+
+ /**
+ * Delete this data.
+ */
+ abstract public function delete();
+
+ /**
+ * Determines whether or not the specified user can edit this
*
- * @param int $extender_id The ID of the piece of extender
- * @param string $type 'metadata' or 'annotation'
- * @param int $user_guid The GUID of the user
+ * @param int $user_guid The GUID of the user (defaults to currently logged in user)
* @return true|false
*/
- function can_edit_extender($extender_id, $type, $user_guid = 0) {
-
- if (!isloggedin())
- return false;
-
- $user_guid = (int)$user_guid;
- $user = get_entity($user_guid);
- if (!$user) $user = get_loggedin_user();
-
- $functionname = "get_{$type}";
- if (is_callable($functionname)) {
- $extender = $functionname($extender_id);
- } else return false;
-
- if (!is_a($extender,"ElggExtender")) return false;
-
- // If the owner is the specified user, great! They can edit.
- if ($extender->getOwner() == $user->getGUID()) return true;
-
- // If the user can edit the entity this is attached to, great! They can edit.
- if (can_edit_entity($extender->entity_guid,$user->getGUID())) return true;
-
- // Trigger plugin hooks
- return trigger_plugin_hook('permissions_check',$type,array('entity' => $entity, 'user' => $user),false);
-
- }
-
+ public function canEdit($user_guid = 0) {
+ return can_edit_extender($this->id,$this->type,$user_guid);
+ }
+
/**
- * Sets the URL handler for a particular extender type and name.
- * It is recommended that you do not call this directly, instead use one of the wrapper functions in the
- * subtype files.
+ * Return a url for this extender.
*
- * @param string $function_name The function to register
- * @param string $extender_type Extender type
- * @param string $extender_name The name of the extender
- * @return true|false Depending on success
+ * @return string
*/
- function register_extender_url_handler($function_name, $extender_type = "all", $extender_name = "all") {
- global $CONFIG;
-
- if (!is_callable($function_name)) return false;
-
- if (!isset($CONFIG->extender_url_handler)) {
- $CONFIG->extender_url_handler = array();
- }
- if (!isset($CONFIG->extender_url_handler[$extender_type])) {
- $CONFIG->extender_url_handler[$extender_type] = array();
- }
- $CONFIG->extender_url_handler[$extender_type][$extender_name] = $function_name;
-
- return true;
-
+ public abstract function getURL();
+
+ // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Return an array of fields which can be exported.
+ */
+ public function getExportableValues() {
+ return array(
+ 'id',
+ 'entity_guid',
+ 'name',
+ 'value',
+ 'value_type',
+ 'owner_guid',
+ 'type',
+ );
}
-
+
/**
- * Get the URL of a given elgg extender.
- * Used by get_annotation_url and get_metadata_url.
+ * Export this object
*
- * @param ElggExtender $extender
+ * @return array
*/
- function get_extender_url(ElggExtender $extender)
- {
- global $CONFIG;
-
- $view = elgg_get_viewtype();
-
- $guid = $extender->entity_guid;
- $type = $extender->type;
-
- $url = "";
-
- $function = "";
- if (isset($CONFIG->extender_url_handler[$type][$extender->name]))
- $function = $CONFIG->extender_url_handler[$type][$extender->name];
- if (isset($CONFIG->extender_url_handler[$type]['all']))
- $function = $CONFIG->extender_url_handler[$type]['all'];
- if (isset($CONFIG->extender_url_handler['all']['all']))
- $function = $CONFIG->extender_url_handler['all']['all'];
-
- if (is_callable($function)) {
- $url = $function($extender);
+ public function export() {
+ $uuid = get_uuid_from_object($this);
+
+ $meta = new ODDMetadata($uuid, guid_to_uuid($this->entity_guid), $this->attributes['name'], $this->attributes['value'], $this->attributes['type'], guid_to_uuid($this->owner_guid));
+ $meta->setAttribute('published', date("r", $this->time_created));
+
+ return $meta;
+ }
+
+ // 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);
+ }
+
+ /**
+ * 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 $this->type;
+ }
+
+ /**
+ * Return a subtype. For metadata & annotations this is the 'name' and
+ * for relationship this is the relationship type.
+ */
+ public function getSubtype() {
+ return $this->name;
+ }
+
+
+ // 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];
}
-
- if ($url == "") {
- $nameid = $extender->id;
- if ($type == 'volatile')
- $nameid== $extender->name;
- $url = $CONFIG->wwwroot . "export/$view/$guid/$type/$nameid/";
- }
- return $url;
- }
-
- /** Register the hook */
- register_plugin_hook("import", "all", "import_extender_plugin_hook", 2);
-
-?>
+ }
+
+ function offsetUnset($key) {
+ if ( array_key_exists($key, $this->attributes) ) {
+ // Full unsetting is dangerious for our objects
+ $this->attributes[$key] = "";
+ }
+ }
+
+ function offsetExists($offset) {
+ return array_key_exists($offset, $this->attributes);
+ }
+}
+
+/**
+ * Detect the value_type for a given value.
+ * Currently this is very crude.
+ *
+ * TODO: Make better!
+ *
+ * @param mixed $value
+ * @param string $value_type If specified, overrides the detection.
+ * @return string
+ */
+function detect_extender_valuetype($value, $value_type = "") {
+ if ($value_type!="") {
+ return $value_type;
+ }
+
+ // This is crude
+ if (is_int($value)) {
+ return 'integer';
+ }
+ // Catch floating point values which are not integer
+ if (is_numeric($value)) {
+ return 'text';
+ }
+
+ return 'text';
+}
+
+/**
+ * Utility function used by import_extender_plugin_hook() to process an ODDMetaData and add it to an entity.
+ * This function does not hit ->save() on the entity (this lets you construct in memory)
+ *
+ * @param ElggEntity The entity to add the data to.
+ * @param ODDMetaData $element The OpenDD element
+ * @return bool
+ */
+function oddmetadata_to_elggextender(ElggEntity $entity, ODDMetaData $element) {
+ // Get the type of extender (metadata, type, attribute etc)
+ $type = $element->getAttribute('type');
+ $attr_name = $element->getAttribute('name');
+ $attr_val = $element->getBody();
+
+ switch ($type) {
+ // Ignore volatile items
+ case 'volatile' :
+ break;
+ case 'annotation' :
+ $entity->annotate($attr_name, $attr_val);
+ break;
+ case 'metadata' :
+ $entity->setMetaData($attr_name, $attr_val, "", true);
+ break;
+ default : // Anything else assume attribute
+ $entity->set($attr_name, $attr_val);
+ }
+
+ // Set time if appropriate
+ $attr_time = $element->getAttribute('published');
+ if ($attr_time) {
+ $entity->set('time_updated', $attr_time);
+ }
+
+ return true;
+}
+
+/**
+ * Handler called by trigger_plugin_hook on the "import" event.
+ */
+function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ $element = $params['element'];
+
+ $tmp = NULL;
+
+ if ($element instanceof ODDMetaData) {
+ // Recall entity
+ $entity_uuid = $element->getAttribute('entity_uuid');
+ $entity = get_entity_from_uuid($entity_uuid);
+ if (!$entity) {
+ throw new ImportException(sprintf(elgg_echo('ImportException:GUIDNotFound'), $entity_uuid));
+ }
+
+ oddmetadata_to_elggextender($entity, $element);
+
+ // Save
+ if (!$entity->save()) {
+ throw new ImportException(sprintf(elgg_echo('ImportException:ProblemUpdatingMeta'), $attr_name, $entity_uuid));
+ }
+
+ return true;
+ }
+}
+
+/**
+ * Determines whether or not the specified user can edit the specified piece of extender
+ *
+ * @param int $extender_id The ID of the piece of extender
+ * @param string $type 'metadata' or 'annotation'
+ * @param int $user_guid The GUID of the user
+ * @return true|false
+ */
+function can_edit_extender($extender_id, $type, $user_guid = 0) {
+ if (!isloggedin()) {
+ return false;
+ }
+
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+ if (!$user) {
+ $user = get_loggedin_user();
+ }
+
+ $functionname = "get_{$type}";
+ if (is_callable($functionname)) {
+ $extender = $functionname($extender_id);
+ } else {
+ return false;
+ }
+
+ if (!is_a($extender,"ElggExtender")) {
+ return false;
+ }
+
+ // If the owner is the specified user, great! They can edit.
+ if ($extender->getOwner() == $user->getGUID()) {
+ return true;
+ }
+
+ // If the user can edit the entity this is attached to, great! They can edit.
+ if (can_edit_entity($extender->entity_guid,$user->getGUID())) {
+ return true;
+ }
+
+ // Trigger plugin hooks
+ return trigger_plugin_hook('permissions_check',$type,array('entity' => $entity, 'user' => $user),false);
+}
+
+/**
+ * Sets the URL handler for a particular extender type and name.
+ * It is recommended that you do not call this directly, instead use one of the wrapper functions in the
+ * subtype files.
+ *
+ * @param string $function_name The function to register
+ * @param string $extender_type Extender type
+ * @param string $extender_name The name of the extender
+ * @return true|false Depending on success
+ */
+function register_extender_url_handler($function_name, $extender_type = "all", $extender_name = "all") {
+ global $CONFIG;
+
+ if (!is_callable($function_name)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->extender_url_handler)) {
+ $CONFIG->extender_url_handler = array();
+ }
+ if (!isset($CONFIG->extender_url_handler[$extender_type])) {
+ $CONFIG->extender_url_handler[$extender_type] = array();
+ }
+ $CONFIG->extender_url_handler[$extender_type][$extender_name] = $function_name;
+
+ return true;
+}
+
+/**
+ * Get the URL of a given elgg extender.
+ * Used by get_annotation_url and get_metadata_url.
+ *
+ * @param ElggExtender $extender
+ */
+function get_extender_url(ElggExtender $extender) {
+ global $CONFIG;
+
+ $view = elgg_get_viewtype();
+
+ $guid = $extender->entity_guid;
+ $type = $extender->type;
+
+ $url = "";
+
+ $function = "";
+ if (isset($CONFIG->extender_url_handler[$type][$extender->name])) {
+ $function = $CONFIG->extender_url_handler[$type][$extender->name];
+ }
+
+ if (isset($CONFIG->extender_url_handler[$type]['all'])) {
+ $function = $CONFIG->extender_url_handler[$type]['all'];
+ }
+
+ if (isset($CONFIG->extender_url_handler['all']['all'])) {
+ $function = $CONFIG->extender_url_handler['all']['all'];
+ }
+
+ if (is_callable($function)) {
+ $url = $function($extender);
+ }
+
+ if ($url == "") {
+ $nameid = $extender->id;
+ if ($type == 'volatile') {
+ $nameid== $extender->name;
+ }
+ $url = $CONFIG->wwwroot . "export/$view/$guid/$type/$nameid/";
+ }
+ return $url;
+}
+
+/** Register the hook */
+register_plugin_hook("import", "all", "import_extender_plugin_hook", 2); \ No newline at end of file