GetList: Сортировка по порядку ID в переданном массиве

Рейтинг: 6.0000  
Внедрено
Предложил Пользователь 35986 02.10.2018 14:03:58

GetList: Сортировка по порядку ID в переданном массиве

На входе есть массив с ID элементов. Они находятся в массиве в том порядке, в котором нужно организовать вывод (например, получены из компонента поиска с сортировкой по релевантности)

$arItemsID = [/* массив ID элементов в нужном порядке */];
$ob = \CIblockElement::GetList(
    [
        'ID' => 'LIST', // новый тип сортировки
    ],
    ['ID' => $arItemsID]
);
while ($arItem = $ob->Fetch()) {
    // элементы выводятся в порядке попадания в массив $arItemsID 
}

Для этого нужно в функцию \CIblockElement::PrepareGetList() добавить такой код
if (count($arOrder) == 1 && $arOrder['ID'] == 'LIST' && array_key_exists('ID', $arFilter)) {
    $arSqlOrder['ID'] = 'FIELD(BE.ID, \''.implode('\',\'', $arFilter['ID']).'\')';
}
Рейтинг: 1  
Ответил Жуков Евгений 23.07.2019 11:18:16
Выйдет в iblock 18.6.700. Пример использования:
$items = [100, 41, 12, 5, 71];
$order = ['ID' => $items];
$filter = ['ID' => $items];
$iterator = \CIBlockElement::GetList($order, $filter, ...

Рейтинг: 1  
Пользователь 30670 03.10.2018 14:45:38
специфическая задача. ее можете решить на уровне PHP.

getlist класса CIblockElement и так стал "неподвижным"
Рейтинг: 0  
Пользователь 35986 04.10.2018 18:35:36
я и написал "решение" на уровне php )
было бы приятно использовать его или похожее в стандартном функционале битрикса
Рейтинг: 0  
Пользователь 41185 16.10.2018 10:08:03
Вы переложили решение на плечи и без того слабой БД. Пока у вас маленький сайт, проблем не почувствуете, с ростом проекта и количества посетителей - будет очень много проблем. Если хочется положить решение на плечи БД - используйте D7. Если хочется решить на уровне кода, то проще реализовать свою функцию сортировки и в result_modifier можно просто использовать данную функцию. Полагаю GetList признан устаревшим и не имеет смысла дальнейшего развития.