From 4e08e618308d7dedfd3983d015950c81e7403e29 Mon Sep 17 00:00:00 2001 From: icewing Date: Tue, 1 Apr 2008 17:15:12 +0000 Subject: Marcus Povey * Moved common functionality of metadata and annotations into superclass. git-svn-id: https://code.elgg.org/elgg/trunk@323 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/annotations.php | 88 ++++++---------------------- engine/lib/extender.php | 141 +++++++++++++++++++++++++++++++++++++++++++++ engine/lib/metadata.php | 70 +++++----------------- 3 files changed, 173 insertions(+), 126 deletions(-) create mode 100644 engine/lib/extender.php (limited to 'engine') diff --git a/engine/lib/annotations.php b/engine/lib/annotations.php index b0e01ad31..26664757a 100644 --- a/engine/lib/annotations.php +++ b/engine/lib/annotations.php @@ -11,18 +11,15 @@ * @link http://elgg.org/ */ + require_once('extender.php'); // include the superclass + /** * @class ElggAnnotation * An annotation is similar to metadata each entity can contain more than one of each annotation. * @author Marcus Povey */ - class ElggAnnotation implements Exportable + class ElggAnnotation extends ElggExtender { - /** - * This contains the site's main properties (id, etc) - * @var array - */ - private $attributes; /** * Construct a new site object, optionally from a given id value or db row. @@ -49,40 +46,11 @@ } function __get($name) { - if (isset($this->attributes[$name])) { - - // Sanitise outputs if required - if ($name=='value') - { - switch ($this->attributes['value_type']) - { - case 'integer' : return (int)$this->attributes['value']; - case 'tag' : - case 'text' : - case 'file' : return sanitise_string($this->attributes['value']); - - default : throw new InstallationException("Type {$this->attributes['value_type']} is not supported. This indicates an error in your installation, most likely caused by an incomplete upgrade."); - } - } - - return $this->attributes[$name]; - } - return null; + return $this->get($name); } function __set($name, $value) { - $this->attributes[$name] = $value; - return true; - } - - /** - * Return the owner of this annotation. - * - * @return mixed - */ - function getOwner() - { - return get_user($this->owner_guid); + return $this->set($name, $value); } function save() @@ -104,14 +72,7 @@ { return delete_annotation($this->id); } - - public function export() - { - $tmp = new stdClass; - $tmp->attributes = $this->attributes; - $tmp->attributes['owner_uuid'] = guid_to_uuid($this->owner_guid); - return $tmp; - } + } /** @@ -452,42 +413,29 @@ /** * Handler called by trigger_plugin_hook on the "export" event. */ - function export_annotations_plugin_hook($hook, $entity_type, $returnvalue, $params) + function export_annotation_plugin_hook($hook, $entity_type, $returnvalue, $params) { - global $CONFIG; - // Sanity check values if ((!is_array($params)) && (!isset($params['guid']))) throw new InvalidParameterException("GUID has not been specified during export, this should never happen."); if (!is_array($returnvalue)) throw new InvalidParameterException("Entity serialisation function passed a non-array returnvalue parameter"); - - $guid = (int)$params['guid']; - $access = get_access_list(); - $where = array(); - - if ($guid != 0) - $where[] = "a.entity_guid=$guid"; - - $query = "SELECT a.*, n.string as name, v.string as value from {$CONFIG->dbprefix}annotations a JOIN {$CONFIG->dbprefix}entities e on a.entity_guid = e.guid JOIN {$CONFIG->dbprefix}metastrings v on a.value_id=v.id JOIN {$CONFIG->dbprefix}metastrings n on a.name_id = n.id where "; - foreach ($where as $w) - $query .= " $w and "; - $query .= " (a.access_id in {$access} or (a.access_id = 0 and a.owner_guid = {$_SESSION['id']}))"; // Add access controls - $query .= " order by a.time_created"; // Add order and limit - error_log($query); - $annotations = get_data($query, "row_to_elggannotation"); + $guid = (int)$params['guid']; + $name = $params['name']; - if ($annotations) + $result = get_annotations($guid); + + if ($result) { - foreach ($annotations as $a) - $returnvalue[] = $a; - } - + foreach ($result as $r) + $returnvalue[] = $r; + } + return $returnvalue; } - /** Register the hook, ensuring entities are serialised first */ - register_plugin_hook("export", "all", "export_annotations_plugin_hook", 2); + /** Register the hook */ + register_plugin_hook("export", "all", "export_annotation_plugin_hook", 2); ?> \ No newline at end of file diff --git a/engine/lib/extender.php b/engine/lib/extender.php new file mode 100644 index 000000000..f15aaa1ee --- /dev/null +++ b/engine/lib/extender.php @@ -0,0 +1,141 @@ +attributes[$name])) { + + // Sanitise value if necessary + if ($name=='value') + { + switch ($this->attributes['value_type']) + { + case 'integer' : return (int)$this->attributes['value']; + case 'tag' : + case 'text' : + case 'file' : return sanitise_string($this->attributes['value']); + + default : throw new InstallationException("Type {$this->attributes['value_type']} is not supported. This indicates an error in your installation, most likely caused by an incomplete upgrade."); + } + } + + return $this->attributes[$name]; + } + return null; + } + + protected function set($name, $value) { + $this->attributes[$name] = $value; + return true; + } + + /** + * Return the owner of this annotation. + * + * @return mixed + */ + public function getOwner() + { + return get_user($this->owner_guid); + } + + /** + * Save this data to the appropriate database table. + */ + abstract public function save(); + + /** + * Delete this data. + */ + abstract public function delete(); + + public function export() + { + $tmp = new stdClass; + $tmp->attributes = $this->attributes; + $tmp->attributes['owner_uuid'] = guid_to_uuid($this->owner_guid); + return $tmp; + } + + public function import(array $data, $version = 1) + { + if ($version == 1) + { + $entity_uuid = NULL; + + // Get attributes + foreach ($data['elements'][0]['elements'] as $attr) + { + $name = strtolower($attr['name']); + $text = $attr['text']; + + switch ($name) + { + case 'entity_uuid' : $entity_uuid = $text; break; + default : $this->attributes[$name] = $text; + } + + // See if this entity has already been imported, if so then we need to link to it + $entity = get_entity_from_uuid($entity_uuid); + if (!$entity) + throw new ImportException("Sorry $entity_uuid was not found. Could not import annotation."); + + // Set owner ID + $this->attributes['owner_guid'] = $entity->getGUID(); + + return $this; + } + } + else + throw new ImportException("Unsupported version ($version) passed to ElggAnnotation::import()"); + } + } + + /** + * Handler called by trigger_plugin_hook on the "import" event. + */ + function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params) + { + $name = $params['name']; + $element = $params['element']; + + $tmp = NULL; + + switch ($name) + { + case 'ElggAnnotation' : $tmp = new ElggAnnotation(); break; + case 'ElggMetadata' : $tmp = new ElggMetadata(); break; + } + + if ($tmp) + { + $tmp->import($element); + return $tmp; + } + } + + /** Register the hook */ + register_plugin_hook("import", "all", "import_extender_plugin_hook", 2); + +?> \ No newline at end of file diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php index 82ca71bdd..573ea8f4f 100644 --- a/engine/lib/metadata.php +++ b/engine/lib/metadata.php @@ -16,14 +16,9 @@ * This class describes metadata that can be attached to ElggEntities. * @author Marcus Povey */ - class ElggMetadata implements Exportable + class ElggMetadata extends ElggExtender { - /** - * This contains the site's main properties (id, etc) - * @var array - */ - private $attributes; - + /** * Construct a new site object, optionally from a given id value or row. * @@ -50,40 +45,11 @@ } 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 'text' : - case 'file' : return sanitise_string($this->attributes['value']); - - default : throw new InstallationException("Type {$this->attributes['value_type']} is not supported. This indicates an error in your installation, most likely caused by an incomplete upgrade."); - } - } - - return $this->attributes[$name]; - } - return null; + return $this->get($name); } function __set($name, $value) { - $this->attributes[$name] = $value; - return true; - } - - /** - * Return the owner of this metadata. - * - * @return mixed - */ - function getOwner() - { - return get_user($this->owner_guid); + return $this->set($name, $value); } function save() @@ -107,13 +73,6 @@ return delete_metadata($this->id); } - public function export() - { - $tmp = new stdClass; - $tmp->attributes = $this->attributes; - $tmp->attributes['owner_uuid'] = guid_to_uuid($this->owner_guid); - return $tmp; - } } @@ -394,22 +353,21 @@ if (!is_array($returnvalue)) throw new InvalidParameterException("Entity serialisation function passed a non-array returnvalue parameter"); - - $guid = (int)$params['guid']; - // Get the metadata for the entity - $metadata = get_metadata_for_entity($guid); + $guid = (int)$params['guid']; + $name = $params['name']; - if ($metadata) + $result = get_metadata_for_entity($guid); + + if ($result) { - foreach ($metadata as $m) - $returnvalue[] = $m; - } - + foreach ($result as $r) + $returnvalue[] = $r; + } + return $returnvalue; } - /** Register the hook, ensuring entities are serialised first */ + /** Register the hook */ register_plugin_hook("export", "all", "export_metadata_plugin_hook", 2); - ?> \ No newline at end of file -- cgit v1.2.3