【问题标题】:Sylius - how to perform the checkout step programmatically?Sylius - 如何以编程方式执行结帐步骤?
【发布时间】:2017-02-19 02:08:07
【问题描述】:

今天我遇到了一个无法通过手册解决的问题。

我有一个案例,如果客户选择货到付款运输方式,我想跳过付款步骤。

到目前为止,我已经使用 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 的方法,即使订单处理正确,我也会收到重定向循环错误。

【问题讨论】:

    标签: sylius


    【解决方案1】:

    您的业务假设是错误的。

    货到付款 - 这是一种付款方式,而不是送货方式。

    重新考虑你想要做什么,然后再回来。如果你想有一种只能货到付款的运输方式,那么你将不得不做类似于我们在订单总额为0时跳过付款的步骤。:)

    【讨论】:

    • 在我的业务逻辑中,运​​输提供商有单独的货到付款运输方式。当然,我可以根据单一运输方式代码跳过结帐步骤,但将来我很有可能会遇到同样的问题,我只是不想写另一个“或”语句。
    • 好的,那么你在监听器中的错误是你选择支付后没有刷新,因此新的状态没有保存在订单上;)
    • 感谢您的回答。现在一切正常,除了重定向 - 选择 cod shipping 后,订单进入完成步骤并重定向到 sylius_shop_checkout_select_payment 路线。在事件侦听器中设置状态机步骤后,是否有任何推荐的重定向方法?最好不要设置完整的步骤并重定向到“确认订单”,但不幸的是我没有看到任何 OrderCheckoutTransitions const 负责此状态。我当前的听众是这样的:goo.gl/bKuXH2
    • docs.sylius.org/en/latest/cookbook/…中描述的方式不起作用,因为注入的ResourceControllerEvent事件中不存在setReponse方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2017-04-25
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多