2016-01-20 18 views
2

好了,这已经让我疯了,在过去几天...
我有一个数据对象,像这样:SS3数据对象排序后指定的数据对象

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只是扩展页,并具有has_many与这个DataObject的关系。
现在我的痛苦是以正确排序的方式获取数据。

编辑:排序值实际上是排序此数据的DataObject的ID。

例如给出如下:

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

结果应当责令这样的:

ID 
1 
4 
5 
3 
2 

排序可以被复制,因为我真的不希望与每次更新打扰每当我只是在中间添加一些东西的项目。设置DataObject的排序顺序

回答

2

一种方法是设置$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

+0

我可能应该提到,排序值实际上是DataObject的ID,然后将其排序。所以我不能按顺序排序,因为那样不会正确排序。例如,当它实际上应该是相反的时候,它会在3之前放2。 – Phoenix

0

由于3dgoo声明$default_sort是你的朋友。当你的列sort(或SortOrder)不是唯一的,你可以随时添加另一列重复排序,所以像

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

应该在你的情况下工作。