From 8f5ac5c27f81b04bb71bab930638762c8c3e501e Mon Sep 17 00:00:00 2001 From: cash Date: Tue, 12 Jan 2010 12:56:19 +0000 Subject: closes #1145 - deprecated current "copy constructor" for all entities and implemented a clone method. The clone copies over all metadata but not annotations and private settings. It sets the guid to 0 so saving the cloned entity creates a new database record. The ownership/access of metadata is set during the save and will be the same as that of the entity. git-svn-id: http://code.elgg.org/elgg/trunk@3802 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/entities.php | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) (limited to 'engine/lib/entities.php') diff --git a/engine/lib/entities.php b/engine/lib/entities.php index 1c833ab29..7b5cd22a3 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -123,6 +123,47 @@ abstract class ElggEntity implements $this->attributes['tables_loaded'] = 0; } + /** + * Clone an entity + * + * Resets the guid so that the entity can be saved as a distinct entity from + * the original. Creation time will be set when this new entity is saved. + * The owner and container guids come from the original entity. The clone + * method copies metadata but does not copy over annotations, or private settings. + * + * Note: metadata will have its owner and access id set when the entity is saved + * and it will be the same as that off the entity. + */ + public function __clone() { + + $orig_entity = get_entity($this->guid); + if (!$orig_entity) { + elgg_log("Failed to clone entity with GUID $this->guid", "ERROR"); + return; + } + + $metadata_array = get_metadata_for_entity($this->guid); + + $this->attributes['guid'] = ""; + + // copy metadata over to new entity - slightly convoluted due to + // handling of metadata arrays + if (is_array($metadata_array)) { + // create list of metadata names + $metadata_names = array(); + foreach ($metadata_array as $metadata) { + $metadata_names[] = $metadata['name']; + } + // arrays are stored with multiple enties per name + $metadata_names = array_unique($metadata_names); + + // move the metadata over + foreach ($metadata_names as $name) { + $this->set($name, $orig_entity->$name); + } + } + } + /** * Return the value of a given key. * If $name is a key field (as defined in $this->attributes) that value is returned, otherwise it will @@ -265,10 +306,10 @@ abstract class ElggEntity implements /** * Set a piece of metadata. * - * @param string $name - * @param mixed $value - * @param string $value_type - * @param bool $multiple + * @param string $name Name of the metadata + * @param mixed $value Value of the metadata + * @param string $value_type Types supported: integer and string. Will auto-identify if not set + * @param bool $multiple * @return bool */ public function setMetaData($name, $value, $value_type = "", $multiple = false) { -- cgit v1.2.3