@alexander_chn

Как вывести рандомно элементы каталога после того как вывел первые 20 отсортировано в Битрикс?

Здравствуйте! Задача следующая. В каталоге первые 20 элементов выводятся отсортированными по полю SORT. Начиная с 21 элемента (там может быть порядка 100 карточек) должно выводится рандомно. И после них уже выводятся краточки по дате создания. Как решить эту задачу. У меня на данный момент даже нет идей. Буду рад любой мысли, спасибо!
  • Вопрос задан
  • 582 просмотра
Пригласить эксперта
Ответы на вопрос 1
alams_stoyne
@alams_stoyne
Full Stack Developer - #PHP #CSS #JS #DB
Шаг 1: Получаем первые 20 элементов,
Шаг 2: Получаем 100 случайных элементов убрав из них 20 полученные в Шаге 1,
Шаг 3: Получаем оставшиеся элементы убрав из них 120 полученные в результате Шаг 1 и Шаг 2,

\Bitrix\Main\Loader::includeModule('iblock');

// Шаг 1:  Получаем первые 20 элементов,

    $arSelect = Array("ID","NAME","DETAIL_PAGE_URL");
    $nPageSize = Array("nPageSize" => 20);
    $arSort = Array("SORT" => "ASC");

    $arFilter = Array("IBLOCK_ID"=>IntVal($this->arParams['IBLOCK_ID']), "ACTIVE"=>"Y");
    $res = CIBlockElement::GetList($arSort, $arFilter, false, $nPageSize, $arSelect);   
    $ALL_RESULT = [];
    $IGNORE_IDS = [];
    while($ob = $res->GetNextElement())
    {         
        $GetFields = $ob->GetFields();
        $IGNORE_IDS[] = $GetFields["ID"];
        $ALL_RESULT[] = $GetFields;
    }

// Шаг 2:  Получаем 100 случайных элементов убрав из них 20 полученные в Шаге 1,

    $nPageSize = Array("nPageSize" => 100);
    $arSort = Array("RAND" => "ASC");
    $arFilter = Array("!ID" => $IGNORE_IDS, "IBLOCK_ID"=>IntVal($this->arParams['IBLOCK_ID']), "ACTIVE"=>"Y");
    $res = CIBlockElement::GetList($arSort, $arFilter, false, $nPageSize, $arSelect);   
    while($ob = $res->GetNextElement())
    {         
        $GetFields = $ob->GetFields();
        $IGNORE_IDS[] = $GetFields["ID"];
        $ALL_RESULT[] = $GetFields;
    }

// Шаг 3:  Получаем оставшиеся элементы убрав из них 120 полученные в результате Шаг 1 и Шаг 2,
    $nPageSize = Array();
    $arSort = Array("ACTIVE_FROM" => "ASC");
    $arFilter = Array("!ID" => $IGNORE_IDS, "IBLOCK_ID"=>IntVal($this->arParams['IBLOCK_ID']), "ACTIVE"=>"Y");
    $res = CIBlockElement::GetList($arSort, $arFilter, false, $nPageSize, $arSelect);   
    while($ob = $res->GetNextElement())
    {         
        $GetFields = $ob->GetFields();
        $IGNORE_IDS[] = $GetFields["ID"];
        $ALL_RESULT[] = $GetFields;
    }
    return $ALL_RESULT;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы