从控制器访问Silverstripe页面要求

时间:2017-08-12 18:13:29

标签: php silverstripe

我在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功能。希望这是有道理的!

谢谢: - )

1 个答案:

答案 0 :(得分:2)

您可以创建一个ContentController的子类,它可以作为两个控制器的基类。例如。您创建了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,以便您的配置变量被选中。