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();
// 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) {
/** @var SiteTree $child */
$child->delete();

View File

@ -26,6 +26,7 @@ use SilverStripe\Versioned\Versioned;
use SilverStripe\View\Parsers\Diff;
use SilverStripe\View\Parsers\ShortcodeParser;
use SilverStripe\View\Parsers\URLSegmentFilter;
use LogicException;
class SiteTreeTest extends SapphireTest
{
@ -332,6 +333,25 @@ class SiteTreeTest extends SapphireTest
$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()
{
$home = $this->objFromFixture('Page', 'home');