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

Не работает кнопка «В корзину» - причины по убыванию частоты

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

Как проверить

Смотрим, товар ли это вообще:

$product = \Bitrix\Catalog\ProductTable::getRow([
'filter' => ['=ID' => $productId],
'select' => ['ID', 'AVAILABLE', 'CAN_BUY_ZERO', 'QUANTITY', 'TYPE'],
]);
print_r($product);
// пусто - элемент инфоблока не заведён товаром, и покупать в нём нечего

Элемент инфоблока и товар торгового каталога - разные записи. Карточка без второй записи выглядит обычной страницей: кнопка на ней либо не рисуется, либо не делает ничего.

Добавляем позицию из кода:

$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), SITE_ID);
$item = $basket->createItem('catalog', $productId);
$item->setFields(['QUANTITY' => 1, 'CURRENCY' => 'RUB', 'LID' => SITE_ID,
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider']);
$result = $basket->save();
if (!$result->isSuccess()) {
print_r($result->getErrorMessages()); // причина отказа приходит текстом
}

Этот шаг делит задачу пополам. Если из кода позиция добавляется, дело в шаблоне и в запросе браузера; если нет - причина в самом товаре, его цене или остатке.

Смотрим запрос браузера при нажатии:

Окно терминала
# вкладка сети в браузере: адрес запроса, код ответа и тело
# 404 - шаблон зовёт файл, которого нет после переноса
# 403 или сообщение о ключе сессии - страница висит открытой слишком долго

Проверяем параметры компонента:

'ADD_TO_BASKET_ACTION' => 'ADD', // ADD - в корзину, BUY - сразу в оформление
'USE_PRODUCT_QUANTITY' => 'Y', // без него количество не передаётся
'PRODUCT_QUANTITY_VARIABLE' => 'quantity',
'PRODUCT_PROPS_VARIABLE' => 'prop', // свойства позиции корзины
// имена переменных обязаны совпадать с теми, что отправляет шаблон

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

Причины

  1. Элемент не заведён товаром или у него нет цены примерно 25% случаев

    ПризнакКнопки нет вовсе либо она есть, но цена на карточке не выводится.

    ПроверкаСмотрим запись товара в торговом каталоге и наличие цены нужного типа.

    Что делатьЗаводим запись товара и цену; после обмена такие элементы появляются пачками и требуют сверки.

  2. Ядро JS или расширение не подключено примерно 25% случаев

    ПризнакВ консоли браузера ошибка о неизвестной переменной, кнопка не реагирует вовсе.

    ПроверкаПроверяем подключение ядра и расширений в шаблоне и порядок подключения скриптов.

    Что делатьПодключаем нужные расширения из шаблона; после переверстки этот кусок теряется чаще всего.

  3. Запрос браузера не доходит или отклоняется примерно 20% случаев

    ПризнакВ сетевом журнале ответ с кодом ошибки или сообщение про ключ сессии.

    ПроверкаСмотрим адрес запроса и код ответа: 404 после переноса, 403 при протухшем ключе.

    Что делатьПравим адрес обработчика и берём ключ сессии из разметки, а не из собранного скрипта.

  4. Параметры компонента не совпадают с шаблоном примерно 15% случаев

    ПризнакТовар добавляется, но без количества или без выбранных свойств.

    ПроверкаСверяем имена переменных количества и свойств в параметрах компонента и в разметке.

    Что делатьПриводим имена к одному виду; действие кнопки задаётся отдельным параметром и тоже влияет.

  5. Остаток нулевой, а покупка при нуле запрещена примерно 15% случаев

    ПризнакУ части товаров кнопка работает, у части - нет, и это одни и те же позиции.

    ПроверкаСмотрим количество, признак наличия и разрешение покупки при нулевом остатке.

    Что делатьВключаем продажу при нуле там, где она нужна, либо честно показываем отсутствие товара.

Если ничего не помогло

Проверяем торговые предложения. У товара с вариантами кнопка работает только после выбора конкретного предложения, и в перевёрстанном шаблоне выбор иногда не доезжает до запроса.

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

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

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

Кнопка есть, но ничего не происходит - с чего начать?

С консоли браузера и вкладки сети: видно, уходит ли запрос и что отвечает сервер. Если запроса нет вовсе, дело в скриптах шаблона, а не в платформе.

Почему товар добавляется из кода, но не из карточки?

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

Почему кнопка работает не у всех товаров?

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

Что означает ошибка про ключ сессии при добавлении?

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

Товар добавился, но счётчик в шапке не изменился.

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

Смежное

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