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

Php 基于条件的Silverstripe博客渲染到模板,php,silverstripe,silverstripe-4,Php,Silverstripe,Silverstripe 4,我有一个silverstripe博客,我在站点的几个不同区域使用它,并希望为每个区域使用不同的模板(而不是尝试在模板中使用大量条件)…我无法获得要渲染的模板-以下是最基本的内容: class BlogExtension extends DataExtension { private static $db = [ 'BlogType' => 'Varchar' ]; } class BlogPostExtension exte

我有一个silverstripe博客,我在站点的几个不同区域使用它,并希望为每个区域使用不同的模板(而不是尝试在模板中使用大量条件)…我无法获得要渲染的模板-以下是最基本的内容:

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');
    }

}

但我认为我的思路不太正确:)

您可以将
Blog
和/或
BlogPost
子类化,并将其命名为
News
NewsPost
,然后自动查找名为该类的模板。它也会以不同的页面类型出现在CMS中

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

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

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


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

是的,我已经考虑过了-但这将意味着要进行更多的返工,并更改现有内容/db记录等…因此我希望找到一些我可以更改模板的东西…使用基于模板的示例进行更新