diff --git a/_config.php b/_config.php index 6bfb33eb..f4db9dca 100644 --- a/_config.php +++ b/_config.php @@ -1,31 +1,28 @@ register( - 'sitetree_link', - array('SilverStripe\\CMS\\Model\\SiteTree', 'link_shortcode_handler') + 'sitetree_link', + array(SiteTree::class, 'link_shortcode_handler') ); -File::add_extension('SilverStripe\\CMS\\Model\\SiteTreeFileExtension'); - // TODO Remove once we can configure CMSMenu through static, nested configuration files CMSMenu::remove_menu_class('SilverStripe\\CMS\\Controllers\\CMSMain'); CMSMenu::remove_menu_class('SilverStripe\\CMS\\Controllers\\CMSPageEditController'); diff --git a/_config/config.yml b/_config/config.yml index 5ee780e0..18c2551e 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -10,3 +10,4 @@ SilverStripe\Forms\Form: SilverStripe\Assets\File: extensions: - SilverStripe\CMS\Controllers\ErrorPageFileExtension + - SilverStripe\CMS\Model\SiteTreeFileExtension diff --git a/code/Model/SiteTree.php b/code/Model/SiteTree.php index 314ac110..5b483c33 100755 --- a/code/Model/SiteTree.php +++ b/code/Model/SiteTree.php @@ -995,7 +995,7 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi return true; } - return $this->canEdit($member) && $this->stat('allowed_children') != 'none'; + return $this->canEdit($member) && $this->stat('allowed_children') !== 'none'; } /** @@ -1160,7 +1160,7 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi */ public function canCreate($member = null, $context = array()) { - if (!$member || !(is_a($member, 'SilverStripe\\Security\\Member')) || is_numeric($member)) { + if (!$member || !(is_a($member, Member::class)) || is_numeric($member)) { $member = Member::currentUserID(); } @@ -2713,25 +2713,36 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi */ public function allowedChildren() { - $allowedChildren = array(); - $candidates = $this->stat('allowed_children'); - if ($candidates && $candidates != "none" && $candidates != "SiteTree_root") { - foreach ($candidates as $candidate) { - // If a classname is prefixed by "*", such as "*Page", then only that class is allowed - no subclasses. - // Otherwise, the class and all its subclasses are allowed. - if (substr($candidate, 0, 1) == '*') { - $allowedChildren[] = substr($candidate, 1); - } elseif ($subclasses = ClassInfo::subclassesFor($candidate)) { - foreach ($subclasses as $subclass) { - if ($subclass == 'SiteTree_root' || singleton($subclass) instanceof HiddenClass) { - continue; - } - $allowedChildren[] = $subclass; + // Get config based on old FIRST_SET rules + $candidates = null; + $class = get_class($this); + while ($class) { + if (Config::inst()->exists($class, 'allowed_children', Config::UNINHERITED)) { + $candidates = Config::inst()->get($class, 'allowed_children', Config::UNINHERITED); + break; + } + $class = get_parent_class($class); + } + if (!$candidates || $candidates === 'none' || $candidates === 'SiteTree_root') { + return []; + } + + // Parse candidate list + $allowedChildren = []; + foreach ($candidates as $candidate) { + // If a classname is prefixed by "*", such as "*Page", then only that class is allowed - no subclasses. + // Otherwise, the class and all its subclasses are allowed. + if (substr($candidate, 0, 1) == '*') { + $allowedChildren[] = substr($candidate, 1); + } elseif ($subclasses = ClassInfo::subclassesFor($candidate)) { + foreach ($subclasses as $subclass) { + if ($subclass == 'SiteTree_root' || singleton($subclass) instanceof HiddenClass) { + continue; } + $allowedChildren[] = $subclass; } } } - return $allowedChildren; }