支払い方法のステップの後に注文を処理したいのですReview
が、Onepage Checkoutのステップは省略しています。
これを経験した人、またはこれを行う正しい方向を教えてくれる人はいますか?
ありがとうございました
支払い方法のステップの後に注文を処理したいのですReview
が、Onepage Checkoutのステップは省略しています。
これを経験した人、またはこれを行う正しい方向を教えてくれる人はいますか?
ありがとうございました
回答:
1つについては、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を見て、shureの人々が注文フォームを2回投稿できないようにすることもできます。
これは、正しい方向に向けるだけです。正確な実装はもちろん顧客の希望に依存するため、完全なソリューションではありません。ソリューションの詳細を自分で調べる楽しさを奪いたくありません。しかし、あなたが完全に立ち往生した場合は、お知らせください。
saveOrderAction()
、を呼び出す前にフォームキーを更新してから、オブザーバーメソッドのように応答処理を追加することにより、コントローラー拡張でも可能です。
@Anton Eversなので、パス内で変更する必要があるファイルを教えてください。ありがとう