Force SiteTree to check in DB before deleting children

This commit is contained in:
Aaron Carlino 2017-10-16 16:42:57 +13:00 committed by Damian Mooyman
parent acadcadbdf
commit 88dd3cb807
2 changed files with 21 additions and 1 deletions

View File

@ -1486,7 +1486,7 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi
parent::onBeforeDelete(); parent::onBeforeDelete();
// If deleting this page, delete all its children. // If deleting this page, delete all its children.
if (SiteTree::config()->enforce_strict_hierarchy && $children = $this->AllChildren()) { if ($this->isInDB() && SiteTree::config()->enforce_strict_hierarchy && $children = $this->AllChildren()) {
foreach ($children as $child) { foreach ($children as $child) {
/** @var SiteTree $child */ /** @var SiteTree $child */
$child->delete(); $child->delete();

View File

@ -26,6 +26,7 @@ use SilverStripe\Versioned\Versioned;
use SilverStripe\View\Parsers\Diff; use SilverStripe\View\Parsers\Diff;
use SilverStripe\View\Parsers\ShortcodeParser; use SilverStripe\View\Parsers\ShortcodeParser;
use SilverStripe\View\Parsers\URLSegmentFilter; use SilverStripe\View\Parsers\URLSegmentFilter;
use LogicException;
class SiteTreeTest extends SapphireTest class SiteTreeTest extends SapphireTest
{ {
@ -332,6 +333,25 @@ class SiteTreeTest extends SapphireTest
$this->assertInstanceOf('Page', $requeriedPage); $this->assertInstanceOf('Page', $requeriedPage);
} }
public function testNoCascadingDeleteWithoutID()
{
Config::inst()->update('SiteTree', 'enforce_strict_hierarchy', true);
$count = SiteTree::get()->count();
$this->assertNotEmpty($count);
$obj = new SiteTree();
$this->assertFalse($obj->exists());
$fail = true;
try {
$obj->delete();
} catch (LogicException $e) {
$fail = false;
}
if ($fail) {
$this->fail('Failed to throw delete exception');
}
$this->assertCount($count, SiteTree::get());
}
public function testGetByLink() public function testGetByLink()
{ {
$home = $this->objFromFixture('Page', 'home'); $home = $this->objFromFixture('Page', 'home');