Issue #773 - $allowed_children not allowing nested virtual pages

Additional check to see if a 'VirtualPage' has a page attached to it
This commit is contained in:
Anton Smith 2014-09-15 14:26:47 +12:00 committed by Loz Calver
parent ae4601be54
commit c6684559f6
2 changed files with 49 additions and 1 deletions

View File

@ -1598,7 +1598,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
// No need to check for subclasses or instanceof, as allowedChildren() already
// deconstructs any inheritance trees already.
$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)) {
$result->error(

View File

@ -7,6 +7,7 @@ class VirtualPageTest extends SapphireTest {
'VirtualPageTest_ClassA',
'VirtualPageTest_ClassB',
'VirtualPageTest_VirtualPageSub',
'VirtualPageTest_PageWithAllowedChildren'
);
protected $illegalExtensions = array(
@ -591,6 +592,46 @@ class VirtualPageTest extends SapphireTest {
'No field copying from previous original after page type changed'
);
}
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 {
@ -632,3 +673,10 @@ class VirtualPageTest_PageExtension extends DataExtension implements TestOnly {
);
}
class VirtualPageTest_PageWithAllowedChildren extends Page implements TestOnly {
private static $allowed_children = array(
'VirtualPageTest_ClassA',
'VirtualPage'
);
}