Сортировка в битрикс 500 что это
Перейти к содержимому

Сортировка в битрикс 500 что это

  • автор:

Как сделать сортировку элементов?

В битриксе есть сортировка shows — усредненное количество показов (количество показов / продолжительность показа), т.е. по сути популярные товары выводятся выше.
Как ограничить эту популярность по времени, чтобы первыми были товары популярные не за всё время, а за последние 30 дней? А далее выводим товары в любом другом порядке.
Ну и в принципе — как ограничивать сортировку??
К примеру, показать первыми только 10 новинок, далее любая другая сортировка, а в конце другие новинки.
т.е. нужны ограничения по числу или по периоду.

  • Вопрос задан более трёх лет назад
  • 572 просмотра

3 комментария

Простой 3 комментария

alex-1917

Перед вызовом компонента формируете массив согласно требуемым параметрам и вперед.
Это жуют на первой неделе курса (Разработчик Bitrix Framework https://dev.1c-bitrix.ru/learning/course/index.php. ), ВЫАЧЕМ вообще? )))

Антон @anton99zel Автор вопроса, куратор тега 1С-Битрикс

alex-1917, более похоже на «лишь бы ляпнуть».
Вот есть документированное описание:
https://dev.1c-bitrix.ru/learning/course/?COURSE_I.
Массив? Какой массив? Для фильтрации? Так мне не нужно фильтровать, мне нужно отсортировать в заданном порядке элементы.

alex-1917

Антон, ну по твоей ссылке все мои слова в разжеванном виде. Или по твоей ссылке тоже нихуха не понятно? Тогда на биржу.

Решения вопроса 0
Ответы на вопрос 3

alex-1917

Если ответ помог, отметь решением
Вот же по твоей ссылке Танюха пишет:

Перед вызовом компонента разместить код:

вот именно тут и формируется массив, именно для сортировки, откуда вообще слово фильтрация вылезло-то.

$sortField = 'ID'; // поле сортировки по умолчанию $sortOrder = 'ASC'; // направление сортировки по умолчанию if ( isset($_GET["sort"]) && isset($_GET["method"]) && ( $_GET["sort"] == "name" || $_GET["sort"] == "catalog_PRICE_3" || $_GET["sort"] == "property_PRODUCT_TYPE" || $_GET["sort"] == "timestamp_x"))

и уже в компоненте применяешь сформированные параметры из массива

"ELEMENT_SORT_FIELD" => $sortField, "ELEMENT_SORT_ORDER" => $sortOrder,

Ответ написан более трёх лет назад
Антон @anton99zel Автор вопроса, куратор тега 1С-Битрикс
Это совершенно не то!
Мне не нужна пользовательская сортировка!
У меня есть гет лист

$sortField = 'shows'; $sortOrder = 'DESC'; $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_PICTURE", "PROPERTY_FOTO_45", "DETAIL_PAGE_URL", "CATALOG_PRICE_1", "PROPERTY_PHOTOMODULE", "PROPERTY_PHOTOMODULECHECK"); $arFilter = Array("IBLOCK_ID"=>66, "SECTION_ID"=>309, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y"); $res = CIBlockElement::GetList(Array($sortField => $sortOrder), $arFilter, false, Array("bShowAll"=>false, "nPageSize"=>16, "iNumPage"=>$pn), $arSelect); while. 

$sortField = ‘shows’ — выведет в начале списка популярные, в конце списка менее популярные.
Shows, т.е. усредненные просмотры — это просмотры за всё время существования элементов. А мне нужно ограничить shows, например 10 или 30 днями. Это будет первая сортировка.
Вторая сортировка будет, например Новинки недели, третья еще какая нибудь.

alex-1917

Антон, да я знаю, что это не то, не надо так кричать.
дело в том, что это и не будет то, я ж не подписывался на полное выполнение вашего ТЗ)))
я указал, что такое массив, вы про него в своих комментах спрашивали.
в данном текущем случае это переменная, стандартно используется массив из нескольких переменных, но это пока вам еще рано.
а что касается вашего кода, то хотя бы погугли бы что ли,вам надо ограничть кол-во элементов в выборке,и вот это уже называется ФИЛЬТРАЦИЯ.
это примерно так:

$rs = CIBlockElement::GetList ( Array(), Array(), false, Array ("nTopCount" => 5) );

закрываю комменты, я устал, я ухожу)) ждут проекты по 2500 за час, соряны)))

serginhold

serginhold @serginhold

никак, если страшно писать sql запросы или создавать новые таблицы

function GetShowedFunction() < return " IfNULL(BE.SHOW_COUNTER/((UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(BE.SHOW_COUNTER_START)+0.1)/60/60),0) "; >

битрикс не хранит в b_iblock_element данные, когда он что-то показал, тупо хранит дату первого показа и ее использует

по этому варианты:
1) забить на эту хотелку
2) использовать собственный sql запрос с join на таблицу b_catalog_viewed_product (CatalogViewedProductTable), это если речь идет о товарах в магазине
3) пункт 2. не подходит, т.к. данные не являются товарами, значит делаем свою таблицу с просмотрами, где будут даты просмотров

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

alexyarik

Битрикс разработчик

Берёте заготовку кастомного комплексного компонента в материалах экзамена №2 и в нём пишите свою логику формирования массива списка товаров.
Свой функционал усредненного количества показов за последние 30 дней скорее всего вам придётся писать в своём модуле и значения показов хранить в своих таблицах базы данных.

Форум

Доброе время суток.
В поле сортировки элементов по умолчанию стоит 500, а надо чтобы по умолчанию стояло уже при создании элемента сразу было 1. Где изменить параметр?

_______________________
|Все в мире относительно. |
^^^^^^^^^^^^^^^^^^^
Посетитель
Сообщений: 55 Баллов: 6 Регистрация: 04.10.2008
30.10.2008 14:01:00

Это ставится при создании или редактировании информационного блока .Зайдите контент///информационные блоки///типы информационных блоков и там измените ваш 500 на то что Вы хотите ,только 1 быть не должно ,так как вы тогда просто не сможите делать новости первыми ,сможите только последними

Посетитель
Сообщений: 64 Баллов: 9 Регистрация: 26.02.2008
13.11.2008 21:09:00
Спасибо. Помогло
_______________________
|Все в мире относительно. |
^^^^^^^^^^^^^^^^^^^
Сообщений: 1146 Баллов: 102 Регистрация: 16.03.2013
11.11.2014 15:21:48

Не нашёл, где можно изменить сортировку «по умолчанию» (значение 500) для формы создания элемента инфоблока. Может кто-нибудь подсказать?

Заглянувший
Сообщений: 32 Баллов: 1 Регистрация: 18.01.2011
27.12.2016 11:21:07
А в коде где это прописано, что всегда сохраняет 500?
Страницы: 1

Центр поддержки

Продукты

Управление сайтом
Битрикс24
Интернет-магазин + CRM

Решения

Для интернет-магазинов
Каталог готовых решений

Внедрение

Выбрать партнера
Проверить партнера
Стать партнером

1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

Контент для лиц от 16 лет и старше

© 2001-2024 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности

Bitrix news:list сортировка

К одному сайту подключено большое количество региональных поддоменов. В настройках инфоблока заведено свойство REGION , по которому необходимо сортировать элементы в многочисленных компонентах на страницах сайта. К примеру, на поддомене arh.example.com отображен список последних статей за месяц, но приоритетными в списке показываются статьи по региону Архангельск (REGION=3), затем по дате активности убыванию. Требуется настроить сортировку, чтобы к запросу добавлялось ORDER BY FIELD(PROPERTY_REGION_VALUE, 3) DESC , где 3 — id текущего региона. Пробую кастомизировать компонент news.list, в котором вызывается метод CIBlockElement::getList() , но, судя по всему, он не позволяет осуществлять сортировку таким образом. Есть ли способ правильно и без костылей добавить нужное условие в запрос, не переписывая при этом половину методов битрикса?

Отслеживать
задан 21 окт 2019 в 11:07
innokentij innokentij
754 3 3 серебряных знака 19 19 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Как я понял, свойство REGION у вас числовое. Прочитайте здесь, если еще не читали. Насколько я понял, не должно быть никаких проблем с сортировкой по вашему свойству согласно этой статье. А если проблемы есть, то в чем они проявляются?

Отслеживать
ответ дан 21 окт 2019 в 12:20
60 6 6 бронзовых знаков

Неочевидно, как вывести сначала новые статьи с регионом с id 3, затем по всем остальным регионам. Как сделать это на уровне SQL-запроса, я знаю, а какое условие указывать в ELEMENT_SORT_FIELD — нет.

21 окт 2019 в 12:49

CIBlockElement::getList() такой вариант сортировки не поддерживает (не может сгенерировать такой тип SQL запроса).

Самое тривиальное решение: Использовать 2 компонета — в первом вы используете фильтр — выводить только данные по третьему региону. Во втором — наоборот, его исключаете. Но вероятнее всего вам такой вариант не подойдет, плюс будут проблемы с постраничной навигацией.

Логичнее использовать такое решение: Написать обработчик события на сохранение/изменение элементов ИБ. В случае если Статья региона 3 (Архангельск) то изменяем сортировку на большее число. (по-умолчанию сортировка 500 обычно, можно поставить 700) В самом же компоненте настроить сортировку: Первую — по дате, на уменьшение Вторичную — по сортировке, на уменьшение

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

Если же второй вариант не подходит (по предполагаемой выше причине), можно заморочиться с result_modifier.php Т.е. перед выводом вы пересортировываете Статьи в нужном вам порядке, конечно же будет стоять проблема по разбивке на страницы, но так же решаемая. Но в это уже не углубляюсь, т.к. не известно нужно ли оно для данного решения.

P.S. как видите очень много предположений о вашей ситуации, т.к. не достаточно раскрыта ситуация в вашем вашем вопросе.

Как в 1С-Битрикс сделать рандомную сортировку в каталоге?

Добрый день! Стоит задача:
в компоненте каталог, при выводе элементов раздела, сделать рандомную сортировку. Только не для всех элементов, а только для тех у которых индекс сортировки больше 23 (равен 500 например). Как это можно реализовать?

  • Вопрос задан более трёх лет назад
  • 466 просмотров

15 комментариев

Простой 15 комментариев

babarun

Алексей Емельянов @babarun Куратор тега 1С-Битрикс

Только не для всех элементов, а только для тех у которых индекс сортировки больше 23 (равен 500 например).

Вы хотите сделать какую то частичную сортировку? У кого индекс сортировки меньше 23 их нужно выводить?

alexander_chn @alexander_chn Автор вопроса

Алексей Емельянов, да, то есть еще раз:
те элементы, индекс сортировки которых равен 23 и меньше — сортируем по индексу. Все остальные — рандомно.

Suntechnic

Александр Маджугин @Suntechnic
А первая сортировка SORT=>ASC, а вторая RAND=>RAND не работает таким образом?
alexander_chn @alexander_chn Автор вопроса
Александр Маджугин, не работает. А как и где нужно прописать мое условие?

Suntechnic

Александр Маджугин @Suntechnic

alexander_chn, ну в комопненте соотвественно:
ELEMENT_SORT_FIELD => SORT
ELEMENT_SORT_ORDER => ASC
ELEMENT_SORT_FIELD2 => RAND
ELEMENT_SORT_ORDER2 => RAND

Не факт что это сработает. По логике должно рандомно сортировать элементы с одинаковым SORT, но на практике не помню — там какая-то заморочка с этим RAND дополнительная.
Однако попробовать стоит.

alexander_chn @alexander_chn Автор вопроса
Александр Маджугин, попробовал — не работает.

Suntechnic

Александр Маджугин @Suntechnic

alexander_chn, все в случайном порядке выводит?
У вас сколько элементов с индексом сортировки 23 и меньше может быть обычно и каков размер страницы?

alexander_chn, что за космические технологии? Разве mysql так умеет? Значит и Битрикс не умеет.
alexander_chn @alexander_chn Автор вопроса

Александр Маджугин, выходит 22 элемента с индексом сортировки от 1 до 22 (по возрастанию). все остальные идут с индексом 500.

alexander_chn, если не секрет, зачем тебе это? Просто работа с сортировкой rand подразумевает отсутствие кеширования. Это мягко говоря не очень.

Suntechnic

Александр Маджугин @Suntechnic

alexander_chn, выведете отдельно двумя компонентами первые 22 элемента, а потом остальные.

PetrPo, ну почему не очень — если сервак нормальный, посещаемость не высокая и товаров не миллионы — пусть работает.
А если хоть что-то из этого, то какой к черту компоненты каталога? Нормально нужно тогда делать.

Александр Маджугин, не соглашусь с тем что пусть так работает, но согласен что нормально нужно делать.
А так у меня тоже есть вариант, достать все элементы, написать php-ную сортировку и сделать свою постраничку, даже с кешированием работать будет))

Suntechnic

Александр Маджугин @Suntechnic

PetrPo, не будет. Т.е. будет, но толку будет мало, так как PHP будет ворочать огромными наборами данных в памяти.
Если бы мне поставили такую задачу как ТС, и сказали что надо юзать стандартные компоненты да еще и комплексные, я бы поматерился и предложил делать так как в ответе ниже

Александр Маджугин, шутки шутками, но тут только один правильный ответ, mysql не умеет так делать, а программируя на высокоуровневом япе ты не можешь прыгнуть ниже этого уровня, поэтому надо принять такое ограничение. А реализовывать то что ты написал, да мне даже читать больно)) + не вижу решения с постраничкой

Suntechnic

Александр Маджугин @Suntechnic

PetrPo, вполне реализуемо и будет работать. Для постранички просто передавай параметр второй сортировки.
Есть задача и ее нужно решить. Да — в ней мало практического смысла, да — заказчик скорее всего не отдает себе отчета в что хочет получить. Но он платит деньги. Решение есть и его можно внедрить.
Что конкретно вызывает у тебя боль?

Рост размера кэша? Не вижу проблем — там смешные объемы по сравнению с картинками к этим товарам.

Индексация? Ну выводи сразу все элементы не пряча в скрипт и перемешивай их на странице уже js’ом. Самое простое — сделать их флексами и расставить order случайно.

Проблема с ужасными дефолтными скриптами компонентов ( кстати сами они боли не вызвают?) ? См. предыдущий пункт. Или вариант два — инициализировать их после рендера элементов.

Короче считаю что задача имеет решение, и не одно и если клиента не удается от нее отговорить — решить можно.

Решения вопроса 0
Ответы на вопрос 1

Suntechnic

Александр Маджугин @Suntechnic

Делаем обычную сортировку по SORT, а дальше:

1 в шаблоне выводим только элементы с сортировкой меньше 23, остальные вываливаем в виде данных и рендерим на на странице js’ом (тупой вариант: выводить в тег script с невыполняемым type, и оттуда добавлять js’ом в страницу), страницы по набору элементов будут одинаковые, но порядок каждый раз будет разным. Кэш работает.

2 Добавляем 2-4 дополнительных свойства скажем SORT1, SORT2 и т.д. зафигачиваем эти свойства случайными числами и делаем вторую сортировку по одному из них. При этом выбираем по какому именно рандомно. Получаем 4 кэша с разными страницами по составу.

3 Раз в сутки ночью, агентом переписываем эти допсвойства на другие случайные значения.

Итого: кэш работает, видимость случайности есть, причем она при каждом обновлении разная и даже хрен поймешь что страницы часто одинаковы по составу. Объем кэша каталог вырастит — ну у всего есть цена.

UPD:
Про решение с двумя компонентами — да просто во втором компоненте на первой странице скройте 22 элемента первые и все. Естественно страница должна быть больше 22 элементов.
Возможно вы сразу возразите, что тогда посетитель в постраничной выборке не увидит эти 22 элемента, поэтому сразу отвечу — вас это вообще не должно волновать, так как у вас посетитель вообще не увидит почти половину каталога (так на вскидку 40-45%) при случайной выборке + пагинации. Вообще пагинация при настоящей случайной выборке полностью лишена смысла.
Рабочее решение близкое к вашим требованиям я выше привел.
Если хотите избавится в нем от того что часть элементов каталога будет невидна при пагинации — передавайте в свойствах пагинации еще и свойство сортировки случайно выставленное на первой стартовой странице.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *