Merge pull request #5735 from silverstripe-terraformers/versions

FIX: Saving null values to the _versions table.
This commit is contained in:
Damian Mooyman 2016-07-14 13:30:30 +12:00 committed by GitHub
commit 3b43145954
2 changed files with 26 additions and 2 deletions

View File

@ -774,7 +774,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'] : [],
"class" => $class,
);
@ -788,7 +788,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;
}
}

View File

@ -1036,6 +1036,29 @@ 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);
}
}