SilverStripe虚拟页面/菜单项

时间:2016-07-06 17:47:51

标签: silverstripe

想象一下这样的网站结构/菜单布局:

主页
关于我们
服务
_Peeling土豆
__Slicing土豆
__Baking土豆

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

我正在寻找最简洁,最简单,最简单的方法来创建一个虚拟页面,仅用作菜单项,没有内容,在最好的情况下也没有URL slug(后者可能很难)。

1 个答案:

答案 0 :(得分:3)

你可以实现"虚拟"没有任何其他代码的页面,只需创建一个RedirectorPage并选择您的第一个子页面作为重定向目标。

就个人而言,我使用了更简单的版本" 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实际上是有益的,因为您的网址将是services/peeling-potatoes等,这最有可能更适合搜索引擎优化目的。