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

Сравнение и отложенные товары - хранение, счётчик, вывод

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

Решение

Смотрим, где лежит список сравнения:

$name = 'CATALOG_COMPARE_LIST';
print_r($_SESSION[$name] ?? []); // список живёт в сеансе покупателя
// имя списка задаётся параметром компонента и по умолчанию общее для сайта

Список сравнения хранится в сеансе посетителя, а вовсе не в базе. Отсюда его главное свойство: он исчезает вместе с сеансом, и покупатель, вернувшийся назавтра, находит пустую страницу сравнения.

Выводим счётчик в шапке:

$APPLICATION->IncludeComponent('bitrix:catalog.compare.list', 'counter', [
'IBLOCK_ID' => 5,
'NAME' => 'CATALOG_COMPARE_LIST',
'CACHE_TIME' => 0, // счётчик персональный: кэшировать нельзя
]);

Счётчик здесь персональный, и кэшировать его нельзя вовсе. На композитном сайте такие блоки выносят в динамические области, иначе первый посетитель делится своим счётчиком со всеми остальными.

Показываем страницу сравнения:

$APPLICATION->IncludeComponent('bitrix:catalog.compare.result', '', [
'IBLOCK_ID' => 5,
'FIELD_CODE' => ['NAME', 'PREVIEW_PICTURE'],
'PROPERTY_CODE' => ['MATERIAL', 'WARRANTY'], // что сравниваем
]);
// строки таблицы собираются в том же порядке, что и перечисленные свойства

Сравнение строится только по перечисленным в параметрах полям и свойствам. Свойство, не указанное в параметрах, в таблицу не попадёт, и это первая причина жалобы «сравнивает не то, что нужно».

Храним отложенные товары долго:

// своё хранилище: таблица «пользователь - товар - дата»
FavoriteTable::add(['USER_ID' => $USER->GetID(), 'PRODUCT_ID' => $productId]);
// список в сеансе живёт до его конца, список в базе - до удаления покупателем

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

Перенос списка гостя после входа стоит делать сразу же, а не «когда-нибудь». Покупатель, собравший отложенные до регистрации и потерявший их при входе, второй раз собирать их не будет.

Списки покупателя влияют на кэширование всей страницы. Любой блок, зависящий от конкретного человека, либо выносят из кэша, либо получают в кэш чужие данные - третьего варианта здесь нет.

Кнопку сравнения на карточке товара стоит показывать не всегда. В каталоге, где у товаров две-три характеристики, сравнивать нечего, и кнопка только занимает место рядом с кнопкой покупки.

Сравнение и отложенные легко превращаются в мёртвый интерфейс. Кнопки есть, списками не пользуются, а на каждой странице каталога они добавляют запросы - такие блоки стоит либо развивать, либо убирать.

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

Список сравнения пропал у покупателя.

Он хранится в сеансе покупателя, а сеанс уже закончился. Долгие списки держат в своей таблице, привязанной к пользователю.

Счётчик показывает чужое число.

Персональный блок попал в общий кэш страницы. Такие блоки выносят в динамические области композита.

В сравнении не хватает характеристик.

Нужные свойства не перечислены в параметрах компонента. Он сравнивает только то, что ему указали явно.

После входа отложенные исчезли.

Список гостя не переносится в список покупателя при его авторизации. Перенос делают своим обработчиком события входа.

Каталог стал медленнее после добавления кнопок.

Блоки списков запрашивают состояние на каждой карточке отдельно. Состояние получают одним запросом на всю страницу.

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

Чем сравнение отличается от отложенных?

Сравнение - короткий список для выбора здесь и сейчас, отложенные - долгий список «куплю потом». Отсюда и разные хранилища.

Можно ли хранить сравнение в базе?

Да, своим хранилищем, но обычно не нужно: список живёт минуты. Долгим делают именно отложенные.

Как показать счётчик на композитном сайте?

Динамической областью, которая собирается отдельным запросом. Иначе число попадает в общий кэш страницы.

Сколько товаров разрешать в сравнении?

Три-четыре: дальше таблица не помещается на экран. Ограничение задают параметром компонента.

Смежное

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