【问题标题】:SS3 DataObject sort after specified DataObjectSS3 DataObject 在指定 DataObject 之后排序
【发布时间】:2016-01-20 21:50:03
【问题描述】:

好的,所以过去几天这一直让我发疯......
我有一个像这样的数据对象:

private static $db = array(
    // other properties
    'active' => 'Boolean',
    'sort' => 'Int' // ID of another DataObject of this type, after which it is to be displayed.
);
private static $has_one = array('Page' => 'CustomPage');

CustomPage 只是扩展 Page 并与此 DataObject 具有 has_many 关系。
我现在的痛苦是以正确排序的方式获取数据。

编辑:排序值实际上是DataObject的ID,在它之后排序。

例如给出以下内容:

ID    sort
1      0
2      3
3      5
4      1
5      1

结果应该是这样排序的:

ID
1
4
5
3
2

排序可以重复,因为我真的不想在中间添加一些东西时更新每个项目。

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    设置DataObject 的排序顺序的一种方法是设置$default_sort 变量:

    class CustomDataObject extends DataObject {
    
        private static $db = array(
            'Active' => 'Boolean',
            'SortOrder' => 'Int'
        );
    
        private static $has_one = array(
            'Page' => 'CustomPage'
        );
    
        private static $default_sort = 'SortOrder ASC';
    }
    

    确保在清除站点缓存后调用?flush=all

    另外,如果自定义DataObject 是通过GridField 维护的,我们可以使用模块通过拖放来控制排序顺序。这是一个 StackOverflow 答案,详细说明了如何使用这些模块之一: Silverstripe DataObject - drag and drop ordering

    【讨论】:

    • 我可能应该提到排序值实际上是 DataObject 的 ID,在该 ID 之后对其进行排序。所以我不能只按排序排序,因为这样排序不正确。例如,当它实际上应该是相反的方式时,它会将 2 放在 3 之前。
    【解决方案2】:

    正如 3dgoo 所说,$default_sort是你的朋友。当您的列 sort(或 SortOrder)不是唯一的时,您始终可以添加另一列来对重复项进行排序,例如

    private static $default_sort = 'sort, ID ASC';
    

    应该适用于你的情况。

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2015-11-09
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多