Как реализовать фильтр по свойству «Цвет» для простых товаров и товаров с ТП?
В моем случае:
По вводным: если товар обычный - то устанавливаются цвет в свойство товараCOLOR
Сейчас ситуация такая: но если товар с торговыми предложениями, то тогда цвет у товара не заполняется, а заполняется только у его торговых предложений (У ТП тоже свойства с кодом -COLOR).
Сейчас ситуация такая: мне нужно получить товары, которые например имеют цветredИлиjade.
По вводным: то есть чтобы нашел либо простой товар с каким то из этих цветов и/или товар у которого есть торговое предложение с каким то из этих цветов.
По вводным: использую для вывода товаров компонентbitrix:catalog.section
По вводным: вот такой фильтр у меня получается:
{ ">=CATALOG_PRICE_1":844, "<=CATALOG_PRICE_1 ":4834, "PROPERTY_IS_NEW":"29", "0":{ "LOGIC":"OR", "0":{ "PROPERTY_COLOR":[ "red", "jade" ] }, "1":{ "PROPERTY_COLOR ":false, "OFFERS":{ "ACTIVE":"Y", "PROPERTY_COLOR":[ "red", "jade" ] } } } }
Нужно понять: подскажите, в чем ошибки и как решить эту проблему?
По вводным: вот параметры компонента на всякий случай:
$componentParams = [ 'IBLOCK_ID' => Constants::IBLOCK['CATALOG'], 'IBLOCK_TYPE' => 'catalog', 'SECTION_ID' => $sectionId, 'PAGE_ELEMENT_COUNT' => $request->get('SIZEN_1') ?: 20, 'CACHE_TYPE' => 'N', // Отключаем кеш для AJAX 'CACHE_TIME' => 0, 'CACHE_FILTER' => 'N', 'AJAX_MODE' => 'N', 'FILTER_NAME' => 'arrFilter', 'COMPATIBLE_MODE' => 'Y', 'ELEMENT_SORT_FIELD' => $sort[0], 'ELEMENT_SORT_FIELD2' => 'id', 'ELEMENT_SORT_ORDER' => $sort[1], 'ELEMENT_SORT_ORDER2' => 'desc', 'DISPLAY_TOP_PAGER' => 'N', 'HIDE_NOT_AVAILABLE' => 'N', 'HIDE_NOT_AVAILABLE_OFFERS' => 'N', 'INCLUDE_SUBSECTIONS' => 'Y', 'OFFERS_PROPERTY_CODE' => ['COLOR', 'CML2_LINK'], 'OFFERS_SORT_FIELD' => 'sort', 'OFFERS_SORT_FIELD2' => 'id', 'OFFERS_SORT_ORDER' => 'asc', 'OFFERS_SORT_ORDER2' => 'desc', 'PAGER_SHOW_ALL' => 'N', 'PAGER_SHOW_ALWAYS' => 'N', 'PRICE_CODE' => ['BASE'], 'SHOW_404' => 'N', 'SHOW_ALL_WO_SECTION' => 'N', 'SHOW_CLOSE_POPUP' => 'N', 'SHOW_DISCOUNT_PERCENT' => 'Y', 'SHOW_FROM_SECTION' => 'N', 'SHOW_MAX_QUANTITY' => 'N', 'SHOW_OLD_PRICE' => 'N', 'SHOW_PRICE_COUNT' => '1', 'SHOW_SLIDER' => 'N', 'GROUP_BY' => $request->getPost('group_by'), ];
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В Битриксе у простого товара и товара с торговыми предложениями цвет обычно живёт в разных местах. У простого товара свойство COLOR лежит в инфоблоке товаров, а у товара с ТП цвет часто хранится в инфоблоке торговых предложений. Поэтому стандартный фильтр по свойству товара не видит цвет, который заполнен только у SKU.
Правильная схема зависит от того, что именно должен фильтровать пользователь.
Если нужно показывать товар, когда хотя бы одно его торговое предложение имеет выбранный цвет, фильтр должен учитывать свойства SKU. В стандартном catalog.smart.filter это обычно решается через настройки торговых предложений и свойства предложений:
Если фильтр должен быть единым и быстрым, часто делают синхронизацию цветов из SKU в родительский товар. Например, у товара хранится множественное свойство AVAILABLE_COLORS, куда агентом или обработчиком обновления записываются все цвета его предложений. Тогда фильтр работает по товарному инфоблоку, а не по SKU.
Логика синхронизации примерно такая:
$colors = []; // Получить все активные SKU текущего товара // Собрать значения COLOR // Записать их в свойство AVAILABLE_COLORS родительского элемента CIBlockElement::SetPropertyValuesEx($productId, $catalogIblockId, [ 'AVAILABLE_COLORS' => array_unique($colors), ]);
Для небольшого каталога можно настроить фильтр по SKU. Для крупного каталога я бы предпочёл отдельное агрегированное свойство у товара: оно проще для SEO-страниц, быстрее фильтруется и меньше зависит от тонкостей компонента. Главное - не дублировать цвет вручную, а обновлять его автоматически при изменении торговых предложений.