Как реализовать фильтр по свойству «Цвет» для простых товаров и товаров с ТП?

Ссылка скопирована
1 ответ

В моем случае:

По вводным: если товар обычный - то устанавливаются цвет в свойство товара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'), ];
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

В Битриксе у простого товара и товара с торговыми предложениями цвет обычно живёт в разных местах. У простого товара свойство COLOR лежит в инфоблоке товаров, а у товара с ТП цвет часто хранится в инфоблоке торговых предложений. Поэтому стандартный фильтр по свойству товара не видит цвет, который заполнен только у SKU.

Правильная схема зависит от того, что именно должен фильтровать пользователь.

Если нужно показывать товар, когда хотя бы одно его торговое предложение имеет выбранный цвет, фильтр должен учитывать свойства SKU. В стандартном catalog.smart.filter это обычно решается через настройки торговых предложений и свойства предложений:

  • Проверьте, что цвет создан как свойство инфоблока торговых предложений.
  • Свойство активно и доступно в умном фильтре.
  • В настройках компонента подключён инфоблок SKU и выбраны свойства предложений.
  • Товары связаны с предложениями корректно через CML2_LINK.

Если фильтр должен быть единым и быстрым, часто делают синхронизацию цветов из SKU в родительский товар. Например, у товара хранится множественное свойство AVAILABLE_COLORS, куда агентом или обработчиком обновления записываются все цвета его предложений. Тогда фильтр работает по товарному инфоблоку, а не по SKU.

Логика синхронизации примерно такая:

$colors = [];
// Получить все активные SKU текущего товара
// Собрать значения COLOR
// Записать их в свойство AVAILABLE_COLORS родительского элемента
CIBlockElement::SetPropertyValuesEx($productId, $catalogIblockId, [
    'AVAILABLE_COLORS' =&gt; array_unique($colors),
]);

$colors = []; // Получить все активные SKU текущего товара // Собрать значения COLOR // Записать их в свойство AVAILABLE_COLORS родительского элемента CIBlockElement::SetPropertyValuesEx($productId, $catalogIblockId, [ 'AVAILABLE_COLORS' =&gt; array_unique($colors), ]);

Для небольшого каталога можно настроить фильтр по SKU. Для крупного каталога я бы предпочёл отдельное агрегированное свойство у товара: оно проще для SEO-страниц, быстрее фильтруется и меньше зависит от тонкостей компонента. Главное - не дублировать цвет вручную, а обновлять его автоматически при изменении торговых предложений.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

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

Вам также может быть интересно