2017-02-19 63 views
0

今天我遇到了一個我無法用手冊解決的問題。Sylius - 如何以編程方式執行結帳步驟?

我有一種情況,如果客戶選擇貨到付款運輸方式,我想跳過付款步驟。

到目前爲止,我已經通過onCashOnDeliveryShipmentSelect方法在sylius.order.post_select_shipping上創建了一個事件監聽器。

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標誌設置爲true我越來越即使順序正確處理重定向循環錯誤的方法。

回答

0

您的業務假設是錯誤的。

貨到付款 - 這是一種付款方式,而不是運輸方式。

重新思考你正在嘗試做什麼,然後回來。如果您想要一種只能在交貨時付款的運輸方式,那麼當訂單總額爲0時,您必須執行類似於我們的跳過付款步驟。:)

+0

在我的業務邏輯中,運​​輸提供商有一個貨到付款的獨立運輸方式。當然,我可以跳過基於單一運輸方式代碼的結帳步驟,但很有可能我將來會面對同樣的問題,而我不想再編寫另一個「或」語句。 –

+0

好的,那麼您在聽衆中的錯誤是您在選擇付款後不刷新,因此新狀態不會保存在訂單上;) – CoderMaggie

+0

感謝您的回答。現在一切正常,除了重定向 - 選擇鱈魚運送後,訂單將完成一步並重定向到sylius_shop_checkout_select_payment路線。在事件監聽器中設置狀態機步驟之後,有沒有推薦的重定向方法?它也很好,不要設置完整的步驟,而是重定向到「確認訂單」一個,但不幸的是,我沒有看到任何OrderCheckoutTransitions常量負責此狀態。我目前的聽衆是這樣的:goo.gl/bKuXH2 –