Как создать пользовательскую ошибку при преобразовании корзины в заказ в Shopware6?

#validation #cart #shopware

#проверка #Корзина #shopware

Вопрос:

Я пытаюсь создать плагин для Shopware6, который добавляет выбор периода доставки (например, пользователь может выбрать товар, который будет доставлен 07 марта с 9:00 до 11:00). Проблема в том, что в каждом периоде не может быть более 15 заказов. Итак, если used переходит к оформлению заказа из корзины, и если выбранный им период насчитывает более 15 заказов, я должен каким-то образом аннулировать форму и указать пользователю выбрать другой период. Поэтому я должен:

  • каким-то образом подписаться на событие «пользователь делает заказ с карты»,
  • проверьте правильность выбранного периода,
  • если нет, сообщите об этом пользователю и не создавайте заказ.

Есть ли какой-нибудь способ это сделать? В Symfony я бы просто добавил проверку в объект PeriodOfDelivery. Но в Shopware я не могу этого сделать, потому что контроллер находится в ядре Shopware, и я не могу его редактировать.

Ответ №1:

Вы можете подписаться на CartConvertedEvent::class событие. Вы можете получить исходные и преобразованные данные корзины из события. В subscriber вы можете выполнить любую проверку, которая вам нужна, и создать определенное исключение. Вы можете реализовать свой собственный класс исключений. используйте ShopwareCoreCheckoutOrderExceptionDeliveryWithoutAddressException в качестве шаблона. В своем собственном исключении вы можете указать собственный код ошибки и сообщение.

Комментарии:

1. Спасибо, есть еще два вопроса: 1) как я могу получить корзину с мероприятия? Я не могу найти его в документации Shopware 2) могу ли я получить данные заказа у этого подписчика? потому что я также хочу сохранить идентификатор заказа в своей сущности

2. вы можете использовать следующие методы этого события $event->getCart() , чтобы получить объект корзины и $event->getConvertedCart() получить данные заказа (которые подготовлены для размещения). Данные заказа — это массив, поэтому вы можете получить идентификатор из $event->getConvertedCart()[id]

3. Но как я могу показать это исключение пользователю? В prod .env он просто показывает сообщение «К сожалению, что-то пошло не так».

4. Взгляните на ShopwareStorefrontControllerCheckoutController::order() действие Есть список обработанных исключений, скорее всего, вам нужно расширить список улавливаемых исключений. Другой вариант — добавить сюда правило проверки ShopwareCoreCheckoutOrderSalesChannelOrderService::validateOrderData() , в этом случае нарушение ограничений будет обработано действием контроллера, но у вас не будет доступа, например, к идентификатору заказа.