在Silverstripe

时间:2016-04-17 07:26:05

标签: themes silverstripe

根据the documentation of Silverstripe,模板继承定义如下:

  1. mysite(或提供给网站文件夹的其他名称)
  2. 特定于模块的主题(例如themes / simple_blog)
  3. 主题(例如主题/简单)
  4. 模块(例如博客)
  5. 框架
  6. 现在我的网站有很多不同的主题。嗯,“不同”,因为他们有不同的名字,但他们仍然有很多共同之处。现在我将所有常用文件放在/ mysite / templates文件夹中,但这意味着如果我的一个主题需要更改其中一个模板,我需要从公共文件夹中删除该文件,并将其移至ALL不同的主题文件夹。通过这种方式,我最终得到了许多重复的模板。

    在我的情况下,更改继承顺序是有益的,导致特定主题文件夹优先于/ mysite文件夹。通过这种方式,我可以将必须​​更改的模板复制到主题文件夹,并且该主题将使用更改的模板,而其余的则继续使用/ mysite文件夹中的通用模板:

    1. 主题(例如主题/简单)
    2. 特定于模块的主题(例如themes / simple_blog)
    3. mysite(或提供给网站文件夹的其他名称)
    4. 模块(例如博客)
    5. 框架
    6. 在我看来,这也是更为明智的做法,但我可能在这里错过了一些重要的观点。尽管如此,如果不破解核心就可以做到这一点吗?

      此致 Joost的

2 个答案:

答案 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文件中指定相应的Aftermycustommodule/_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'
];