从控制器访问 Silverstripe 页面要求
Access Silverstripe Page Requirements from a controller
我在 mysite/code/Page.php 中有以下内容:
...
class Page_Controller extends ContentController {
public function init() {
parent::init();
Requirements::javascript("themes/example/js/global1.js");
Requirements::javascript("themes/example/js/global2.js");
Requirements::javascript("themes/example/js/global3.js");
}
}
...
然后是 mysite/controllers/PlayController 中的自定义控制器。php:
...
class PlayController extends ContentController {
public function init() {
parent::init();
Requirements::javascript("themes/example/js/play.js");
}
}
...
我想在 PlayController.php 中使用 Page.php 中的要求。由于它们都扩展 ContentController
,这可能吗?
一点背景; PlayController
用于显示带有模板 Layout/PlayPage.ss 的剧院戏剧页面。如果我将需求放在 templates/Page.ss 中,它们将被 PlayPage.ss 继承。但我想将需求放在控制器中,这样我就可以使用 Silverstripe 的 combine_files
功能。希望这是有道理的!
谢谢 :-)
您可以创建一个 ContentController
的子 class 作为两个控制器的基础 class。例如。您创建一个 MyController extends ContentController
然后 PlayController
和 Page_Controller
扩展 MyController
.
或你可以只需要两个控制器中的所有文件......如果冗余太多,你也可以为此使用配置API。这是一个例子:
class Page_Controller extends ContentController
{
private static $js_requirements = [
"themes/example/js/global1.js",
"themes/example/js/global2.js",
"themes/example/js/global3.js"
];
public function init() {
parent::init();
foreach ($this->config()->js_requirements as $js) {
Requirements::javascript($js);
}
}
}
然后在您的 PlayController
中,您可以像这样访问 Page_Controller
的配置:
class PlayController extends ContentController
{
public function init() {
parent::init();
foreach (Config::inst()->get('Page_Controller', 'js_requirements') as $js) {
Requirements::javascript($js);
}
Requirements::javascript("themes/example/js/play.js");
}
}
您还可以使用 YAML 配置来配置您的要求,例如:
# mysite/_config/config.yml
Page_Controller:
js_requirements:
- "themes/example/js/global4.js"
注意:始终使用 dev/build
,以便您的配置变量被提取。
我在 mysite/code/Page.php 中有以下内容:
...
class Page_Controller extends ContentController {
public function init() {
parent::init();
Requirements::javascript("themes/example/js/global1.js");
Requirements::javascript("themes/example/js/global2.js");
Requirements::javascript("themes/example/js/global3.js");
}
}
...
然后是 mysite/controllers/PlayController 中的自定义控制器。php:
...
class PlayController extends ContentController {
public function init() {
parent::init();
Requirements::javascript("themes/example/js/play.js");
}
}
...
我想在 PlayController.php 中使用 Page.php 中的要求。由于它们都扩展 ContentController
,这可能吗?
一点背景; PlayController
用于显示带有模板 Layout/PlayPage.ss 的剧院戏剧页面。如果我将需求放在 templates/Page.ss 中,它们将被 PlayPage.ss 继承。但我想将需求放在控制器中,这样我就可以使用 Silverstripe 的 combine_files
功能。希望这是有道理的!
谢谢 :-)
您可以创建一个 ContentController
的子 class 作为两个控制器的基础 class。例如。您创建一个 MyController extends ContentController
然后 PlayController
和 Page_Controller
扩展 MyController
.
或你可以只需要两个控制器中的所有文件......如果冗余太多,你也可以为此使用配置API。这是一个例子:
class Page_Controller extends ContentController
{
private static $js_requirements = [
"themes/example/js/global1.js",
"themes/example/js/global2.js",
"themes/example/js/global3.js"
];
public function init() {
parent::init();
foreach ($this->config()->js_requirements as $js) {
Requirements::javascript($js);
}
}
}
然后在您的 PlayController
中,您可以像这样访问 Page_Controller
的配置:
class PlayController extends ContentController
{
public function init() {
parent::init();
foreach (Config::inst()->get('Page_Controller', 'js_requirements') as $js) {
Requirements::javascript($js);
}
Requirements::javascript("themes/example/js/play.js");
}
}
您还可以使用 YAML 配置来配置您的要求,例如:
# mysite/_config/config.yml
Page_Controller:
js_requirements:
- "themes/example/js/global4.js"
注意:始终使用 dev/build
,以便您的配置变量被提取。