0

我正在尝试为 silverstripe 创建一个后端界面,让 CMS 用户可以选择在 Silverstripe3 中的一组帖子类型(如 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;
    } 
}

我希望用户能够在后端选择帖子类型,并且只显示适当的选项卡。因此,如果您选择 Video,则只会显示 Video GridField 选项卡。如果您选择照片类型,只有照片的 GridField 会显示。那么我希望能够调用类似

public function PostList() {
    Posts::get()
}

并能够输出按日期排序的所有 PostType。

有谁知道这可能是如何实现的?谢谢。

4

1 回答 1

0

那么第一部分可以使用javascript来完成。查看本教程,如果您对此有任何疑问,请告诉我文档。

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

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

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

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

于 2012-10-26T12:18:57.167 回答