Silverstripe - 手动将模板分配给Controller

时间:2012-08-27 13:01:52

标签: content-management-system silverstripe

目前我正在使用带有Director规则的自定义Silverstripe控制器:

---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'category/$Action/$Slug': 'Category_Controller'

控制器看起来像这样:

class Category_Controller extends Page_Controller {
    public function show($arguments) {
       echo "Slug: " . $arguments->param("Slug");
   }
}

当我在浏览器中打开网址http://mysite.com/category/show/mobile时 然后输出看起来很好:“Slug:mobile”。

我只是想知道如何使用文件夹“themes / templates / Layout”中的Category.ss模板来渲染输出。然后当然也应该包含来自Page.ss的容器html(带页眉/页脚)。与往常一样,在布局文件夹中有自定义页面控制器/类和相应的模板。

我刚试过这个:

public function show($arguments) {
    echo $this->renderWith("Category");
}

它使用Category.ss来渲染输出,但是没有容器html ...

感谢任何帮助。 问候, 弗洛里安

1 个答案:

答案 0 :(得分:3)

您也可以将数组传递给renderWith(),它会尝试通过数组,直到找到模板。

所以我们说$this->renderWith(array('Category', 'Page')); 它将首先查找名为Category.ss的模板,但找不到它(在模板文件夹中,而不是布局文件夹中),然后它会找到Page.ss并使用它。 现在它在$Layout内点击Page.ss并在Layout文件夹中再次检查数组,它现在会找到Category.ss,如果我的问题正确的话,这正是你在寻找的地方

如果您不想return $this->renderWith();,您也可以return $this;,而silverstripe将获得您调用的操作和$ this的类层次结构,并将其用作{{1}的数组}

因此,如果您的类为renderWith(),则数组将如下所示:

Category_Controller > Page_Controller > ContentController

(如果它还包含Page_show和ContentController_show,我不是100%确定。)