diff --git a/core/model/SiteTree.php b/core/model/SiteTree.php index cd34eccf7..d9c67bc7a 100755 --- a/core/model/SiteTree.php +++ b/core/model/SiteTree.php @@ -2086,7 +2086,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid } /** - * Roll the draft version of this page to match the published page + * Roll the draft version of this page to match the published page. + * Caution: Doesn't overwrite the object properties with the rolled back version. + * * @param $version Either the string 'Live' or a version number */ function doRollbackTo($version) { diff --git a/core/model/Versioned.php b/core/model/Versioned.php index 299776c4a..5269fa886 100755 --- a/core/model/Versioned.php +++ b/core/model/Versioned.php @@ -387,7 +387,7 @@ class Versioned extends DataObjectDecorator { unset($manipulation[$table]); } } - + // Add the new version # back into the data object, for accessing after this write if(isset($thisVersion)) $this->owner->Version = str_replace("'","",$thisVersion); } @@ -476,7 +476,12 @@ class Versioned extends DataObjectDecorator { $publisherID = isset(Member::currentUser()->ID) ? Member::currentUser()->ID : 0; if($from) { $from->forceChange(); - if(!$createNewVersion) $from->migrateVersion($from->Version); + if($createNewVersion) { + $latest = self::get_latest_version($baseClass, $this->owner->ID); + $this->owner->Version = $latest->Version + 1; + } else { + $from->migrateVersion($from->Version); + } // Mark this version as having been published at some stage DB::query("UPDATE \"{$extTable}_versions\" SET \"WasPublished\" = '1', \"PublisherID\" = $publisherID WHERE \"RecordID\" = $from->ID AND \"Version\" = $from->Version"); diff --git a/tests/model/VersionedTest.php b/tests/model/VersionedTest.php index 3b27384ca..c4390c554 100644 --- a/tests/model/VersionedTest.php +++ b/tests/model/VersionedTest.php @@ -15,7 +15,7 @@ class VersionedTest extends SapphireTest { $oldVersion = $obj->Version; $obj->forceChange(); $obj->write(); - + $this->assertTrue( ($obj->Version > $oldVersion), "A object Version is increased when just calling forceChange() without any other changes" @@ -28,7 +28,7 @@ class VersionedTest extends SapphireTest { function testGetIncludingDeleted() { // Delete a page $this->objFromFixture('Page', 'page3')->delete(); - + // Get all items, ignoring deleted $remainingPages = DataObject::get("SiteTree", "\"ParentID\" = 0", "\"SiteTree\".\"ID\" ASC"); // Check that page 3 has gone @@ -51,12 +51,46 @@ class VersionedTest extends SapphireTest { $obj = new VersionedTest_DataObject(); // Check that the Version column is added as a full-fledged column $this->assertType('Int', $obj->dbObject('Version')); - + $obj2 = new VersionedTest_Subclass(); // Check that the Version column is added as a full-fledged column $this->assertType('Int', $obj2->dbObject('Version')); } + function testPublishCreateNewVersion() { + $page1 = $this->objFromFixture('Page', 'page1'); + $page1->Content = 'orig'; + $page1->write(); + $oldVersion = $page1->Version; + $page1->publish('Stage', 'Live', false); + $this->assertEquals($oldVersion, $page1->Version, 'publish() with $createNewVersion=FALSE'); + + $page1->Content = 'changed'; + $page1->write(); + $oldVersion = $page1->Version; + $page1->publish('Stage', 'Live', true); + $this->assertTrue($oldVersion < $page1->Version, 'publish() with $createNewVersion=TRUE'); + } + + function testRollbackTo() { + $page1 = $this->objFromFixture('Page', 'page1'); + $page1->Content = 'orig'; + $page1->write(); + $page1->publish('Stage', 'Live'); + $origVersion = $page1->Version; + + $page1->Content = 'changed'; + $page1->write(); + $page1->publish('Stage', 'Live'); + $changedVersion = $page1->Version; + + $page1->doRollbackTo($origVersion); + $page1 = Versioned::get_one_by_stage('Page', 'Stage', $page1->ID); + + $this->assertTrue($page1->Version > $changedVersion, 'Create a new higher version number'); + $this->assertEquals('orig', $page1->Content, 'Copies the content from the old version'); + } + } class VersionedTest_DataObject extends DataObject implements TestOnly {