Случайный порядок SilverStripe для ArrayList ()

Я знаю, что мы можем случайным образом отсортировать DataList со следующим:

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

Но когда я пытаюсь случайным образом отсортировать ArrayList это не работает Я могу сортировать ArrayList от ID DESC, но не с 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 %>

6

Решение

На самом деле, нет. Это лучший обходной путь, который я могу придумать:

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

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

Другие решения

Вы можете случайным образом отсортировать 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 для получения KitsPages которые относятся к этому MemberID в Versioned::get_by_stage вызов:

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,

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector