Добрый день, Разработчики.
Дано
Имеется стандартный каталог, с двумя инфоблоками — «Товары» (простой) и «Размеры» (торговый каталог).
Каталог выгружается из 1С. Соответственно, автоматически ставится привязка у элементов каталога «Размеры» к инфоблоку «Товары».
Имеется задача
Всегда выводить только актуальные товары в каталог (т.е. количество на складе больше 0 и никаких сообщений — нет на складе), с разбивкой по разделам и навигацией (пагинацией).
Тестовые данные, 9 товаров на странице, раздел «Тестирование», товаров 90 штук.
Итоговое решение
Его попросту не существует?
Первое решение
Даже если теоретически рассматривать запросы в цикле, то все равно получится так, что на странице могут оказаться из 9 товаров только 4, и появятся пустоты.
Второе решение
$CDBResult= new CDBResult;
$CDBResult->InitFromArray();
Первый запрос — выбираем все 90 товаров со всей информацией. Делаем второй запрос (с фильтром по ID товаров) — запрашиваем из инфоблока «Размеры» только те размеры, которые есть на складе.
Получаем два массива — в одном товары, в другом — актуальные размеры. Фильтруем через цикл, на выходе массив с актуальными товарами. Дальше формируем новый объект CDBResult и используем InitFromArray();
Минусы — может быть огромное количество товаров в разделе, тогда запросы будут нерациональными и тяжелыми.
Третье решение
Аналогично второму решение, но только без InitFromArray();.
Облегчим первый запрос — выбираем только ID, без информации о товаре. Второй запрос такой же. Также фильтруем. Но вместо CDBResult и InitFromArray(); используем третий запрос с фильтрацией только по актуальным ID, где запрашиваем всю информацию о товаре.
Минусы — легче, чем второе решение, но появляется третий запрос.
Четвертое решение
Делаем неактуальные товары неактивными. И в каталог выводим только активные элементы.
Как? Очень просто — каждые n-минут запускать через агента (или крон) скрипт, который будет апдейтить товары на актуальность.
Минусы — слишком тяжелый скрипт получится, хотя, это наверное лучший способ.
Пару слов про 1С.
Самый легкий способ. Выбрать в настройках интеграции — «Что делать с элементами отсутствующими в файле импорта» — деактивацию.
Но есть одно большое НО — все товары разом могут деактивироваться, если выгрузить только изменения.
Интересно было бы услышать ваше решение, с удовольствием почитаю комментарии.
Вдруг есть какой-нибудь магический метод в классах Битрикса или может сам Битрикс даст решение?
Дано
Имеется стандартный каталог, с двумя инфоблоками — «Товары» (простой) и «Размеры» (торговый каталог).
Каталог выгружается из 1С. Соответственно, автоматически ставится привязка у элементов каталога «Размеры» к инфоблоку «Товары».
Имеется задача
Всегда выводить только актуальные товары в каталог (т.е. количество на складе больше 0 и никаких сообщений — нет на складе), с разбивкой по разделам и навигацией (пагинацией).
Тестовые данные, 9 товаров на странице, раздел «Тестирование», товаров 90 штук.
Итоговое решение
Его попросту не существует?
Первое решение
Даже если теоретически рассматривать запросы в цикле, то все равно получится так, что на странице могут оказаться из 9 товаров только 4, и появятся пустоты.
Второе решение
$CDBResult= new CDBResult;
$CDBResult->InitFromArray();
Первый запрос — выбираем все 90 товаров со всей информацией. Делаем второй запрос (с фильтром по ID товаров) — запрашиваем из инфоблока «Размеры» только те размеры, которые есть на складе.
Получаем два массива — в одном товары, в другом — актуальные размеры. Фильтруем через цикл, на выходе массив с актуальными товарами. Дальше формируем новый объект CDBResult и используем InitFromArray();
Минусы — может быть огромное количество товаров в разделе, тогда запросы будут нерациональными и тяжелыми.
Третье решение
Аналогично второму решение, но только без InitFromArray();.
Облегчим первый запрос — выбираем только ID, без информации о товаре. Второй запрос такой же. Также фильтруем. Но вместо CDBResult и InitFromArray(); используем третий запрос с фильтрацией только по актуальным ID, где запрашиваем всю информацию о товаре.
Минусы — легче, чем второе решение, но появляется третий запрос.
Четвертое решение
Делаем неактуальные товары неактивными. И в каталог выводим только активные элементы.
Как? Очень просто — каждые n-минут запускать через агента (или крон) скрипт, который будет апдейтить товары на актуальность.
Минусы — слишком тяжелый скрипт получится, хотя, это наверное лучший способ.
Пару слов про 1С.
Самый легкий способ. Выбрать в настройках интеграции — «Что делать с элементами отсутствующими в файле импорта» — деактивацию.
Но есть одно большое НО — все товары разом могут деактивироваться, если выгрузить только изменения.
Интересно было бы услышать ваше решение, с удовольствием почитаю комментарии.
Вдруг есть какой-нибудь магический метод в классах Битрикса или может сам Битрикс даст решение?