Я хотел бы, чтобы заказ был обработан после шага Способ оплаты, пропустив этот Review
шаг в Одностраничном оформлении заказа.
Есть ли кто-нибудь, кто имеет опыт с этим или кто может указать мне правильное направление, как это сделать?
Спасибо
Я хотел бы, чтобы заказ был обработан после шага Способ оплаты, пропустив этот Review
шаг в Одностраничном оформлении заказа.
Есть ли кто-нибудь, кто имеет опыт с этим или кто может указать мне правильное направление, как это сделать?
Спасибо
Ответы:
Для одного вам нужно переписать 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()
, а затем добавляя обработку ответа, как в вашем методе наблюдателя.
Чтобы создать наблюдателя вашего события:
<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>
@Anton Evers, поэтому, пожалуйста, дайте мне знать, какие файлы мне нужно изменить в пути. Благодарность