Skip to content

Commit

Permalink
BUGFIX: Allow Versioned::get_latest_version() and Version::get_versio…
Browse files Browse the repository at this point in the history
…n() to return results if the classname has changed.

Without this bugfix, if you had a Page that used to be a SiteTree, and you tried to use Versiond::get_version() or Versioned::get_latest_version() to return the older SiteTree version, nothing would be returned, because the results were being filtered by ClassName.  This caused bugs in the history panel for certain combinbations of page classname alteration.
  • Loading branch information
Sam Minnee committed Jun 28, 2012
1 parent 0b31234 commit b654b95
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
4 changes: 2 additions & 2 deletions model/Versioned.php
Expand Up @@ -991,7 +991,7 @@ function doRollbackTo($version) {
*/
static function get_latest_version($class, $id) {
$baseClass = ClassInfo::baseDataClass($class);
$list = DataList::create($class)->where("\"$baseClass\".\"RecordID\" = $id");
$list = DataList::create($baseClass)->where("\"$baseClass\".\"RecordID\" = $id");
$list->dataQuery()->setQueryParam("Versioned.mode", "latest_versions");
return $list->First();
}
Expand Down Expand Up @@ -1033,7 +1033,7 @@ static function get_including_deleted($class, $filter = "", $sort = "") {
*/
static function get_version($class, $id, $version) {
$baseClass = ClassInfo::baseDataClass($class);
$list = DataList::create($class)->where("\"$baseClass\".\"RecordID\" = $id")->where("\"$baseClass\".\"Version\" = " . (int)$version);
$list = DataList::create($baseClass)->where("\"$baseClass\".\"RecordID\" = $id")->where("\"$baseClass\".\"Version\" = " . (int)$version);
$list->dataQuery()->setQueryParam('Versioned.mode', 'all_versions');
return $list->First();
}
Expand Down
24 changes: 24 additions & 0 deletions tests/model/VersionedTest.php
Expand Up @@ -242,6 +242,30 @@ public function testQueriedTables() {
'VersionedTest_Subclass_Live',
), DataObject::get('VersionedTest_Subclass')->dataQuery()->query()->queriedTables());
}

public function testGetVersionWhenClassnameChanged() {
$obj = new VersionedTest_DataObject;
$obj->Name = "test";
$obj->write();
$obj->Name = "test2";
$obj->ClassName = "VersionedTest_Subclass";
$obj->write();
$subclassVersion = $obj->Version;

$obj->Name = "test3";
$obj->ClassName = "VersionedTest_DataObject";
$obj->write();

// We should be able to pass the subclass and still get the correct class back
$obj2 = Versioned::get_version("VersionedTest_Subclass", $obj->ID, $subclassVersion);
$this->assertInstanceOf("VersionedTest_Subclass", $obj2);
$this->assertEquals("test2", $obj2->Name);

$obj3 = Versioned::get_latest_version("VersionedTest_Subclass", $obj->ID);
$this->assertEquals("test3", $obj3->Name);
$this->assertInstanceOf("VersionedTest_DataObject", $obj3);

}
}

class VersionedTest_DataObject extends DataObject implements TestOnly {
Expand Down

0 comments on commit b654b95

Please sign in to comment.