mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #5218 from bummzack/5189-fix-canViewVersioned
Fixed issue where `canViewVersioned` caused a DB error…
This commit is contained in:
commit
5845b6089c
@ -795,9 +795,14 @@ class Versioned extends DataExtension implements TemplateGlobalProvider {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If there are less than 2 stages, we can exit early since comparing stages is not needed
|
||||||
|
if(count($this->stages) < 2){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// If we weren't definitely loaded from live, and we can't view non-live content, we need to
|
// If we weren't definitely loaded from live, and we can't view non-live content, we need to
|
||||||
// check to make sure this version is the live version and so can be viewed
|
// check to make sure this version is the live version and so can be viewed.
|
||||||
$latestVersion = Versioned::get_versionnumber_by_stage($this->owner->class, 'Live', $this->owner->ID);
|
$latestVersion = Versioned::get_versionnumber_by_stage($this->owner->class, $this->liveStage, $this->owner->ID);
|
||||||
if ($latestVersion == $this->owner->Version) {
|
if ($latestVersion == $this->owner->Version) {
|
||||||
// Even if this is loaded from a non-live stage, this is the live version
|
// Even if this is loaded from a non-live stage, this is the live version
|
||||||
return true;
|
return true;
|
||||||
|
@ -812,6 +812,7 @@ class VersionedTest extends SapphireTest {
|
|||||||
$public1ID = $this->idFromFixture('VersionedTest_PublicStage', 'public1');
|
$public1ID = $this->idFromFixture('VersionedTest_PublicStage', 'public1');
|
||||||
$public2ID = $this->idFromFixture('VersionedTest_PublicViaExtension', 'public2');
|
$public2ID = $this->idFromFixture('VersionedTest_PublicViaExtension', 'public2');
|
||||||
$privateID = $this->idFromFixture('VersionedTest_DataObject', 'page1');
|
$privateID = $this->idFromFixture('VersionedTest_DataObject', 'page1');
|
||||||
|
$singleID = $this->idFromFixture('VersionedTest_SingleStage', 'single');
|
||||||
|
|
||||||
// Test that all (and only) public pages are viewable in stage mode
|
// Test that all (and only) public pages are viewable in stage mode
|
||||||
Session::clear("loggedInAs");
|
Session::clear("loggedInAs");
|
||||||
@ -819,16 +820,21 @@ class VersionedTest extends SapphireTest {
|
|||||||
$public1 = Versioned::get_one_by_stage('VersionedTest_PublicStage', 'Stage', array('"ID"' => $public1ID));
|
$public1 = Versioned::get_one_by_stage('VersionedTest_PublicStage', 'Stage', array('"ID"' => $public1ID));
|
||||||
$public2 = Versioned::get_one_by_stage('VersionedTest_PublicViaExtension', 'Stage', array('"ID"' => $public2ID));
|
$public2 = Versioned::get_one_by_stage('VersionedTest_PublicViaExtension', 'Stage', array('"ID"' => $public2ID));
|
||||||
$private = Versioned::get_one_by_stage('VersionedTest_DataObject', 'Stage', array('"ID"' => $privateID));
|
$private = Versioned::get_one_by_stage('VersionedTest_DataObject', 'Stage', array('"ID"' => $privateID));
|
||||||
|
// Also test an object that has just a single-stage (eg. is only versioned)
|
||||||
|
$single = Versioned::get_one_by_stage('VersionedTest_SingleStage', 'Stage', array('"ID"' => $singleID));
|
||||||
|
|
||||||
|
|
||||||
$this->assertTrue($public1->canView());
|
$this->assertTrue($public1->canView());
|
||||||
$this->assertTrue($public2->canView());
|
$this->assertTrue($public2->canView());
|
||||||
$this->assertFalse($private->canView());
|
$this->assertFalse($private->canView());
|
||||||
|
$this->assertFalse($single->canView());
|
||||||
|
|
||||||
// Adjusting the current stage should not allow objects loaded in stage to be viewable
|
// Adjusting the current stage should not allow objects loaded in stage to be viewable
|
||||||
Versioned::reading_stage('Live');
|
Versioned::reading_stage('Live');
|
||||||
$this->assertTrue($public1->canView());
|
$this->assertTrue($public1->canView());
|
||||||
$this->assertTrue($public2->canView());
|
$this->assertTrue($public2->canView());
|
||||||
$this->assertFalse($private->canView());
|
$this->assertFalse($private->canView());
|
||||||
|
$this->assertFalse($single->canView());
|
||||||
|
|
||||||
// Writing the private page to live should be fine though
|
// Writing the private page to live should be fine though
|
||||||
$private->publish("Stage", "Live");
|
$private->publish("Stage", "Live");
|
||||||
@ -854,6 +860,7 @@ class VersionedTest extends SapphireTest {
|
|||||||
$this->assertTrue($public1->canView());
|
$this->assertTrue($public1->canView());
|
||||||
$this->assertTrue($public2->canView());
|
$this->assertTrue($public2->canView());
|
||||||
$this->assertTrue($private->canView());
|
$this->assertTrue($private->canView());
|
||||||
|
$this->assertTrue($single->canView());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,3 +30,7 @@ VersionedTest_AnotherSubclass:
|
|||||||
subclass1:
|
subclass1:
|
||||||
Title: 'Subclass Page 1'
|
Title: 'Subclass Page 1'
|
||||||
AnotherField: 'Bob'
|
AnotherField: 'Bob'
|
||||||
|
|
||||||
|
VersionedTest_SingleStage:
|
||||||
|
single:
|
||||||
|
Title: 'Singlestage Title'
|
||||||
|
Loading…
Reference in New Issue
Block a user