ArrayList() 的 SilverStripe 随机顺序

SilverStripe random order for ArrayList()

我知道我们可以随机排序 DataList 如下:

$example = Example::get()->sort('RAND()');

但是当我尝试对 ArrayList 进行随机排序时,它不起作用。我可以按 ID DESCArrayList 进行排序,但不能使用 RAND().

有没有办法让 ArrayList 随机排序它的项目?

示例:

public function AllTheKits() {
    $kits = Versioned::get_by_stage('KitsPage', 'Live');
    $kitsArrayList = ArrayList::create();

    foreach ($kits as $kit) {
        if ($kit->MemberID == Member::currentUserID()) {
            $kitsArrayList->push($kit);
        }
    }
    return $kitsArrayList;      
}

在一个页面中:

public function getKitsRandom() {
    return $this->AllTheKits()->sort('RAND()');
}

这不适用于 <% loop KitsRandom %>

的模板

不是真的。这是我能想到的最佳解决方法:

foreach($myArrayList as $item) {
    $item->__Sort = mt_rand();
}

$myArrayList = $myArrayList->sort('__Sort');

您可以在循环之前对 DataList 进行随机排序,而不是尝试对 ArrayList:

进行随机排序
public function AllTheKits($sort = '') {
    $kits = Versioned::get_by_stage('KitsPage', 'Live', '', $sort);
    $kitsArrayList = ArrayList::create();

    foreach ($kits as $kit) {
        if ($kit->MemberID == Member::currentUserID()) {
            $kitsArrayList->push($kit);
        }
    }
    return $kitsArrayList;      
}

public function getKitsRandom() {
    return $this->AllTheKits('RAND()'));
}

附带说明一下,您可以过滤原始 DataList 以在 Versioned::get_by_stage 调用中获取与此 MemberID 相关的 KitsPages

public function AllTheKits($sort = '') {
    $kits = Versioned::get_by_stage(
        'KitsPage',
        'Live',
        'MemberID = ' . Member::currentUserID(),
        $sort
    );
    $kitsArrayList = ArrayList::create($kits);

    return $kitsArrayList;      
}

你也可以这样做:

return KitsPage::get()->filter('MemberID', Member::currentUserID())->sort('RAND()');

当您查看实时站点时,这只会显示实时站点 KitPages