Карточка товара - вывод свойств, картинок и характеристик
Разбираемся, где живёт шаблон карточки товара, как вывести в ней свои свойства и почему детальная страница открывается пустой.
Решение
Копируем шаблон комплексного компонента к себе:
# из шаблона сайта, а не из /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 напрямую. Тогда адреса и ЧПУ придётся собирать самому: комплексный компонент нужен именно ради связки списка, карточки и фильтра под общими адресами.
Смежное
-
Каталог товаров - оглавление подтемы
-
Торговые предложения: настройка и связь с товаром - варианты товара в карточке
-
Не работает кнопка «В корзину»: причины по убыванию частоты - кнопка покупки в карточке не работает
-
Компоненты 2.0 - устройство компонентов и шаблонов
-
Каталог и продажи - каталог целиком
-
Ссылка на товар ведёт в 404 - когда карточка не открывается вовсе
-
Картинки товара при обмене: детальная, дополнительные, разделы - откуда изображения приезжают
-
Множественные свойства: вывод файлов, фильтр, удаление значений - вывод дополнительных картинок
-
Свойства торговых предложений: вывод выбора и связь с товаром - выбор размера и цвета в карточке
-
Текущий товар и раздел: как достать их в шаблоне и на странице - откуда брать идентификатор товара
-
Характеристики товара: группы свойств, порядок и пустые значения - таблица характеристик в карточке
-
Добавление в корзину: из списка, из кода, с нужными свойствами - кнопка покупки и свойства позиции
-
Быстрый просмотр товара: всплывающая карточка и её сбои - сокращённая карточка из списка
-
Подписка на поступление товара: уведомление о наличии - кнопка вместо покупки при нулевом остатке
-
Сопутствующие товары: связи, комплекты и подарки - блок аксессуаров в карточке
-
Картинки товара: загрузка, размеры и вывод галереи - галерея и уменьшенные копии
-
Заголовки и метатеги каталога: шаблоны для разделов и товаров - заголовок страницы товара
-
Отзывы о товаре: хранение, модерация, средняя оценка - что ещё показывают в карточке
-
Компонент не отдаёт нужных данных: причины по убыванию частоты - когда свойство не доехало до шаблона
-
Свойство не выводится в шаблоне: разбор причин - когда свойство не доехало до шаблона
-
Ускорение карточки товара: состав блоков, отложенная загрузка - что делать, когда карточка тормозит