问题描述
是否可以为某些特定页面/控制器呈现另一个“根”模板而不是 Page.ss
文件?已经有一些页面使用 Page.ss
模板,但现在网站上将有一个新的“Intranet”部分,这些页面应该有另一个“根”模板:IntranetPage.ss
。
Page.ss
应该保持原样,根本不应该被触摸。
我主要想要不同的“根”模板,因为两个模板加载不同的 JS 和 CSS 文件。 “容器”HTML 也完全不同。
我能够创建一个自定义控制器,它可以手动执行我需要的操作。像这样:
class IntranetPageController extends PageController
{
public function index()
{
return $this->customise([
'Layout' => $this->renderWith(['Intranet/Layout/IntranetPageLayout'])
])->renderWith(['Intranet/IntranetPage']);
}
}
代码的灵感来自这里:https://docs.silverstripe.org/en/4/developer_guides/templates/rendering_templates/
IntranetPage.ss
现在用作“根”模板。 IntranetPageLayout.ss
显示为 $Layout
占位符。
这似乎可行,但是我有很多页面必须基于 IntranetPage.ss
。为每个新的 Controller 编写完全相同的 index
函数(稍作调整以加载另一个 LayoutPage)感觉很奇怪。
我敢肯定,Silverstripe 有一些惯例可以自动执行此操作:)
我需要的是非常接近每页有一个单独的主题,但我不确定这是否可能......
解决方法
不要扩展 PageController
,而是在新控制器中扩展您的 IntranetPageController
。每当调用 index
时,它都会从您的父类调用您的索引函数,在您的情况下为 IntranetPageController
。