@Alex06062023

Как в битриксе придумать псевдослучайный порядок вывод элементов?

Есть элементы инфоблока. Выводим их на странице. При каждом хите (перезагрузке) страницы элементы должны выводится в псевдослучайном порядке. Кеш должен работать, вариант с установкой сортировки RAND не подходит.
Подскажите варианты
  • Вопрос задан
  • 145 просмотров
Пригласить эксперта
Ответы на вопрос 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Как в битриксе придумать псевдослучайный порядок вывод элементов?


Для начала, его нужно будет придумать не в битриксе, а вообще.

1. Вы можете использовать `rand` ключ сортировки из `CIblockElement::GetList` - это позволит выбирать псевдослучайные записи в количестве которые вы укажие в navParams.
В случае такой задачи это будет наиболее правильное решение.

2. Если такой вариант не подходит, то можете сделать многоуровневое кеширование.
Т.е. отдельный кеш идентификаторов элементов и (можете, но не обязательно) отдельный кеш под каждый элемент.
Соответственно получаете все ID (запросом или из кеша), перемешиваете и делаете ЛИБО получение через GetList скармливая в order порядок элементов либо обращение к своему методу и забор кеша (то самое многоуровневое кеширование).

Однако есть нюансы:
1. Кешировать все элементы и перебирать все элементы нет никакого смысла - вы дублируете базу данных кодом с меньшей эффективностью. Т.е. после такого производительность может не только не вырасти, но и упасть. Вам же еще нужно задуматься про обновление этих кешей.

2. В данном случае эффективнее кешировать не конкретные элементы, а вывод всей страницы. Т.е. делаете запросы, рендерите вывод и его кешируете. Следюущий запрос просто достанет кеш. В противном случае мало того что придется доставать кеширование данные, так вам еще придется тратить ресурсы на их рендер (а в большинстве случаев он будет одинаковый).

Еще увидел у вас в комментариях ваше предложение:
в result_modifier.php передать данные в component_epilog.php, получить ITEMS в component_epilog.php, рандомно сортировать этот массив, перенести содержимое template.php в component_epilog.php и выводить. Данные будут браться из кэша и при этом каждый раз сортироваться. Норм?))


Оно бессмысленное потому что передавать данные можно только в одном порядке: component -> result_modifier -> template -> component_epilog.
Т.е. дойдя до component_epilog вернуть в сам template (если только это не отложенная функция, но в таком случае профита нет никакого).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы