Silverstripe - 包括样式表和脚本

Silverstripe - Include Stylesheets and Scripts

我已经全新安装了 Silverstripe 并创建了一个新主题。 现在我想在 Page.ss 中包含一个 CSS,但我收到一条错误消息,指出找不到该文件。 我想将主题文件夹中的文件包含在“my-site/themes/my-theme/css/style.css”下。但是,使用“themedCSS('style')”的集成仅在文件已在“my-site/public/_resources/themes/my-theme/css/style.css”下再次集成时才有效。我已经尝试过所有变体,但只有当 CSS 文件同时存在于两个地方时它才有效。

因为我无法想象这是最佳实践,所以我想知道我错过了什么。此外,“/themes/my-theme/css/style.css”下的样式将被完全忽略,如果两者都包含的话。

在 SilverStripe 版本 4 中,您希望浏览器能够请求的所有资源文件都必须在 public 文件夹中可用。 您不需要手动将文件从您的应用程序主题文件夹复制到 public 文件夹,您可以做的是定义要在 composer.json 文件中显示的文件。

// composer.json
...
"extra": {
        ...
        "expose": [
            "themes/my-theme/css",
            "themes/my-theme/js",
            // Any other files or folders you want to expose
        ]
    },

然后当您在终端中 运行 composer vendor-expose 命令时,它会将列出的文件公开到 public 文件夹。

默认情况下,expose 命令会在 public 和项目文件夹之间创建一个符号链接,因此您的所有更改也会反映在那里,这样您就不需要 运行每次更改后公开命令,仅当您添加新文件时公开。

也可以通过页面控制器导入资源文件,像这样:

// A page controller, e.g. "PageController.php"

    protected function init()
    {
        parent::init();
        self::myImports();
    }

    private static function myImports() {
        // Files must be available in the public folder:
        // - "/public/_resources/themes/my-theme/css/app.css"
        // - "/public/_resources/themes/my-theme/js/app.js"
        Requirements::css('./themes/my-theme/css/app.css');
        Requirements::javascript('./themes/my-theme/js/app.js');
    }