diff --git a/ORM/Versioning/Versioned.php b/ORM/Versioning/Versioned.php index 6d3f87f6c..9ef7a29a1 100644 --- a/ORM/Versioning/Versioned.php +++ b/ORM/Versioning/Versioned.php @@ -1705,6 +1705,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { $owner->invokeWithExtensions('onBeforeVersionedPublish', $fromStage, $toStage, $createNewVersion); $baseClass = $owner->baseClass(); + $baseTable = $owner->baseTable(); /** @var Versioned|DataObject $from */ if(is_numeric($fromStage)) { @@ -1712,7 +1713,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { } else { $owner->flushCache(); $from = Versioned::get_one_by_stage($baseClass, $fromStage, array( - "\"{$baseClass}\".\"ID\" = ?" => $owner->ID + "\"{$baseTable}\".\"ID\" = ?" => $owner->ID )); } if(!$from) { @@ -1728,7 +1729,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { // Mark this version as having been published at some stage $publisherID = isset(Member::currentUser()->ID) ? Member::currentUser()->ID : 0; - $extTable = $this->extendWithSuffix($baseClass); + $extTable = $this->extendWithSuffix($baseTable); DB::prepared_query("UPDATE \"{$extTable}_versions\" SET \"WasPublished\" = ?, \"PublisherID\" = ? WHERE \"RecordID\" = ? AND \"Version\" = ?", @@ -1746,9 +1747,9 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { $conn = DB::get_conn(); if(method_exists($conn, 'allowPrimaryKeyEditing')) { - $conn->allowPrimaryKeyEditing($baseClass, true); + $conn->allowPrimaryKeyEditing($baseTable, true); $from->write(); - $conn->allowPrimaryKeyEditing($baseClass, false); + $conn->allowPrimaryKeyEditing($baseTable, false); } else { $from->write(); } diff --git a/filesystem/AssetControlExtension.php b/filesystem/AssetControlExtension.php index 76f9a6a03..cf8816f02 100644 --- a/filesystem/AssetControlExtension.php +++ b/filesystem/AssetControlExtension.php @@ -162,7 +162,8 @@ class AssetControlExtension extends DataExtension // Unauthenticated member to use for checking visibility $baseClass = $this->owner->baseClass(); - $filter = array("\"{$baseClass}\".\"ID\"" => $this->owner->ID); + $baseTable = $this->owner->baseTable(); + $filter = array("\"{$baseTable}\".\"ID\"" => $this->owner->ID); $stages = $this->owner->getVersionedStages(); // {@see Versioned::getVersionedStages} foreach ($stages as $stage) { // Skip current stage; These should be handled explicitly diff --git a/tests/model/VersionedTest.php b/tests/model/VersionedTest.php index 690459399..e9a552f31 100644 --- a/tests/model/VersionedTest.php +++ b/tests/model/VersionedTest.php @@ -1,6 +1,5 @@ assertEquals($count, $count2); } + public function testCustomTable() { + $obj = new VersionedTest_CustomTable(); + $obj->Title = 'my object'; + $obj->write(); + $id = $obj->ID; + $obj->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); + $obj->Title = 'new title'; + $obj->write(); + + $liveRecord = Versioned::get_by_stage('VersionedTest_CustomTable', Versioned::LIVE)->byID($id); + $draftRecord = Versioned::get_by_stage('VersionedTest_CustomTable', Versioned::DRAFT)->byID($id); + + $this->assertEquals('my object', $liveRecord->Title); + $this->assertEquals('new title', $draftRecord->Title); + } + /** * Test that publishing from invalid stage will throw exception */ @@ -1242,3 +1258,18 @@ class VersionedTest_PublicExtension extends DataExtension implements TestOnly { return true; } } + +/** + * @mixin Versioned + */ +class VersionedTest_CustomTable extends DataObject implements TestOnly { + private static $db = [ + 'Title' => 'Varchar' + ]; + + private static $table_name = 'VTCustomTable'; + + private static $extensions = [ + "SilverStripe\\ORM\\Versioning\\Versioned", + ]; +}