Silverstripe - 博客 post 订购

Silverstripe - Blog post ordering

以为这会很容易,但我似乎正在努力解决这个问题。

Silverstripe 博客如何对其 post 进行排序?我想将一个特定的博客 post 固定到列表的顶部,所以我创建了一个 SortOrder 字段并将其赋值为 1。尝试按 SortOrder 排序,然后按 PublishDate 排序,但似乎只按 PublishDate 排序时间.

即使在博客模型上更改此设置也无济于事:

private static $default_sort = '"PublishDate" IS NULL DESC, "PublishDate" DESC' ;

更新 BlogPostdefault_sort 应该有效:

# In your config.yml
BlogPost:
  default_sort: 'Sticky DESC, PublishDate DESC'
  extensions:
    - MyBlogPostExtension

扩展 BlogPost 以添加 Sticky 布尔值(也可以是 Int):

class MyBlogPostExtension extends DataExtension
{

    private static $db = [
        'Sticky' => 'Boolean'
    ];

    public function updateCMSFields(FieldList $fields)
    {
        $stickyField = CheckboxField::create(
            'Sticky',
            'Sticky this blogpost'
        );

        $fields->addFieldToTab(
            'Root.Main',
            $stickyField
        );
    }

}

确保您想要粘贴的 BlogPost 已发布且 Sticky 设置为 true。

我在博客、排序和伐木工人(Post 在 GridField 中,而不是在 Sitetree 中)有点挣扎。我使用 heyday/silverstripe-gridfieldversionedorderablerows 手动排序。

Injector:
  GridFieldConfig_BlogPost:
    class: GridFieldConfig_MyBlogPost

<?php
class GridFieldConfig_MyBlogPost extends GridFieldConfig_BlogPost
{
    public function __construct($itemsPerPage = null)
    {
        parent::__construct($itemsPerPage);
        $this->addComponent(new GridFieldVersionedOrderableRows('Sort'));
        $this->getComponentByType("GridFieldPaginator")->setItemsPerPage(100);
        $this->getComponentByType("GridFieldDataColumns")->setDisplayFields(array(
            "BlogThumbnail" => "Thumbnail",
            "Title" => "Title"
        ));
    }
}

我在 Blog 的 DataExtension 上制作了自己的 PaginatedListSorted,但您可能可以按照 Janne Klouman 的建议按照 yml 设置排序。