Перейти к содержимому

Карточка товара - вывод свойств, картинок и характеристик

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

Решение

Копируем шаблон комплексного компонента к себе:

Окно терминала
# из шаблона сайта, а не из /bitrix/: правки в ядре снесёт обновление
cp -r /home/bitrix/www/bitrix/components/bitrix/catalog/templates/.default \
/home/bitrix/www/local/templates/main/components/bitrix/catalog/shop

Карточка живёт внутри комплексного компонента, файл element.php. Отдельной страницы товара в структуре сайта нет: адреса собирает сам компонент по своим настройкам, и потому искать файл вроде catalog/element.php в структуре сайта бесполезно.

Добавляем своё свойство в параметры вызова:

$APPLICATION->IncludeComponent('bitrix:catalog', 'shop', [
// не перечисленное здесь свойство компонент в результат не положит
'DETAIL_PROPERTY_CODE' => ['MATERIAL', 'WARRANTY', 'CML2_ARTICLE'],
'IBLOCK_ID' => $iblockId,
'IBLOCK_TYPE' => 'catalog',
'SET_TITLE' => 'Y', // заголовок страницы собирает компонент
]);

Компонент выбирает только перечисленные свойства. Заполненное у элемента, но не названное здесь свойство в результат не попадёт, и в карточке будет пусто.

Выводим характеристики в шаблоне:

<?php foreach ($arResult['DISPLAY_PROPERTIES'] as $property): ?>
<?php if ($property['VALUE'] === '' || $property['VALUE'] === []) continue; ?>
<div class="prop">
<span class="prop__name"><?= $property['NAME'] ?></span>
<span class="prop__value"><?= is_array($property['DISPLAY_VALUE'])
? implode(', ', $property['DISPLAY_VALUE'])
: $property['DISPLAY_VALUE'] ?></span>
</div>
<?php endforeach; ?>

Ключ DISPLAY_VALUE уже содержит готовое к выводу значение: для списка это название, для привязки - имя элемента. Множественное свойство приходит массивом, поэтому проверка на массив обязательна.

Сырые значения лежат рядом, в ключе PROPERTIES, и в шаблоне они почти никогда не нужны. Там идентификаторы вместо названий, пустые свойства и служебные поля, а приводить их к виду для показа пришлось бы своим кодом. Компонент это уже сделал, и повторять его работу в шаблоне значит наживать расхождение.

Проверяем, почему детальная страница пустая:

$el = CIBlockElement::GetList([], ['IBLOCK_ID' => $iblockId, 'ID' => $productId],
false, false, ['ID', 'ACTIVE', 'ACTIVE_FROM', 'ACTIVE_TO', 'IBLOCK_SECTION_ID']);
$row = $el->Fetch();
$price = CCatalogProduct::GetByID($productId);
echo $row ? "элемент есть, активен: {$row['ACTIVE']}\n" : "элемента нет\n";
echo $price ? "в торговом каталоге есть\n" : "в торговом каталоге нет\n";
// свойство, не названное в параметрах вызова, до шаблона просто не доедет

Эти два запроса разделяют все случаи пустой карточки: элемента нет вовсе, он неактивен, он вне раздела или он не заведён в торговом каталоге.

Проверять стоит именно в таком порядке, от данных к шаблону. Правка вёрстки при пустом результате выборки не даст ничего, а времени уходит много. Шаблон имеет смысл открывать только после того, как выборка вернула заполненный элемент с ценой и активностью.

Типичные проблемы

Свойство заполнено, а в карточке его нет.

Код свойства не перечислен в параметре DETAIL_PROPERTY_CODE. Компонент выбирает только названные свойства и остальные молча пропускает.

Правки шаблона пропали после обновления.

Шаблон правился прямо в /bitrix/components/. Обновление платформы перезаписывает эту папку целиком: свои шаблоны кладут в шаблон сайта или в /local/.

Карточка открывается, а цены и кнопки покупки нет.

У элемента нет записи в торговом каталоге. Инфоблок и каталог - разные хранилища, и элемент может существовать только в первом.

Переход на карточку ведёт на 404.

Не совпадают настройки ЧПУ комплексного компонента и правило в urlrewrite.php. Компонент строит ссылку по своим шаблонам путей, а разбирает адрес правило.

Множественное свойство выводится словом Array.

У множественного свойства DISPLAY_VALUE приходит массивом. Его склеивают через implode, а не печатают напрямую.

Частые вопросы

Чем DISPLAY_PROPERTIES отличается от PROPERTIES?

В PROPERTIES лежат сырые значения, включая пустые и идентификаторы вместо названий. В DISPLAY_PROPERTIES компонент кладёт только заполненные свойства и уже приводит их к виду для показа. Для вывода в шаблоне берут второе.

Как вывести дополнительные картинки товара?

Через свойство типа «файл» с включённой множественностью. В шаблоне оно приходит массивом идентификаторов файлов, и каждый разворачивают через CFile::GetPath.

Почему в админке пропали вкладки карточки?

Обычно это следы своего обработчика на событиях формы редактирования либо отключённого модуля, который эти вкладки добавлял. Проверяют отключением своих обработчиков в init.php.

Можно ли сделать свою страницу товара вне комплексного компонента?

Да, вызовом bitrix:catalog.element напрямую. Тогда адреса и ЧПУ придётся собирать самому: комплексный компонент нужен именно ради связки списка, карточки и фильтра под общими адресами.

Смежное

Первоисточник