Как я могу удалить шаг проверки в 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.