#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()
, в этом случае нарушение ограничений будет обработано действием контроллера, но у вас не будет доступа, например, к идентификатору заказа.