根据the documentation of Silverstripe,模板继承定义如下:
现在我的网站有很多不同的主题。嗯,“不同”,因为他们有不同的名字,但他们仍然有很多共同之处。现在我将所有常用文件放在/ mysite / templates文件夹中,但这意味着如果我的一个主题需要更改其中一个模板,我需要从公共文件夹中删除该文件,并将其移至ALL不同的主题文件夹。通过这种方式,我最终得到了许多重复的模板。
在我的情况下,更改继承顺序是有益的,导致特定主题文件夹优先于/ mysite文件夹。通过这种方式,我可以将必须更改的模板复制到主题文件夹,并且该主题将使用更改的模板,而其余的则继续使用/ mysite文件夹中的通用模板:
在我看来,这也是更为明智的做法,但我可能在这里错过了一些重要的观点。尽管如此,如果不破解核心就可以做到这一点吗?
此致 Joost的
答案 0 :(得分:2)
模板继承呈现似乎主要由两个类来管理,SSViewer
(用于处理视图呈现的核心类)和Controller
(所有其他控制器都从中继承)。
对于视图渲染,SSViewer
对象可以take an array in its constructor for template inheritance。这很重要,因为Controller
类实际上是instantiates the SSViewer
in a function called getViewer
。
在此阶段,重要的是要提及正常的SilverStripe网站,您通常从ContentController
继承overrides the getViewer
of Controller
。它不会真正改变你需要写的东西,但重要的是取决于你希望如何应用它的低级别。
对于您想要应用于一般网页的内容,您会看到覆盖getViewer
中的Page_Controller
。至于您需要编写的具体内容,这在某种程度上取决于您的整个站点结构。我想可能需要从这样开始:
public function getViewer($action) {
$viewer = Parent::getViewer($action);
$templates = $viewer->templates();
//Do your processing that you need to here
//Set it back via:
//$viewer->setTemplateFile($type, $file);
//Alternatively, you can create a new SSViewer object
return $viewer;
}
通过一些实验来确定你需要做些什么来改变数据,尽管这从未如此简单。一旦开始沿着这条路走下去,你可能会发现一些可能无法正常工作的边缘情况(例如模板包含)。
答案 1 :(得分:1)
问题和接受的答案适用于SilverStripe 3,并且应该参考与SilverStripe 3.x相关的查询。以下是SilverStripe 4。
由于SilverStripe 4目前是最新的稳定版本,现在设置主题继承而不是模板继承,因此问题和答案可能不适合新安装或最新安装。
在SilverStripe 4中控制继承的最佳方法是确保以正确的顺序配置主题,并且正确配置模块继承。
您的mysite/_config/theme.yml
文件通常声明主题继承,您应该调整此文件以适当地控制主题继承。对于模块,您需要在Before
文件中指定相应的After
和mycustommodule/_config/modules.yml
。
以下示例适用于包含mytheme和简单主题的静默,没有_config/modules.yml
文件的自定义模块以及没有_config/modules.yml
文件的供应商模块。
SilverStripe\View\SSViewer:
themes:
- 'mytheme'
- 'simple'
- '$default'
在此示例中,SSViewer::get_themes()
将以相同的顺序将这三个项目作为数组返回:['mytheme', 'simple', '$default]
。在检查模板是否存在时,$default
将被定义模板的所有模块的路径替换,其顺序与清单中显示的顺序相同。
<?php
use SilverStripe\View\ThemeResourceLoader;
$templatePaths = ThemeResourceLoader::inst()->getThemePaths(SSViewer::get_themes());
$templatePaths === [
'themes/mytheme',
'themes/simple',
'mycustommodule',
'vendor/silverstripe/asset-admin',
'vendor/silverstripe/campaign-admin',
'vendor/silverstripe/reports',
'vendor/silverstripe/siteconfig',
// Some vendor modules may appear here...
'vendor/othervendor/custommodule',
'vendor/silverstripe/cms',
'vendor/silverstripe/admin',
'vendor/silverstripe/assets',
'vendor/silverstripe/framework'
];