Личный кабинет покупателя - список заказов, повтор и отмена
Настраиваем личный кабинет покупателя: список его заказов, повтор, отмену и проверку доступа к чужим документам.
Решение
Ставим раздел личного кабинета:
$APPLICATION->IncludeComponent('bitrix:sale.personal.section', '', [ 'SEF_MODE' => 'Y', 'SEF_FOLDER' => '/personal/', 'MAIN_CHAIN_NAME' => 'Личный кабинет', // раздел собирает страницы кабинета сам, отдельных файлов не нужно 'PATH_TO_BASKET' => '/personal/cart/',]);Кабинет - комплексный компонент, как и каталог: он рисует список заказов, карточку заказа, профили и корзину. Отдельных страниц под них создавать не требуется, а адреса разбирает правило обработки.
Настраиваем список заказов:
'ORDERS_PER_PAGE' => 20,'HISTORIC_STATUSES' => ['F'], // какие статусы считать архивными'SAVED_ORDERS' => 'Y','NAV_TEMPLATE' => '','SET_TITLE' => 'Y',Покупателю показывают номер, дату, статус, сумму и состав заказа. Служебные поля вроде внешних кодов и признаков обмена в кабинете лишние: человеку они ничего не говорят и только сбивают с толку.
Разрешаем повтор заказа:
$order = \Bitrix\Sale\Order::load($orderId);$basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), SITE_ID);foreach ($order->getBasket() as $item) { // повтор - это перенос позиций старого заказа в текущую корзину $new = $basket->createItem('catalog', $item->getProductId()); $new->setFields(['QUANTITY' => $item->getQuantity(), 'CURRENCY' => 'RUB']);}$basket->save(); // корзина сохраняется один раз после переноса всех позицийПовтор заказа - это наполнение корзины по образцу, а вовсе не копия документа. Цены при этом берутся текущие, и снятые с продажи позиции в корзину не попадают.
Разрешаем отмену заказа покупателем:
'ALLOW_CANCEL_ORDER' => 'Y', // отмена доступна только до отгрузки'STATUS_COLOR_N' => 'gray','CANCEL_STATUSES' => ['N', 'P'], // из каких статусов отмена разрешена// список статусов задают явно: по умолчанию отмена доступна не всегдаОтмена ограничена статусом заказа: оплаченный и отгруженный документ покупатель отменить уже не может. Возврат средств в этом случае оформляется менеджером вручную, и это правильно.
Доступ к каждому заказу проверяется по его владельцу. Покупатель, подставивший в адрес чужой номер, не должен увидеть ничего: штатный компонент это проверяет, а свой код - только если проверку в нём написали.
Кабинет удобно считать витриной для одного покупателя. Всё, что он там видит, проходит ту же проверку владельца, и любое своё дополнение - от истории обращений до накопительной скидки - эту проверку обязано повторять.
Гостевые заказы в кабинете не видны, пока покупатель не вошёл под той учётной записью, на которую заказ оформлен. Оформление без входа создаёт запись автоматически, и вход в неё открывает историю заказов.
Типичные проблемы
Покупатель видит чужой заказ.
Самописный код не проверяет владельца документа. Штатный компонент делает эту проверку сам, а свой - только если её написали.
Повтор заказа переносит старые цены.
Позиции копируются вместе со старой ценой вместо создания заново. Повтор заказа должен брать текущие цены каталога.
Кнопка отмены не появляется.
Заказ уже перешёл в статус, где отмена покупателем запрещена. Список разрешённых статусов задаётся настройками модуля продаж.
В кабинете пусто у существующего покупателя.
Заказы оформлены на другую учётную запись покупателя. Оформление без входа создаёт отдельную запись по адресу почты.
В списке заказов служебные поля.
В параметрах компонента перечислены все свойства заказа подряд. Покупателю показывают только понятные ему поля документа.
Частые вопросы
Можно ли обойтись без личного кабинета?
Магазину с разовыми покупками - да, история заказов там мало кому нужна. Кабинет окупается при повторных покупках и подписках.
Как показать в кабинете свои данные?
Отдельной страницей внутри раздела кабинета: комплексный компонент допускает свои пути. Данные собирают своим кодом с проверкой владельца.
Почему в кабинете нет части заказов?
Они оформлены на другую учётную запись или помечены архивными по статусу. Оба случая настраиваются параметрами компонента.
Что происходит при отмене заказа?
Заказ переходит в отменённое состояние, а резерв снимается. Деньги при онлайн-оплате возвращает менеджер отдельной операцией.
Смежное
-
Заказы и статусы - оглавление подтемы
-
Боковая панель: открытие страницы, события, запрет закрытия - карточка заказа в боковой панели
-
Заказ из кода: чтение, поиск по номеру, изменение состава - работа с заказом через API
-
Печатная форма и PDF: шаблон печати, генерация файла, отдача - печать заказа из кабинета
-
Свои страницы личного кабинета: раздел, меню, права, данные - как добавить свой раздел кабинета
-
Личный кабинет покупателя - устройство штатных страниц кабинета
-
Регистрация покупателей: форма, подтверждение, свои поля - откуда берётся учётная запись
-
Бонусные баллы: внутренний счёт, начисление и частичная оплата - остаток и история операций в кабинете
-
Каталог и продажи - устройство магазина целиком
-
Вход из кода: авторизация без пароля и работа под другим пользователем - разбор заказа под учётной записью покупателя
-
Список заказов из кода: фильтры, постраничность, позиции - как собрать список заказов покупателя
-
Профиль пользователя на витрине: правка, свои поля, смена почты - правка данных в том же кабинете
-
Профиль покупателя - что показывает страница профилей в кабинете