2017-02-19 5 views
0

Сегодня я столкнулся с проблемой, которую я не мог решить с помощью руководства.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 флаг установлен в истинное Я получаю ошибку цикла редирект, даже если заказ правильно обработан.

ответ

0

Ваши бизнес-предположения ошибочны.

Наложенным платежом - это способ оплаты, а не способ доставки.

Переосмыслить то, что вы пытаетесь сделать, а затем вернуться. Если вы хотите иметь способ доставки, который может быть оплачен только при доставке, вам придется сделать что-то похожее на наш шаг пропущенного платежа, когда общая сумма заказа равна 0. :)

+0

В моей бизнес-логике поставщик услуг доставки имеет отдельный способ доставки для наложенным платежом. Конечно, я могу пропустить шаг проверки, основанный на одном методе метода доставки, но очень возможно, что я столкнусь с той же проблемой в будущем, и я просто не хочу писать другой оператор «или». –

+0

Хорошо, тогда ваша ошибка в слушателе заключается в том, что вы не очистите после выбора оплаты, поэтому новое состояние не сохраняется в заказе;) – CoderMaggie

+0

Благодарим вас за ответ. Теперь все работает отлично, за исключением перенаправления - после выбора трески доставка заказа заканчивается и перенаправляется на маршрут sylius_shop_checkout_select_payment. Есть ли рекомендуемый способ перенаправления после установки шага конечного автомата в прослушиватель событий? Также было бы неплохо установить полный шаг и перенаправить на «подтверждающий заказ» один, но, к сожалению, я не видел, чтобы какой-либо OrderCheckoutTransitions const отвечал за это состояние. Мой текущий слушатель выглядит так: goo.gl/bKuXH2 –