在SilverStripe中显示父页面的内容

时间:2015-07-08 11:23:13

标签: silverstripe

我在SilverStripe中有简单的树结构。

ParentPage和ChildPage。

在ParentPage上,我显示ChildPages列表。但我不想提供可访问的网址:

/父页/子页

我想只允许

/父页

这就是我将ChildPage索引操作重定向到ParentPage的原因:

class ChildPage_Controller extends Page_Controller
{

    public function index()
    {
        $this->redirect('/parent-page/');
    }

}

它在前端工作得很好。但是在我点击树中的ChidPage后,它在CMS中重定向我编辑ParentPage。 (不是前端url,而是admin / pages / edit / show / ParentPageID)。这仅在分割或预览模式下发生。

你能建议如何预防吗?或者还有其他选择吗?谢谢!

2 个答案:

答案 0 :(得分:1)

init功能中,您可以检查用户是否有权查看CMS,以及页面当前是否设置了 stage 获取变量:

class ChildPage_Controller extends Page_Controller {

    public function init() {
        parent::init();
        if (!($this->getRequest()->getVar('stage') && Permission::check('VIEW_CMS'))) {
            return $this->redirect($this->Parent()->Link(), 301);
        }
    }

}

通过这种方式,将重定向普通用户,并且将重定向未使用?stage = ... 设置查看该页面的CMS用户。预览/拆分窗格始终设置 stage get变量,以便在预览/拆分窗格中查看时,页面永远不会被重定向。

答案 1 :(得分:-1)

所以我终于找到了解决方案。

预览窗格显示在iframe中。并且父CMS框架绑定以更改预览窗格的URL。这是因为当您单击预览窗格中的某个链接时,CMS会导航您编辑该页面。因此,当我从ChildPage重定向到ParentPage时,CMS窗格会捕获url的更改,编辑器将重定向到ParentPage。

我还没有找到方法,如何防止它,最后我需要编辑CMS的javascript(LeftAndMain.Preview.js第251行)。

iframe.bind('load', function() {

                self._adjustIframeForPreview();

                // Load edit view for new page, but only if the preview is activated at the moment.
                // This avoids e.g. force-redirections of the edit view on RedirectorPage instances.


                // self._loadCurrentPage();

                $(this).removeClass('loading');
            });

所以我注释掉了这行“self._loadCurrentPage();”

在评论中写了“这避免了例如重定向页面实例上的编辑视图的强制重定向。”但无论如何它都进行了重定向。

也许有更好的方法如何做到这一点,但我还没有找到它。