【问题标题】:Silverstripe tumblr-like Post TypesSilverstripe 类似 tumblr 的帖子类型
【发布时间】:2012-10-26 11:46:17
【问题描述】:

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

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

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。

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

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    那么第一部分可以使用 javascript 来完成。查看this tutorial the docs 如果您对此有任何疑问,请告诉我。

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

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

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

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

    【讨论】:

    • 谢谢米莉怪物。我看看这一切,如果我有任何问题,请告诉你。感谢您的快速回复。
    • 没问题。希望对您有所帮助。
    • 作为跟进,最终对我的情况起作用的是检查 $this->Type (对应于列出每个帖子类型的枚举字段的值)并显示网格字段选项卡或根据选择的类型按名称删除字段。由于所有帖子类型仍然是“帖子”,我可以在模板中使用 Post::get() 来获取所有帖子。
    • 另外,为了单独链接到每个帖子,我做了上面提到的 MillyMonster。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2020-06-06
    • 2012-07-30
    相关资源
    最近更新 更多