7

我们使用 Templates Master 的自定义结帐扩展程序,称为“Firecheckout”。不确定这是否相关,但我想我应该提到它。有时我会看到一封交易失败的电子邮件,原因是“请指定送货方式”。我花了很长时间试图找出这是如何发生的,我迷路了。我已经尝试了我能想到的一切来复制这个问题。根据我所做的事情的组合(从购物车中添加/删除商品,添加/删除更改运输选项的优惠券代码,在移动和桌面网站之间切换等)我已经能够做到结帐页面没有'没有选择运输方式的选项。但是,如果我尝试提交订单,我会在运输方式部分立即收到一条红色消息,上面写着“

搜索代码我发现错误电子邮件是在_validate方法中的TM_FireCheckout_Model_Service_Quote(扩展Mage_Sales_Model_Service_Quote)类中触发的

$method= $address->getShippingMethod();
$rate  = $address->getShippingRateByCode($method);
if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
    Mage::throwException($helper->__('Please specify a shipping method.'));
}

在这种情况下,我猜$method$rate是 null 或 false,但为什么/怎么可能呢?我能做些什么来确保这永远不会发生吗?FireCheckout 的_validate方法和父类的_validate方法之间的唯一区别在于哪些字段被认为是必需的。它不会以任何方式更改地址对象,因此对getShippingMethodgetShippingRateByCode的后续调用应该与默认安装相同。

如有必要,我可以提供更多详细信息。我基本上是在尝试了解可能触发该错误的原因以及如何重现它,以便最终修补导致该错误的漏洞。

谢谢!

4

2 回答 2

0

我以前遇到过类似的事情,但不是 Firecheckout。但它也是来自 Apptha 的 Onestepcheckout 扩展,例如 @Lennon。长话短说,是 javascript 处理中的差异破坏了数据。我没有明确的答案给你,但我建议你看看在表单验证和结帐表单上的数据保存之间发生了什么。

你可以做的开始调查是在 FF 上启动 Firebug,观察控制台,看看你的数据是否仍在传递。您还可以创建一个简单的观察者模块来在controler_action_predispatch事件中执行以下操作:

$request = $observer->getControllerAction()->getRequest();
Mage::log(var_export($request->getParams(),true));

..或者直接在结帐路线中编辑控制器文件。任何漂浮你的船。

启用日志和tail -f var/logs/system.log. 您应该确保请求与日志匹配。这就是我开始解决问题的方式。

同样,这不是针对问题根源的“copypasta”修复或教程,而是分享我如何根据第一手经验诊断问题的经验。

您可以在http://www.silksoftware.com/magento-module-creator非常快速地创建一个模块

于 2012-12-24T13:29:11.463 回答
0

您需要在更改后定义运输方式。例如,在 Firecheckout 的“indexController”中创建一个函数为“saveShippingAction”。您可以每次通过 Ajax 调用此函数来更改客户数据,或者根据您的喜好。

内地:

    $customer = Mage::getSingleton('customer/session')->getCustomer();
    $shippingData = $this->getRequest()->getParam('shipping');
    $shippingData['street'] = implode("\n", $shippingData['street']);
    $customerAddress = $customer->getAddresses();
    $customerAddress = end($customerAddress);
    $customerAddress->setIsDefaultShipping(true)->setSaveInAddressBook(true);
    $customerAddress->addData($shippingData)->save();

在此示例中,我将送货数据记录回客户的最后一个地址,如果您需要为新客户保存,只需为他创建一个地址并保存为送货地址。

我希望能有所帮助,祝你好运。

于 2016-09-29T17:20:43.653 回答