Есть страница с компонентом catalog. Соответственно, список товаров определённого раздела выводится компонентом catalog.section. Который, в свою очередь, дёргает catalog.item. У которого, в конце концов, вызывается шаблон card/template.php.
Ближе к концу файла проверяется флаг [FONT=monospace]$item['OFFERS_PROPS_DISPLAY'][/FONT], и если он установлен, выводятся торговые предложения из [FONT=monospace]$item['JS_OFFERS'][/FONT].
Проблема в том, что[FONT=monospace] $item['OFFERS_PROPS_DISPLAY'][/FONT] равен [FONT=monospace]false[/FONT].
Этот флаг зависит от заполненности списка [FONT=monospace]$offer['DISPLAY_PROPERTIES'][/FONT] в каждом торговом предложении.
Хвосты ведут в файл [FONT=monospace]catalog.section/.default/result_modifier.php[/FONT], где вызывается код[CODE]$component = $this->getComponent();
$arParams = $component->applyTemplateModifications();[/CODE]
который в итоге приводит в файл [FONT=monospace]bitrix/modules/iblock/lib/component/elementlist.php[/FONT], в метод [FONT=monospace]editTemplateOfferProps()[/FONT].
Там как раз у каждого торгового предложения убивается то самое важное поле [FONT=monospace]$offer['DISPLAY_PROPERTIES'][/FONT]:[CODE]\CIBlockPriceTools::clearProperties($offer['DISPLAY_PROPERTIES'], $iblockParams['OFFERS_TREE_PROPS']);[/CODE]
Суть этого метода в том, что из [FONT=monospace]$offer['DISPLAY_PROPERTIES'][/FONT] удаляются все свойства, перечисленные в [FONT=monospace]$iblockParams['OFFERS_TREE_PROPS'][/FONT].
Берётся эта переменная чуть выше по коду:[CODE]$iblockParams = $this->storage['IBLOCK_PARAMS'][$item['IBLOCK_ID']];[/CODE]
Свойство торговых предложений, которое мне нужно выводить в карточках товаров, называется [B]RAZMER[/B]. там могут быть значения типа [B]15, 16, 17[/B] итд. И вот по каким-то причинам в [FONT=monospace]$iblockParams['OFFERS_TREE_PROPS'][/FONT] указано именно свойство - в виде массива: [FONT=monospace]['RAZMER'][/FONT].
Затык расследования в том, что я не могу найти, где инициализируется [FONT=monospace]$this->storage['IBLOCK_PARAMS'][/FONT]. Несомненно, инициализация есть в файле [FONT=monospace]bitrix/modules/iblock/lib/component/base.php[/FONT], метод[FONT=monospace] loadOfferTreePropertyCodes()[/FONT] - но попытка вклинить туда отладку не увенчалась успехом: этот метод не вызывается.
Допустим, что инициализация действительно происходит этим вызовом:[CODE]Catalog\Product\PropertyCatalogFeature::getOfferTreePropertyCodes(
$this->storage['CATALOGS'][$iblockId]['IBLOCK_ID'],
['CODE' => 'Y']
);[/CODE]
судя по всему, это значит, что настройки содержатся не в настройках компонента catalog, а где-то в админке. Быстрый просмотр админки ничего подозрительного не дал. Вопрос всё ещё в силе: почему в настройках инфоблока торговых предложений указанно, что удалять нужно именно свойство [B]RAZMER[/B] - единственно важное для вывода на списочной странице в карточках товаров.
При этом тот же самый "размер" без проблем используется на детальных страницах товаров - размеры можно щёлкать, при этом переключаются цены. То есть, в заполнении товарной базы проблем тоже нет.
Настройки компонента catalog следующие:
[COLOR=#005b7e]Внешний вид -> Схема отображения: [B]расширенный[/B][/COLOR]
[COLOR=#005b7e]Внешний вид -> Свойства для отбора предложений: [B][212][RAZMER] Размер[/B][/COLOR]
[COLOR=#005b7e]Настройки списка -> Свойства предложений: [B][RAZMER] Размер[/B][/COLOR]
Куда копать, куда спасаться? Пока что обходным вариантом видится полное игнорирование [FONT=monospace]JS_OFFERS, OFFERS_PROPS_DISPLAY[/FONT] и прочих, и самодельная реализация через использование массива [FONT=monospace]$offer['PROPERTIES'][/FONT], который, к счастью, заполнен всегда. Тем более, шаблон всё равно нужно кастомизировать. Но беспокоит, что рано или поздно эта непонятная ситуация может выстрелить где-нибудь в неожиданном месте; и всегда лучше попытаться разобраться по-красоте, а не сразу кидаться через бурелом.
Ближе к концу файла проверяется флаг [FONT=monospace]$item['OFFERS_PROPS_DISPLAY'][/FONT], и если он установлен, выводятся торговые предложения из [FONT=monospace]$item['JS_OFFERS'][/FONT].
Проблема в том, что[FONT=monospace] $item['OFFERS_PROPS_DISPLAY'][/FONT] равен [FONT=monospace]false[/FONT].
Этот флаг зависит от заполненности списка [FONT=monospace]$offer['DISPLAY_PROPERTIES'][/FONT] в каждом торговом предложении.
Хвосты ведут в файл [FONT=monospace]catalog.section/.default/result_modifier.php[/FONT], где вызывается код[CODE]$component = $this->getComponent();
$arParams = $component->applyTemplateModifications();[/CODE]
который в итоге приводит в файл [FONT=monospace]bitrix/modules/iblock/lib/component/elementlist.php[/FONT], в метод [FONT=monospace]editTemplateOfferProps()[/FONT].
Там как раз у каждого торгового предложения убивается то самое важное поле [FONT=monospace]$offer['DISPLAY_PROPERTIES'][/FONT]:[CODE]\CIBlockPriceTools::clearProperties($offer['DISPLAY_PROPERTIES'], $iblockParams['OFFERS_TREE_PROPS']);[/CODE]
Суть этого метода в том, что из [FONT=monospace]$offer['DISPLAY_PROPERTIES'][/FONT] удаляются все свойства, перечисленные в [FONT=monospace]$iblockParams['OFFERS_TREE_PROPS'][/FONT].
Берётся эта переменная чуть выше по коду:[CODE]$iblockParams = $this->storage['IBLOCK_PARAMS'][$item['IBLOCK_ID']];[/CODE]
Свойство торговых предложений, которое мне нужно выводить в карточках товаров, называется [B]RAZMER[/B]. там могут быть значения типа [B]15, 16, 17[/B] итд. И вот по каким-то причинам в [FONT=monospace]$iblockParams['OFFERS_TREE_PROPS'][/FONT] указано именно свойство - в виде массива: [FONT=monospace]['RAZMER'][/FONT].
Затык расследования в том, что я не могу найти, где инициализируется [FONT=monospace]$this->storage['IBLOCK_PARAMS'][/FONT]. Несомненно, инициализация есть в файле [FONT=monospace]bitrix/modules/iblock/lib/component/base.php[/FONT], метод[FONT=monospace] loadOfferTreePropertyCodes()[/FONT] - но попытка вклинить туда отладку не увенчалась успехом: этот метод не вызывается.
Допустим, что инициализация действительно происходит этим вызовом:[CODE]Catalog\Product\PropertyCatalogFeature::getOfferTreePropertyCodes(
$this->storage['CATALOGS'][$iblockId]['IBLOCK_ID'],
['CODE' => 'Y']
);[/CODE]
судя по всему, это значит, что настройки содержатся не в настройках компонента catalog, а где-то в админке. Быстрый просмотр админки ничего подозрительного не дал. Вопрос всё ещё в силе: почему в настройках инфоблока торговых предложений указанно, что удалять нужно именно свойство [B]RAZMER[/B] - единственно важное для вывода на списочной странице в карточках товаров.
При этом тот же самый "размер" без проблем используется на детальных страницах товаров - размеры можно щёлкать, при этом переключаются цены. То есть, в заполнении товарной базы проблем тоже нет.
Настройки компонента catalog следующие:
[COLOR=#005b7e]Внешний вид -> Схема отображения: [B]расширенный[/B][/COLOR]
[COLOR=#005b7e]Внешний вид -> Свойства для отбора предложений: [B][212][RAZMER] Размер[/B][/COLOR]
[COLOR=#005b7e]Настройки списка -> Свойства предложений: [B][RAZMER] Размер[/B][/COLOR]
Куда копать, куда спасаться? Пока что обходным вариантом видится полное игнорирование [FONT=monospace]JS_OFFERS, OFFERS_PROPS_DISPLAY[/FONT] и прочих, и самодельная реализация через использование массива [FONT=monospace]$offer['PROPERTIES'][/FONT], который, к счастью, заполнен всегда. Тем более, шаблон всё равно нужно кастомизировать. Но беспокоит, что рано или поздно эта непонятная ситуация может выстрелить где-нибудь в неожиданном месте; и всегда лучше попытаться разобраться по-красоте, а не сразу кидаться через бурелом.