Сегодня я столкнулся с проблемой, которую я не мог решить с помощью руководства.Sylius - как выполнить программный шаг программно?
У меня есть случай, если клиент выбирает способ доставки наложенным платежом, я хотел бы пропустить шаг оплаты.
До сих пор я создал прослушиватель событий на sylius.order.post_select_shipping с помощью метода onCashOnDeliveryShipmentSelect.
public function onCashOnDeliveryShipmentSelect(ResourceControllerEvent $event)
{
/** @var Order $order */
$order = $event->getSubject();
/** @var Shipment $shipment */
foreach ($order->getShipments() as $shipment) {
/** @var ShippingMethod $method */
$method = $shipment->getMethod();
if ($method->getCashOnDelivery()) {
$order = $this->selectPayment($order);
$this->getStateMachine($order)->apply(OrderCheckoutTransitions::TRANSITION_COMPLETE);
$this->container->get('sylius.manager.order')->flush();
}
}
}
private function selectPayment(Order $order)
{
$this->getStateMachine($order)->apply(OrderCheckoutTransitions::TRANSITION_SELECT_PAYMENT);
$paymentMethod = $this->container
->get('sylius.repository.payment_method')
->findOneByCode('cash_on_delivery');
foreach ($order->getPayments() as $payment) {
$payment->setMethod($paymentMethod);
}
$this->flush();
return $order;
}
private function getStateMachine(Order $order)
{
$stateMachineFactory = $this->container->get('sm.factory');
$stateMachine = $stateMachineFactory->get($order, OrderCheckoutTransitions::GRAPH);
return $stateMachine;
}
private function flush()
{
$this->container->get('sylius.manager.order')->flush();
}
После того, как я пройти через процесс оформления заказа и выбора метода с cashOnDelivey флаг установлен в истинное Я получаю ошибку цикла редирект, даже если заказ правильно обработан.
В моей бизнес-логике поставщик услуг доставки имеет отдельный способ доставки для наложенным платежом. Конечно, я могу пропустить шаг проверки, основанный на одном методе метода доставки, но очень возможно, что я столкнусь с той же проблемой в будущем, и я просто не хочу писать другой оператор «или». –
Хорошо, тогда ваша ошибка в слушателе заключается в том, что вы не очистите после выбора оплаты, поэтому новое состояние не сохраняется в заказе;) – CoderMaggie
Благодарим вас за ответ. Теперь все работает отлично, за исключением перенаправления - после выбора трески доставка заказа заканчивается и перенаправляется на маршрут sylius_shop_checkout_select_payment. Есть ли рекомендуемый способ перенаправления после установки шага конечного автомата в прослушиватель событий? Также было бы неплохо установить полный шаг и перенаправить на «подтверждающий заказ» один, но, к сожалению, я не видел, чтобы какой-либо OrderCheckoutTransitions const отвечал за это состояние. Мой текущий слушатель выглядит так: goo.gl/bKuXH2 –