首页 > 解决方案 > Silverstripe 博客根据条件渲染到模板

问题描述

我有一个 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 中的每个博客文章类型:

class BlogPostControllerExtension extends DataExtension
{

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

}

但我不认为我在这里完全走在正确的轨道上:)

标签: phpsilverstripesilverstripe-4

解决方案


你总是可以继承Blog和/或BlogPost调用它Newsand NewsPost,然后它会自动查找调用它的模板。它还会在 CMS 中显示为不同的页面类型。

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

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

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

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


推荐阅读