diff options
author | cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2010-01-12 12:56:19 +0000 |
---|---|---|
committer | cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2010-01-12 12:56:19 +0000 |
commit | 8f5ac5c27f81b04bb71bab930638762c8c3e501e (patch) | |
tree | 6b9d1fec66c50b342167d17816f4c8d444406918 | |
parent | 70dafccc9b4cdef58a559fc8fa5ec640bf13af1d (diff) | |
download | elgg-8f5ac5c27f81b04bb71bab930638762c8c3e501e.tar.gz elgg-8f5ac5c27f81b04bb71bab930638762c8c3e501e.tar.bz2 |
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
-rw-r--r-- | engine/lib/entities.php | 49 | ||||
-rw-r--r-- | engine/lib/group.php | 2 | ||||
-rw-r--r-- | engine/lib/metadata.php | 6 | ||||
-rw-r--r-- | engine/lib/objects.php | 2 | ||||
-rw-r--r-- | engine/lib/sites.php | 2 | ||||
-rw-r--r-- | engine/lib/users.php | 2 | ||||
-rw-r--r-- | engine/tests/objects/objects.php | 48 | ||||
-rw-r--r-- | engine/tests/objects/users.php | 22 |
8 files changed, 85 insertions, 48 deletions
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 @@ -124,6 +124,47 @@ abstract class ElggEntity implements } /** + * 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 * then look to see if the value is in this object's metadata. @@ -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) { diff --git a/engine/lib/group.php b/engine/lib/group.php index 589e664d1..cbc34b71b 100644 --- a/engine/lib/group.php +++ b/engine/lib/group.php @@ -48,6 +48,8 @@ class ElggGroup extends ElggEntity } // Is $guid is an ElggGroup? Use a copy constructor else if ($guid instanceof ElggGroup) { + elgg_log('This type of usage of the ElggGroup constructor was deprecated in 1.7. Please use the clone method.', 'WARNING'); + foreach ($guid->attributes as $key => $value) { $this->attributes[$key] = $value; } diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php index dbe021414..955939e42 100644 --- a/engine/lib/metadata.php +++ b/engine/lib/metadata.php @@ -183,9 +183,9 @@ function remove_metadata($entity_guid, $name, $value = "") { /** * Create a new metadata object, or update an existing one. * - * @param int $entity_guid - * @param string $name - * @param string $value + * @param int $entity_guid The entity to attach the metadata to + * @param string $name Name of the metadata + * @param string $value Value of the metadata (cannot be associative array) * @param string $value_type * @param int $owner_guid * @param int $access_id diff --git a/engine/lib/objects.php b/engine/lib/objects.php index e4c3128b9..f2faf0d10 100644 --- a/engine/lib/objects.php +++ b/engine/lib/objects.php @@ -54,6 +54,8 @@ class ElggObject extends ElggEntity { // Is $guid is an ElggObject? Use a copy constructor else if ($guid instanceof ElggObject) { + elgg_log('This type of usage of the ElggObject constructor was deprecated in 1.7. Please use the clone method.', 'WARNING'); + foreach ($guid->attributes as $key => $value) { $this->attributes[$key] = $value; } diff --git a/engine/lib/sites.php b/engine/lib/sites.php index d38113d27..0892f2963 100644 --- a/engine/lib/sites.php +++ b/engine/lib/sites.php @@ -54,6 +54,8 @@ class ElggSite extends ElggEntity { // Is $guid is an ElggSite? Use a copy constructor else if ($guid instanceof ElggSite) { + elgg_log('This type of usage of the ElggSite constructor was deprecated in 1.7. Please use the clone method.', 'WARNING'); + foreach ($guid->attributes as $key => $value) { $this->attributes[$key] = $value; } diff --git a/engine/lib/users.php b/engine/lib/users.php index 7ef9e2fda..512b8a6e6 100644 --- a/engine/lib/users.php +++ b/engine/lib/users.php @@ -75,6 +75,8 @@ class ElggUser extends ElggEntity // Is $guid is an ElggUser? Use a copy constructor else if ($guid instanceof ElggUser) { + elgg_log('This type of usage of the ElggUser constructor was deprecated in 1.7. Please use the clone method.', 'WARNING'); + foreach ($guid->attributes as $key => $value) { $this->attributes[$key] = $value; } diff --git a/engine/tests/objects/objects.php b/engine/tests/objects/objects.php index d30e4fae4..8209917bf 100644 --- a/engine/tests/objects/objects.php +++ b/engine/tests/objects/objects.php @@ -103,30 +103,40 @@ class ElggCoreObjectTest extends ElggCoreUnitTest { // clean up $this->entity->delete(); } - - public function testElggObjectConstructorByObject() { - $guid = $this->entity->save(); - // stdClass: use guid - $object_row = $this->get_object_row($guid); - $entity_row = $this->get_entity_row($guid); - $this->assertIdentical($this->entity, new ElggObjectTest($object_row)); - $this->assertIdentical($this->entity, new ElggObjectTest($entity_row)); + public function testElggObjectClone() { + $this->entity->title = 'testing'; + $this->entity->description = 'ElggObject'; + $this->entity->var1 = "test"; + $this->entity->var2 = 1; + $this->entity->var3 = true; + $this->entity->save(); - // copy attributes of ElggObject - $this->assertIdentical($this->entity, new ElggObjectTest($this->entity)); + // add tag array + $tag_string = 'tag1, tag2, tag3'; + $tagarray = string_to_tag_array($tag_string); + $this->entity->tags = $tagarray; - // error on ElggEntity - $entity = new ElggEntityTest($guid); - try { - $error = new ElggObjectTest($entity); - $this->assertTrue(FALSE); - } catch (Exception $e) { - $this->assertIsA($e, 'InvalidParameterException'); - $this->assertIdentical($e->getMessage(), elgg_echo('InvalidParameterException:NonElggObject')); - } + // a cloned ElggEntity has the guid reset + $object = clone $this->entity; + $this->assertIdentical(0, (int)$object->guid); + + // make sure attributes were copied over + $this->assertIdentical($object->title, 'testing'); + $this->assertIdentical($object->description, 'ElggObject'); + + $guid = $object->save(); + $this->assertTrue($guid !== 0); + $this->assertTrue($guid !== $this->entity->guid); + + // test that metadata was transfered + $this->assertIdentical($this->entity->var1, $object->var1); + $this->assertIdentical($this->entity->var2, $object->var2); + $this->assertIdentical($this->entity->var3, $object->var3); + $this->assertIdentical($this->entity->tags, $object->tags); // clean up + $object->delete(); $this->entity->delete(); } diff --git a/engine/tests/objects/users.php b/engine/tests/objects/users.php index c1403af1a..c03091a91 100644 --- a/engine/tests/objects/users.php +++ b/engine/tests/objects/users.php @@ -119,29 +119,7 @@ class ElggCoreUserTest extends ElggCoreUnitTest { $user = new ElggUser($row->username); $this->assertIdentical($user, $_SESSION['user']); } - - public function testElggUserConstructorByObject() { - $obj = new ElggUser(get_loggedin_userid()); - $user = new ElggUser($obj); - $this->assertIdentical($obj, $user); - $this->assertIdentical($user, $_SESSION['user']); - - // fail on non-user object - $object = new ElggObject(); - $object->save(); - - try { - $error = new ElggUserTest($object); - $this->assertTrue(FALSE); - } catch (Exception $e) { - $this->assertIsA($e, 'InvalidParameterException'); - $message = sprintf(elgg_echo('InvalidParameterException:NonElggUser')); - $this->assertIdentical($e->getMessage(), $message); - } - $object->delete(); - } - public function testElggUserSave() { // new object $this->AssertEqual($this->user->getGUID(), 0); |