我在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)。这仅在分割或预览模式下发生。
你能建议如何预防吗?或者还有其他选择吗?谢谢!
答案 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();”
在评论中写了“这避免了例如重定向页面实例上的编辑视图的强制重定向。”但无论如何它都进行了重定向。
也许有更好的方法如何做到这一点,但我还没有找到它。