如何在单独的博客上禁用 Silverstripe 元素块?

问题描述

我们正在开发一个使用 Elemental Module 来布局内容的 Silverstripe 项目。

该项目还使用博客模块,博客用于网站的两个部分 - 工作组合和标准博客

挑战在于:我们希望每个博客/部分都有不同的内容行为:

  1. 投资组合 - 元素块
  2. 博客 - 标准博客/页面行为

实现这一目标的最佳方法是什么?

我们是否应该将 Blog & BlogPost 扩展到新对象 Portfolio & PortfolioItem 以区分两种不同的行为?

或者我们可以将以下内容添加博客对象/控制器中:

if ($this->BlogType == 'portfolio'){
  // enable Elemental
} else {
  // disable Elemental
}

最后,我们如何在特定页面上禁用 Elemental?它在文档中并不明显。

解决方法

这是我们的解决方案 - 使用 includeElemental 方法根据具体情况禁用/启用 Elemental。

class BlogPostExtension extends DataExtension
{
  public function updateCMSFields(FieldList $fields){
    $fields->insertBefore(new 
       DropdownField("LayoutIndex","Layout",["Portfolio","Blog"]),"Title");
  }

  public function includeElemental(){
    if ($this->owner->LayoutIndex == 0) {
      return true;
    } else if ($this->owner->LayoutIndex == 1) {
      return false;
    }
  }   
}