SilverStripe虚拟页面/菜单项

SilverStripe虚拟页面/菜单项,silverstripe,Silverstripe,设想一个站点结构/菜单布局如下: 主页 关于我们 服务 __削土豆皮 __土豆切片 __烤土豆 所有菜单项都链接到一个真正的页面,并有自己的URL和内容。但粗体显示的项目只是一个菜单项,没有链接、内容或URL,它的唯一用途是在悬停时折叠子菜单。SilverStripe不允许您在开箱即用的情况下创建这样的页面实体 我正在寻找一种最干净、最简单、最没有黑客攻击的方法来创建一个虚拟页面,只作为菜单项,没有内容,最好也没有URL slug(后者可能很难)。您可以实现“虚拟”页面,而无需任何附加代码,只需

设想一个站点结构/菜单布局如下:

主页
关于我们
服务
__削土豆皮
__土豆切片
__烤土豆

所有菜单项都链接到一个真正的页面,并有自己的URL和内容。但粗体显示的项目只是一个菜单项,没有链接、内容或URL,它的唯一用途是在悬停时折叠子菜单。SilverStripe不允许您在开箱即用的情况下创建这样的页面实体

我正在寻找一种最干净、最简单、最没有黑客攻击的方法来创建一个虚拟页面,只作为菜单项,没有内容,最好也没有URL slug(后者可能很难)。

您可以实现“虚拟”页面,而无需任何附加代码,只需创建一个
重定向页面
,然后选择您的第一个子页面作为重定向目标

就我个人而言,我过去使用过更简单的“RedirectorPage”,如果直接访问第一个子页面,它会自动重定向到第一个子页面

例如:

class ChildRedirectorPage extends Page 
{
    private static $description = 'Page that has no content but automatically redirects to the first of its child-pages';

    public function ContentSource() {
        if($firstChild = $this->Children()->First()) {
            return $firstChild;
        } else {
            return $this;
        }       
    }

    public function Link($action = null) {
        // prevent link "redirection" when we're in CMS
        if (!is_subclass_of(Controller::curr(),'LeftAndMain')){
            if($firstChild = $this->Children()->First()) return $firstChild->Link($action);
            else return parent::Link($action);
        }
    }

    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->removeByName('Content', true);
        return $fields;
    }
}

class ChildRedirectorPage_Controller extends Page_Controller 
{
    function init() {
        parent::init();
        if($firstChild = $this->Children()->First()) {
            $this->redirect($firstChild->Link(), 301);
        }           
    }
}
我认为URL slug实际上是有益的,因为您的URL将是
服务/剥土豆
,等等,这对于SEO目的来说可能更好