从控制器访问 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 然后 PlayControllerPage_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,以便您的配置变量被提取。