diff --git a/model/Versioned.php b/model/Versioned.php index 6ab3a25a4..7d54a24a4 100644 --- a/model/Versioned.php +++ b/model/Versioned.php @@ -594,7 +594,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { // Set up a new entry in (table)_versions $newManipulation = array( "command" => "insert", - "fields" => isset($manipulation[$table]['fields']) ? $manipulation[$table]['fields'] : null + "fields" => isset($manipulation[$table]['fields']) ? $manipulation[$table]['fields'] : array(), ); // Add any extra, unchanged fields to the version record. @@ -607,7 +607,8 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { $data = array_intersect_key($data, $fields); foreach ($data as $k => $v) { - if (!isset($newManipulation['fields'][$k])) { + // If the value is not set at all in the manipulation currently, use the existing value from the database + if (!array_key_exists($k, $newManipulation['fields'])) { $newManipulation['fields'][$k] = $v; } } diff --git a/tests/model/VersionedTest.php b/tests/model/VersionedTest.php index 1d25a4c52..e6f24367b 100644 --- a/tests/model/VersionedTest.php +++ b/tests/model/VersionedTest.php @@ -896,6 +896,28 @@ class VersionedTest extends SapphireTest { $this->assertTrue($public->canViewStage('Live')); $this->assertTrue($private->canViewStage('Live')); } + + /** + * Values that are overwritten with null are saved to the _versions table correctly. + */ + public function testWriteNullValueToVersion() { + $record = VersionedTest_Subclass::create(); + $record->Title = "Test A"; + $record->write(); + + $version = Versioned::get_latest_version($record->ClassName, $record->ID); + + $this->assertEquals(1, $version->Version); + $this->assertEquals($record->Title, $version->Title); + + $record->Title = null; + $record->write(); + + $version = Versioned::get_latest_version($record->ClassName, $record->ID); + + $this->assertEquals(2, $version->Version); + $this->assertEquals($record->Title, $version->Title); + } }