Иногда нужно перед вызовом компонента добавить в $FILTER_NAME готовый список id ( например: $FILTER_NAME['ID'] = array(151,12,53,5684....2132); ) и при этом необходимо отсортировать по этому же списку. Допустим есть страница просмотренных товаров, у нас уже есть список id просмотренных товаров(вытащили их из куки) и нужно вывести и сохранить начальное расположение(сортировку) в этом списке. Будет использовать для этой страницы компонент catalog.section
Для этого переносим данный компонент в свой неймспейс.
В список параметров добавим SORT_IDS - список id элементов.
$arParams['SORT_IDS'] // Список id ,по которому будем строить сортировку |
В компоненте находим строчки
while($arItem = $rsElements->GetNext())
{ |
Перед ними добавим код:
$KeyById = false; //Ключ,который "включает" наш дополнительный код.Без него компонент будет работать в штатном режиме с обычной сортировкой.
if (isset($arParams['SORT_IDS']) && is_array($arParams['SORT_IDS']) && count($arParams['SORT_IDS'])) {
$KeyById = true;
foreach ($arParams['SORT_IDS'] as &$id) {
$id = (int)$id;
}
}
if ($KeyById) {
$arResult['ITEMS'] = array_flip($arParams['SORT_IDS']);
// array_flip - главный хак данного метода, заранее создаем массив $arResult['ITEMS'] с уже правильной сортировкой.
}
|
Далее внутри цикла пропишем изменение в самом начале
while($arItem = $rsElements->GetNext())
{
$arItem['ID'] = (int)$arItem['ID'];
if ($KeyById) {
$intKey = $arItem['ID'];//Необходимая вещь, без этого появляются какие-то ошибки в виде отсутствия цен и прочего...
}
|
После цикла напишем
...
$arResult["ITEMS"][$intKey] = $arItem;
$arResult["ELEMENTS"][$intKey] = $arItem["ID"];
$arElementLink[$arItem['ID']] = &$arResult["ITEMS"][$intKey];
$intKey++;
}
//Очищаем $arResult['ITEMS'] от значений,которые не пришли из БД.
foreach ($arResult['ITEMS'] as $key => $value){
if (!is_array($value))
unset($arResult['ITEMS'][$key]);
} |