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我越來越即使順序正確處理重定向循環錯誤的方法。
在我的業務邏輯中,運輸提供商有一個貨到付款的獨立運輸方式。當然,我可以跳過基於單一運輸方式代碼的結帳步驟,但很有可能我將來會面對同樣的問題,而我不想再編寫另一個「或」語句。 –
好的,那麼您在聽衆中的錯誤是您在選擇付款後不刷新,因此新狀態不會保存在訂單上;) – CoderMaggie
感謝您的回答。現在一切正常,除了重定向 - 選擇鱈魚運送後,訂單將完成一步並重定向到sylius_shop_checkout_select_payment路線。在事件監聽器中設置狀態機步驟之後,有沒有推薦的重定向方法?它也很好,不要設置完整的步驟,而是重定向到「確認訂單」一個,但不幸的是,我沒有看到任何OrderCheckoutTransitions常量負責此狀態。我目前的聽衆是這樣的:goo.gl/bKuXH2 –