Silverstripe tumblr-like立柱类型

Silverstripe tumblr-like立柱类型,silverstripe,Silverstripe,我正在尝试为silverstripe创建一个后端接口,让CMS用户可以在Silverstripe3中的一组Post类型(如tumblr)之间进行选择。因此,他们可以选择创建新闻帖子、视频帖子、画廊帖子等 最初,我为所有帖子提供了每种类型所需的字段,并添加了一个允许用户选择帖子类型的枚举字段。然后,我使用forTemplate方法根据选择的帖子类型设置模板 class Post extends DataObject { static $db = array( 'Title'

我正在尝试为silverstripe创建一个后端接口,让CMS用户可以在Silverstripe3中的一组Post类型(如tumblr)之间进行选择。因此,他们可以选择创建新闻帖子、视频帖子、画廊帖子等

最初,我为所有帖子提供了每种类型所需的字段,并添加了一个允许用户选择帖子类型的枚举字段。然后,我使用forTemplate方法根据选择的帖子类型设置模板

class Post extends DataObject {
    static $db = array(
       'Title' => 'Varchar(255),
       'Entry' => 'HTMLText',
       'Type'  => 'enum('Video, Photo, Gallery, Music')
    );

    static $many_many = array(
       'Videos' => 'SiteVideo',
       'Photos' => 'SitePhoto,
       'Songs'  => 'SiteMp3'
    );

    public function forTemplate() {
        switch ($this->Type) {
            case 'Video':
                return $this->renderWith('VideoPost');
                break;
            case 'Photo':
                return $this->renderWith('ImagePost');
                break;
            etc...
    }

    function getCMSFields($params=null) {
        $fields = parent::getCMSFields($params);        
        ...   
       $videosField = new GridField(
            'Videos',
            'Videos',
            $this->Videos()->sort('SortOrder'),
            $gridFieldConfig
        );
       $fields->addFieldToTab('Root.Videos', $photosField);

        $photosField = new GridField(
            'Photos',
            'Photos',
            $this->Photos()->sort('SortOrder'),
            $gridFieldConfig
        );
        $fields->addFieldToTab('Root.Videos', $photosField);

        return $fields;
    } 
}
我希望用户能够在后端选择帖子类型,并且只显示相应的选项卡。因此,如果选择“视频”,则只会显示“视频网格字段”选项卡。如果您选择照片类型,则只有照片的网格字段才会显示

public function PostList() {
    Posts::get()
}
并且能够输出按日期排序的所有PostType


有人知道如何做到这一点吗?谢谢。

第一部分可以使用javascript完成。如果您对此有任何疑问,请联系我

第二部分可能会比较棘手,但我认为您可以使用页面控制器做一些事情。包括一个基于枚举值输出不同模板的方法,但必须在某个位置设置链接

我在2.4.7中使用DataObjectManager管理了这一点,因为我有许多DataObject,并且都包含在一个页面中,但我不确定这在SS3中是否可行

return $this->renderWith(array('CustomTemplate')); 

这行代码将使用不同的模板输出页面。您需要将其包含在方法中,然后在单击相应链接时调用该方法。

谢谢MillyMonster。我看了所有这些,如果我有任何问题,请告诉你。谢谢你的快速回复,没问题。希望这会有帮助。作为后续工作,最终对我的情况有效的方法是检查$this->Type(对应于列出每个帖子类型的枚举字段的值),并根据选择的类型显示gridfield选项卡或按名称删除字段。由于所有的帖子类型仍然是“Post”,我可以在模板中使用Post::get()来获取所有帖子。另外,为了单独链接到每个帖子,我做了MillyMonster上面提到的事情。