Не работает оформление заказа - корзина есть, а на оформлении пусто
В корзине товары есть, а страница оформления показывает пустоту или не открывается вовсе.
Как проверить
Смотрим, что лежит в корзине покупателя:
$basket = Bitrix\Sale\Basket::loadItemsForFUser( Bitrix\Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());foreach ($basket as $item) { printf("%-28s кол=%s сайт=%s заказ=%s можно_купить=%s\n", $item->getField('NAME'), $item->getQuantity(), $item->getField('LID'), $item->getField('ORDER_ID') ?: '-', $item->canBuy() ? 'да' : 'нет');}Три поля решают почти всё. Непустой ORDER_ID означает, что строка уже ушла в
заказ, чужой LID - что корзина принадлежит другому сайту, а canBuy показывает
позиции, которые оформление отбросит.
Смотрим ошибки шаблона оформления:
tail -n 60 /home/bitrix/www/bitrix/php_interface/dbconn_error.log 2>/dev/nullgrep -i 'order.ajax\|sale.order' /var/log/nginx/error.log | tail -20Белый экран на оформлении почти всегда даёт ошибка PHP в шаблоне, а не логика модуля. В логе она видна с именем файла и строкой.
Проверяем типы плательщиков сайта:
$types = CSalePersonType::GetList([], ['LID' => $siteId, 'ACTIVE' => 'Y']);while ($type = $types->Fetch()) { printf("%-3d %-24s сайт=%s\n", $type['ID'], $type['NAME'], $type['LID']);}Пустой список означает, что форма оформления соберётся без свойств, доставки и оплаты: собирать их не для кого.
Причины
-
Корзина принадлежит другому сайту примерно 35% случаев
ПризнакПозиции есть в базе, но страница оформления пуста, и так на мультисайте или после смены домена.
ПроверкаСверяем поле
LIDу позиций корзины с идентификатором текущего сайта.Что делатьЗагружаем корзину с явным идентификатором сайта и переносим позиции, если домен менялся.
-
Товар стал недоступен для покупки примерно 30% случаев
ПризнакЧасть позиций пропадает на оформлении, остальные проходят.
ПроверкаЧитаем
canBuyу каждой позиции: активность товара, остаток, права группы на покупку.Что делатьВозвращаем товару активность и остаток либо убираем позицию из корзины с понятным сообщением.
-
Не задан тип плательщика примерно 20% случаев
ПризнакСтраница открывается, но форма пустая: ни свойств, ни доставки, ни оплаты.
ПроверкаПроверяем, что для сайта заведён хотя бы один тип плательщика и он активен.
Что делатьЗаводим тип плательщика и привязываем к нему свойства, службы доставки и платёжные системы.
-
Ошибка в шаблоне оформления примерно 15% случаев
ПризнакБелый экран или обрыв вёрстки на середине страницы.
ПроверкаСмотрим лог ошибок PHP и временно включаем вывод ошибок на копии сайта.
Что делатьПравим шаблон в своей копии компонента, а не в
/bitrix/: правки ядра снесёт обновление.
Если ничего не помогло
Чистим корзину от строк, уехавших в заказ:
foreach ($basket as $item) { if ($item->getField('ORDER_ID')) { $item->delete(); // строка принадлежит заказу, в корзине ей не место }}$basket->save();Такие строки остаются после неудачного оформления: корзина видна в шапке, а на оформлении пуста. Удаление безопасно, сам заказ свои позиции не теряет.
Пробуем оформление на штатном шаблоне:
$APPLICATION->IncludeComponent('bitrix:sale.order.ajax', '', [ 'PERSON_TYPE' => [], // пусто означает все активные типы 'ALLOW_AUTO_REGISTER' => 'Y',]);Пустой шаблон компонента подключает штатный. Если на нём оформление проходит, дело в своей копии, и разбирать надо её. Если не проходит и там, проблема в данных: корзине, товарах или настройках модуля продаж.
Частые вопросы
В корзине товары есть, а в оформлении нет. Куда они делись?
Скорее всего у позиций непустой ORDER_ID: они уже привязаны к созданному ранее заказу. Такое случается, когда заказ создавался из живой корзины покупателя, а не из новой.
Как проверить наличие товара при оформлении?
Метод canBuy у позиции уже учитывает активность, остаток и права. Своя проверка нужна только для нестандартных правил, и её вешают на событие проверки заказа.
Можно ли пересобрать корзину в момент оформления?
Да, но осторожно: пересборка меняет идентификаторы позиций, а форма оформления к ним привязана. Обычно достаточно обновить количество и цены, а не создавать позиции заново.
Почему кнопка оформления не ведёт дальше?
Чаще всего ошибка JavaScript на странице корзины: обработчик кнопки не отработал. Смотрят консоль браузера, а не логи сервера - до сервера запрос не дошёл.
Смежное
-
Корзина - оглавление подтемы
-
Работа с корзиной из кода - добавление и количество
-
Не работает кнопка «В корзину»: причины по убыванию частоты - соседний разбор про добавление в корзину
-
Свойства заказа - что спрашивает форма оформления
-
Каталог и продажи - корзина и заказ
-
Оформление заказа: настройка компонента и правка шаблона - штатная настройка формы
-
Корзина гостя и вход покупателя: привязка, слияние, чистка - когда корзина пропала после входа