Silverstripe博客基于条件渲染到模板

时间:2019-08-04 22:28:50

标签: php silverstripe silverstripe-4

我有一个silverstripe博客,我正在该站点中的几个不同区域使用该博客,并希望为每个区域使用不同的模板(而不是尝试在模板中使用很多条件)。 t获取要渲染的模板-这是裸露的骨头:

class BlogExtension extends DataExtension
{
    private static $db = [        
    'BlogType'     => 'Varchar'       
    ];
}


class BlogPostExtension extends DataExtension
{        
    public function isNews()
    {
        return $this->owner->Parent()->BlogType == 'news';
    }        

    public function isBlog()
    {
        return $this->owner->Parent()->BlogType == 'blog';
    }        
} 

而且,我正在尝试执行以下类似操作,以在BlogPost_news.ss或BlogPost_blog.ss中呈现每种Blogpost类型:

class BlogPostControllerExtension extends DataExtension
{

public function onBeforeInit() {
    //render with custom template
    if ($this->owner->isBlog()) {
        return $this->owner->renderWith(BlogPost::class .'_blog');
    }

}

但是我认为我在这里并不正确:)

1 个答案:

答案 0 :(得分:1)

您始终可以继承Blog和/或BlogPost的子类,并分别命名为NewsNewsPost,然后它们也会自动查找称为该模板的模板。它还将以其他页面类型显示在CMS中。

修改使用的模板会有些棘手,因为您没有直接访问PHP类实例的权限(例如,如果要扩展它们,则可以)。您可能会以尝试的方式在扩展方面有些运气,但它依赖于具有钩子来修改它选择使用的模板。

您还可以覆盖Blog.ssBlogPost.ss模板,然后将类似的内容放入其中:

<% if $isBlog %>
    <% include MyCustomBlogTemplate %>
<% else %>
    <% include MyCustomNewsTemplate %>
<% end_if %>

然后将您分开的模板逻辑放入这些单独的模板中。