0

目前我正在使用带有 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");
   }
}

当我在浏览器中打开 URL http://mysite.com/category/show/mobile 时,输出看起来像这样:“Slug:mobile”。

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

我刚试过这个:

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

它使用 Category.ss 来呈现输出,但没有容器 html...

感谢您的帮助。问候,弗洛里安

4

1 回答 1

3

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

所以假设$this->renderWith(array('Category', 'Page')); 它会首先查找一个名为 的模板 Category.ss,但不会找到它(在模板文件夹中,而不是布局文件夹中),然后它会找到Page.ss并使用它。现在它进入$Layout内部Page.ss并再次检查 Layout 文件夹中的数组,它现在会找到Category.ss,如果我的问题正确,这正是您要寻找的东西。

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

因此,如果您的类是数组,则Category_Controller > Page_Controller > ContentController该数组将如下所示:

array(
    'Category_show', // because your action is show
    'Category',
    'Page_show',
    'Page',
    'ContentController_show',
    'ContentController',
)

(我不是 100% 确定它是否还包括 Page_show 和 ContentController_show。)

于 2012-08-27T13:32:13.620 回答