From 375bbf954e0b1d24e6119edec267608a8d0ec85c Mon Sep 17 00:00:00 2001 From: Tyler Kidd Date: Tue, 23 Feb 2016 14:53:52 -0600 Subject: [PATCH] Enhancement and fix for issue #3186 --- model/Versioned.php | 49 +++++++--- tests/model/VersionableExtensionsFixtures.yml | 3 + tests/model/VersionableExtensionsTest.php | 97 +++++++++++++++++++ 3 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 tests/model/VersionableExtensionsFixtures.yml create mode 100644 tests/model/VersionableExtensionsTest.php diff --git a/model/Versioned.php b/model/Versioned.php index 91c3199d8..17c3c926a 100644 --- a/model/Versioned.php +++ b/model/Versioned.php @@ -112,6 +112,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { 'PublisherID' => true, ); + /** * An array of DataObject extensions that may require versioning for extra tables * The array value is a set of suffixes to form these table names, assuming a preceding '_'. @@ -123,6 +124,23 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { * 'Extension2' => array('suffix2', 'suffix3'), * ); * + * This can also be manipulated by updating the current loaded config + * + * SiteTree: + * versionableExtensions: + * - Extension1: + * - suffix1 + * - suffix2 + * - Extension2: + * - suffix1 + * - suffix2 + * + * or programatically: + * + * Config::inst()->update($this->owner->class, 'versionableExtensions', + * array('Extension1' => 'suffix1', 'Extension2' => array('suffix2', 'suffix3'))); + * + * * Make sure your extension has a static $enabled-property that determines if it is * processed by Versioned. * @@ -387,13 +405,18 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { // Build a list of suffixes whose tables need versioning $allSuffixes = array(); - foreach (Versioned::$versionableExtensions as $versionableExtension => $suffixes) { - if ($this->owner->hasExtension($versionableExtension)) { - $allSuffixes = array_merge($allSuffixes, (array)$suffixes); - foreach ((array)$suffixes as $suffix) { - $allSuffixes[$suffix] = $versionableExtension; + $versionableExtensions = $this->owner->config()->versionableExtensions; + if(count($versionableExtensions)){ + + foreach ($versionableExtensions as $versionableExtension => $suffixes) { + if ($this->owner->hasExtension($versionableExtension)) { + $allSuffixes = array_merge($allSuffixes, (array)$suffixes); + foreach ((array)$suffixes as $suffix) { + $allSuffixes[$suffix] = $versionableExtension; + } } } + } // Add the default table with an empty suffix to the list (table name = class name) @@ -864,12 +887,16 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { * @return string */ public function extendWithSuffix($table) { - foreach (Versioned::$versionableExtensions as $versionableExtension => $suffixes) { - if ($this->owner->hasExtension($versionableExtension)) { - $ext = $this->owner->getExtensionInstance($versionableExtension); - $ext->setOwner($this->owner); - $table = $ext->extendWithSuffix($table); - $ext->clearOwner(); + $versionableExtensions = $this->owner->config()->versionableExtensions; + + if(count($versionableExtensions)){ + foreach ($versionableExtensions as $versionableExtension => $suffixes) { + if ($this->owner->hasExtension($versionableExtension)) { + $ext = $this->owner->getExtensionInstance($versionableExtension); + $ext->setOwner($this->owner); + $table = $ext->extendWithSuffix($table); + $ext->clearOwner(); + } } } diff --git a/tests/model/VersionableExtensionsFixtures.yml b/tests/model/VersionableExtensionsFixtures.yml new file mode 100644 index 000000000..62c5159af --- /dev/null +++ b/tests/model/VersionableExtensionsFixtures.yml @@ -0,0 +1,3 @@ +VersionableExtensionsTest_DataObject: + object: + Title: "Test" diff --git a/tests/model/VersionableExtensionsTest.php b/tests/model/VersionableExtensionsTest.php new file mode 100644 index 000000000..e08209c52 --- /dev/null +++ b/tests/model/VersionableExtensionsTest.php @@ -0,0 +1,97 @@ + array('Versioned'), + ); + + protected $extraDataObjects = array( + 'VersionableExtensionsTest_DataObject', + ); + + + public function setUpOnce() + { + Config::nest(); + + VersionableExtensionsTest_DataObject::add_extension('Versioned'); + VersionableExtensionsTest_DataObject::add_extension('VersionableExtensionsTest_Extension'); + + $cfg = Config::inst(); + + $cfg->update('VersionableExtensionsTest_DataObject', 'versionableExtensions', array( + 'VersionableExtensionsTest_Extension' => array( + 'test1', + 'test2', + 'test3' + ) + )); + + parent::setUpOnce(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + public function testTablesAreCreated() + { + $tables = DB::table_list(); + + $check = array( + 'versionableextensionstest_dataobject_test1_live', 'versionableextensionstest_dataobject_test2_live', 'versionableextensionstest_dataobject_test3_live', + 'versionableextensionstest_dataobject_test1_versions', 'versionableextensionstest_dataobject_test2_versions', 'versionableextensionstest_dataobject_test3_versions' + ); + + // Check that the right tables exist + foreach ($check as $tableName) { + + $this->assertContains($tableName, array_keys($tables), 'Contains table: '.$tableName); + } + + } + +} + +class VersionableExtensionsTest_DataObject extends DataObject implements TestOnly { + + private static $db = array( + 'Title' => 'Varchar' + ); + +} + + +class VersionableExtensionsTest_Extension extends DataExtension implements TestOnly { + + + public function isVersionedTable($table){ + return true; + } + + + /** + * fieldsInExtraTables function. + * + * @access public + * @param mixed $suffix + * @return array + */ + public function fieldsInExtraTables($suffix){ + $fields = array(); + //$fields['db'] = DataObject::database_fields($this->owner->class); + $fields['indexes'] = $this->owner->databaseIndexes(); + + $fields['db'] = array_merge( + DataObject::database_fields($this->owner->class) + ); + + return $fields; + } +}