Merge pull request #1100 from antons-/773-nested-virtual-pages-allowed_children

* antons--773-nested-virtual-pages-allowed_children:
  Issue #773 - $allowed_children not allowing nested virtual pages
This commit is contained in:
Loz Calver 2015-08-06 10:51:56 +01:00
commit 718503edb1
2 changed files with 48 additions and 1 deletions

View File

@ -1591,7 +1591,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
// No need to check for subclasses or instanceof, as allowedChildren() already // No need to check for subclasses or instanceof, as allowedChildren() already
// deconstructs any inheritance trees already. // deconstructs any inheritance trees already.
$allowed = $parent->allowedChildren(); $allowed = $parent->allowedChildren();
$subject = ($this instanceof VirtualPage) ? $this->CopyContentFrom() : $this; $subject = ($this instanceof VirtualPage && $this->CopyContentFromID) ? $this->CopyContentFrom() : $this;
if(!in_array($subject->ClassName, $allowed)) { if(!in_array($subject->ClassName, $allowed)) {
$result->error( $result->error(

View File

@ -7,6 +7,7 @@ class VirtualPageTest extends SapphireTest {
'VirtualPageTest_ClassA', 'VirtualPageTest_ClassA',
'VirtualPageTest_ClassB', 'VirtualPageTest_ClassB',
'VirtualPageTest_VirtualPageSub', 'VirtualPageTest_VirtualPageSub',
'VirtualPageTest_PageWithAllowedChildren'
); );
protected $illegalExtensions = array( protected $illegalExtensions = array(
@ -604,6 +605,45 @@ class VirtualPageTest extends SapphireTest {
$this->assertEquals('SOME CONTENT', $virtual->obj('CastingTest')->forTemplate()); $this->assertEquals('SOME CONTENT', $virtual->obj('CastingTest')->forTemplate());
} }
public function testVirtualPageAsAnAllowedChild() {
$parentPage = new VirtualPageTest_PageWithAllowedChildren();
$parentPage->write();
$childPage = new VirtualPageTest_ClassA();
$childPage->ParentID = $parentPage->ID;
$childPage->write();
// Check we're allowed to create a VirtualPage without linking it to a page yet
$childVirtualPage = new VirtualPage();
$childVirtualPage->ParentID = $parentPage->ID;
try {
$childVirtualPage->write();
} catch(ValidationException $e) {
$this->fail('Failed to write VirtualPage when it is an allowed child');
}
// Check that we can link a VirtualPage to a page type that's an allowed child
$childVirtualPage->CopyContentFromID = $childPage->ID;
try {
$childVirtualPage->write();
} catch(ValidationException $e) {
$this->fail('Failed to write VirtualPage when it is linked to an allowed child');
}
// Check that we CAN'T link a VirtualPage to a page that is NOT an allowed child
$disallowedChild = new VirtualPageTest_ClassB();
$disallowedChild->write();
$childVirtualPage->CopyContentFromID = $disallowedChild->ID;
$isDetected = false;
try {
$childVirtualPage->write();
} catch(ValidationException $e) {
$this->assertContains('not allowed as child of this parent page', $e->getMessage());
$isDetected = true;
}
if(!$isDetected) $this->fail("Shouldn't be allowed to write a VirtualPage that links to a disallowed child");
}
} }
class VirtualPageTest_ClassA extends Page implements TestOnly { class VirtualPageTest_ClassA extends Page implements TestOnly {
@ -652,3 +692,10 @@ class VirtualPageTest_PageExtension extends DataExtension implements TestOnly {
); );
} }
class VirtualPageTest_PageWithAllowedChildren extends Page implements TestOnly {
private static $allowed_children = array(
'VirtualPageTest_ClassA',
'VirtualPage'
);
}