Как я могу удалить шаг проверки в Onepage checkout?


12

Я хотел бы, чтобы заказ был обработан после шага Способ оплаты, пропустив этот Reviewшаг в Одностраничном оформлении заказа.

Есть ли кто-нибудь, кто имеет опыт с этим или кто может указать мне правильное направление, как это сделать?

Спасибо


2
К вашему сведению: это незаконно в некоторых странах.
— user487772

Я изменил шаг проверки на оплату, чтобы пользователь мог просмотреть и произвести оплату в один этап. Некоторые идеи, чтобы изменить этот рабочий процесс?
— Эдуардо Луз

Я обнаружил, что это довольно хорошее объяснение этого процесса: excellencemagentoblog.com/…
— ryaan_anthony

Ответы:


9

Для одного вам нужно переписать Mage_Checkout_Block_Onepage :: _ getStepCodes ():

 /**
 * Get checkout steps codes
 *
 * @return array
 */
protected function _getStepCodes()
{
    /**
     * Originally these were 'login', 'billing', 'shipping', 'shipping_method', 'payment', 'review'
     *
     * Stripping steps here has an influence on the entire checkout. There are more instances of the above list
     * among which the opcheckout.js file. Changing only this method seems to do the trick though.
     */
    if ($this->getQuote()->isVirtual()) {
        return array('login', 'billing', 'payment');
    }
    return array('login', 'billing', 'shipping', 'shipping_method', 'payment');
}

Затем есть часть, где вы хотите сохранить свой заказ после шага оплаты через наблюдателя событий:

/**
 * THIS METHOD IMMEDIATELY FORWARDS TO THE SAVE ORDER ACTION AFTER THE PAYMENT METHOD ACTION
 *
 * Save the order after having saved the payment method
 *
 * @event controller_action_postdispatch_checkout_onepage_savePayment
 *
 * @param $observer Varien_Event_Observer
 */
public function saveOrder($observer)
{
    /** @var $controllerAction Mage_Checkout_OnepageController */
    $controllerAction = $observer->getEvent()->getControllerAction();
    /** @var $response Mage_Core_Controller_Response_Http */
    $response = $controllerAction->getResponse();

    /**
     * jsonDecode is used because the response of the XHR calls of onepage checkout is always formatted as a json
     * string. jesonEncode is used after the response is manipulated.
     */
    $paymentResponse = Mage::helper('core')->jsonDecode($response->getBody());
    if (!isset($paymentResponse['error']) || !$paymentResponse['error']) {
        /**
         * If there were no payment errors, immediately forward to saving the order as if the user had confirmed it
         * on the review page.
         */
        $controllerAction->getRequest()->setParam('form_key', Mage::getSingleton('core/session')->getFormKey());

        /**
         * Implicitly agree with the terms and conditions by confirming the order
         */
        $controllerAction->getRequest()->setPost('agreement', array_flip(Mage::helper('checkout')->getRequiredAgreementIds()));

        $controllerAction->saveOrderAction();
        /**
         * jsonDecode is used because the response of the XHR calls of onepage checkout is always formatted as a json
         * string. jesonEncode is used after the response is manipulated.
         *
         * $response has here become the response of the saveOrderAction()
         */
        $orderResponse = Mage::helper('core')->jsonDecode($response->getBody());
        if ($orderResponse['error'] === false && $orderResponse['success'] === true) {
            /**
             * Check for redirects here. If there are redirects than a module such as Adyen wants to redirect to a
             * payment page instead of the success page after saving the order.
             */
            if (!isset($orderResponse['redirect']) || !$orderResponse['redirect']) {
                $orderResponse['redirect'] = Mage::getUrl('*/*/success');
            }
            $controllerAction->getResponse()->setBody(Mage::helper('core')->jsonEncode($orderResponse));
        }
    }
}

Приведенный выше метод наблюдателя неявно согласуется с условиями. В некоторых странах это незаконно, и вы можете захотеть отобразить условия и пропустить поля «Согласовать сообщение» на странице способа оплаты.

Также вы можете захотеть взглянуть на opcheckout.js, чтобы люди не могли публиковать форму заказа дважды и т. Д.

Это просто чтобы указать вам правильное направление. Это не полное решение, потому что, конечно, точная реализация зависит от пожеланий вашего клиента, и я не хочу лишать вас удовольствия узнать подробности решения самостоятельно. Но если вы застряли полностью, пожалуйста, дайте нам знать.


Как создать наблюдателя?
— Акшай Тару

Не могли бы вы отредактировать пост, чтобы создать наблюдателя?
— Акшай Тару

Хорошая запись - это также возможно с расширением контроллера, обновляя ключ формы перед вызовом saveOrderAction(), а затем добавляя обработку ответа, как в вашем методе наблюдателя.
— Робби Аверилл

0

Чтобы создать наблюдателя вашего события:

<controller_action_postdispatch_checkout_onepage_savePayment> <observers> <Name_Event_Observer> <class>module/observer</class> <method>method</method> </Name_Event_Observer> </observers> </controller_action_postdispatch_checkout_onepage_savePayment>


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.