【问题标题】:Silverstripe - assign Template to Controller manuallySilverstripe - 手动将模板分配给控制器
【发布时间】:2012-08-21 23:20:45
【问题描述】:

目前我正在使用具有 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...

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

【问题讨论】:

    标签: content-management-system silverstripe


    【解决方案1】:

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

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

    如果您不想执行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。)

    【讨论】:

    • 我还发现此代码有效:$ssv=new SSViewer("Page"); $ssv->setTemplateFile("布局", "类别"); echo $this->renderWith($ssv);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多