From 0e4e8034d68e93eb78d40973e81b6fb5db07bcc6 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 14 Jan 2012 11:20:54 +0100 Subject: [PATCH] BUGFIX Validate SiteTree::$can_be_root on saving, as well as for VirtualPage originals (AIR-80) --- code/model/SiteTree.php | 16 ++++++++++++++++ code/model/VirtualPage.php | 23 +++++++++++++++++++++++ tests/model/SiteTreeTest.php | 25 ++++++++++++++++++++++++- tests/model/VirtualPageTest.php | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) diff --git a/code/model/SiteTree.php b/code/model/SiteTree.php index 2e495079..e6f2820a 100644 --- a/code/model/SiteTree.php +++ b/code/model/SiteTree.php @@ -1511,6 +1511,22 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid ); } } + + // "Can be root" validation + if(!$this->stat('can_be_root') && !$this->ParentID) { + $result->error( + sprintf( + _t( + 'SiteTree.PageTypNotAllowedOnRoot', + 'Page type "%s" is not allowed on the root level', + PR_MEDIUM, + 'First argument is a class name' + ), + $this->i18n_singular_name() + ), + 'CAN_BE_ROOT' + ); + } return $result; } diff --git a/code/model/VirtualPage.php b/code/model/VirtualPage.php index 66d7dc25..88e5228a 100644 --- a/code/model/VirtualPage.php +++ b/code/model/VirtualPage.php @@ -244,6 +244,29 @@ class VirtualPage extends Page { } } } + + function validate() { + $result = parent::validate(); + + // "Can be root" validation + $orig = $this->CopyContentFrom(); + if(!$orig->stat('can_be_root') && !$this->ParentID) { + $result->error( + sprintf( + _t( + 'VirtualPage.PageTypNotAllowedOnRoot', + 'Original page type "%s" is not allowed on the root level for this virtual page', + PR_MEDIUM, + 'First argument is a class name' + ), + $orig->i18n_singular_name() + ), + 'CAN_BE_ROOT_VIRTUAL' + ); + } + + return $result; + } /** * Ensure we have an up-to-date version of everything. diff --git a/tests/model/SiteTreeTest.php b/tests/model/SiteTreeTest.php index ac24535e..04b446f7 100644 --- a/tests/model/SiteTreeTest.php +++ b/tests/model/SiteTreeTest.php @@ -15,7 +15,8 @@ class SiteTreeTest extends SapphireTest { 'SiteTreeTest_ClassB', 'SiteTreeTest_ClassC', 'SiteTreeTest_ClassD', - 'SiteTreeTest_ClassCext' + 'SiteTreeTest_ClassCext', + 'SiteTreeTest_NotRoot', ); /** @@ -848,6 +849,24 @@ class SiteTreeTest extends SapphireTest { Session::set("loggedInAs", null); } + + function testCanBeRoot() { + $page = new SiteTree(); + $page->ParentID = 0; + $page->write(); + + $notRootPage = new SiteTreeTest_NotRoot(); + $notRootPage->ParentID = 0; + $isDetected = false; + try { + $notRootPage->write(); + } catch(ValidationException $e) { + $this->assertContains('is not allowed on the root level', $e->getMessage()); + $isDetected = true; + } + + if(!$isDetected) $this->fail('Fails validation with $can_be_root=false'); + } } /**#@+ @@ -905,4 +924,8 @@ class SiteTreeTest_ClassD extends Page implements TestOnly { class SiteTreeTest_ClassCext extends SiteTreeTest_ClassC implements TestOnly { // Override SiteTreeTest_ClassC definitions static $allowed_children = array('SiteTreeTest_ClassB'); +} + +class SiteTreeTest_NotRoot extends Page implements TestOnly { + static $can_be_root = false; } \ No newline at end of file diff --git a/tests/model/VirtualPageTest.php b/tests/model/VirtualPageTest.php index a1c850f2..e3d591b6 100644 --- a/tests/model/VirtualPageTest.php +++ b/tests/model/VirtualPageTest.php @@ -6,6 +6,7 @@ class VirtualPageTest extends SapphireTest { protected $extraDataObjects = array( 'VirtualPageTest_ClassA', 'VirtualPageTest_ClassB', + 'VirtualPageTest_NotRoot', ); /** @@ -466,6 +467,33 @@ class VirtualPageTest extends SapphireTest { 'write() on original page does increment version on related VirtualPage' ); } + + function testCanBeRoot() { + $page = new SiteTree(); + $page->ParentID = 0; + $page->write(); + + $notRootPage = new VirtualPageTest_NotRoot(); + // we don't want the original on root, but rather the VirtualPage pointing to it + $notRootPage->ParentID = $page->ID; + $notRootPage->write(); + + $virtual = new VirtualPage(); + $virtual->CopyContentFromID = $page->ID; + $virtual->write(); + + $virtual = DataObject::get_by_id('VirtualPage', $virtual->ID, false); + $virtual->CopyContentFromID = $notRootPage->ID; + $isDetected = false; + try { + $virtual->write(); + } catch(ValidationException $e) { + $this->assertContains('is not allowed on the root level', $e->getMessage()); + $isDetected = true; + } + + if(!$isDetected) $this->fail('Fails validation with $can_be_root=false'); + } } class VirtualPageTest_ClassA extends Page implements TestOnly { @@ -485,4 +513,8 @@ class VirtualPageTest_ClassB extends Page implements TestOnly { class VirtualPageTest_ClassC extends Page implements TestOnly { static $allowed_children = array(); +} + +class VirtualPageTest_NotRoot extends Page implements TestOnly { + static $can_be_root = false; } \ No newline at end of file