Характеристики товара - группы свойств, порядок и пустые значения
Собираем таблицу характеристик товара из свойств инфоблока и приводим её в вид, пригодный для покупателя.
Решение
Смотрим, какие свойства вообще есть у товаров:
$res = CIBlockProperty::GetList(['SORT' => 'ASC'], ['IBLOCK_ID' => 5]);while ($prop = $res->Fetch()) { printf("%-20s %-4s сорт=%-5s группа=%s\n", $prop['CODE'], $prop['PROPERTY_TYPE'], $prop['SORT'], $prop['PROPERTY_GROUP_ID'] ?: '-');}Свойств у каталога, приехавшего из учётной системы, обычно втрое больше, чем нужно покупателю. Служебные поля обмена лежат рядом с характеристиками, и разделяют их только код и группа.
Перечисляем характеристики в параметрах компонента:
'DETAIL_PROPERTY_CODE' => ['MATERIAL', 'WEIGHT', 'COUNTRY'], // что показать'DISPLAY_PROPERTIES' => ['MATERIAL', 'WEIGHT'], // что в блоке свойств'PROPERTY_CODE_MOBILE' => [],Компонент отдаёт только названные свойства. Список из десятков кодов в параметрах
- обычная картина, и поддерживать его руками при каждом новом свойстве приходится вручную.
Выводим характеристики в шаблоне:
foreach ($arResult['DISPLAY_PROPERTIES'] as $prop) { if ($prop['DISPLAY_VALUE'] === '' || $prop['DISPLAY_VALUE'] === []) { continue; // пустые характеристики покупателю не нужны } printf("<tr><td>%s</td><td>%s</td></tr>\n", $prop['NAME'], is_array($prop['DISPLAY_VALUE']) ? implode(', ', $prop['DISPLAY_VALUE']) : $prop['DISPLAY_VALUE']);}Готовое к выводу значение лежит в отдельном ключе: у списка это текст значения, у привязки - название связанного элемента. Сырое значение рядом хранит идентификаторы и для показа не годится.
Группируем характеристики по разделам таблицы:
$res = CIBlockPropertyGroup::GetList(['SORT' => 'ASC'], ['IBLOCK_ID' => 5]);while ($group = $res->Fetch()) { printf("%-6s %-24s сорт=%s\n", $group['ID'], $group['NAME'], $group['SORT']);}// принадлежность свойства группе видна в его поле PROPERTY_GROUP_IDГруппы свойств задаются в настройках инфоблока и приезжают в результат вместе со свойствами. Разложить характеристики по разделам таблицы можно и вручную, но при сотне свойств группы окупаются сразу.
Порядок характеристик берётся из сортировки свойств, а не из порядка их перечисления в параметрах компонента. Поэтому переставлять строки таблицы нужно в настройках инфоблока: правка списка кодов на порядок не влияет.
Список выводимых свойств удобно собирать кодом, а не поддерживать руками. Один проход по свойствам инфоблока с отбором по группе даёт готовый массив кодов, и новое свойство появляется в карточке само, без правки параметров компонента. Цена такого решения - лишняя выборка на страницу, и она окупается на каталогах, где свойства добавляются регулярно.
Служебные свойства обмена стоит держать в отдельной группе. Тогда их легко отсечь в шаблоне одним условием, и очередное новое поле из учётной системы не появится в карточке товара само собой.
Типичные проблемы
Свойство заполнено, а в карточке его нет.
Код свойства не перечислен в параметрах компонента. Компонент выбирает только названные свойства.
В характеристиках видны числа вместо названий.
Выводится сырое значение вместо готового к показу. У списков и привязок в нём лежат идентификаторы.
В таблице пустые строки.
Шаблон выводит все свойства подряд. Пустые значения отсекают условием перед выводом.
Порядок строк не меняется от правки параметров.
Порядок задаётся сортировкой свойств инфоблока, а не порядком кодов в параметрах компонента.
В карточке появились служебные поля обмена.
Они попали в список выводимых свойств. Такие поля держат в отдельной группе и отсекают по ней.
Частые вопросы
Как показать характеристики в списке товаров?
Тем же параметром у компонента списка: он отдаёт свойства так же, как детальная страница. На больших списках это заметно утяжеляет выборку.
Можно ли вывести все свойства без перечисления?
Компонент требует явного списка, но его можно собрать своим кодом по свойствам инфоблока и передать в параметры. Тогда новые свойства появляются в карточке автоматически.
Почему у одинаковых товаров разный набор характеристик?
Значения заполнены не у всех. Свойство без значения в результат не попадает, и таблица получается разной длины.
Как вывести характеристику из торгового предложения?
Из свойств предложения, а не товара: они лежат в разных инфоблоках. Компонент отдаёт их отдельным набором параметров.
Смежное
- Каталог товаров - оглавление подтемы
- Карточка товара: вывод свойств, картинок и характеристик - шаблон детальной страницы
- Свойства инфоблока: чтение, запись и фильтрация по значению - как устроены свойства
- Каталог и продажи - устройство магазина целиком
- Единицы измерения, вес и габариты товара - поля торгового каталога рядом со свойствами
- Сравнение и отложенные товары: хранение, счётчик, вывод - те же свойства в таблице сравнения