我正在编写一个自定义 Magento 模块,该模块在产品页面上提供费率报价(基于外部 API)。在我在产品页面上获得响应后,它会将响应中的一些信息添加到产品视图的表单中。
目标是保存地址(以及其他一些东西,但现在可以在会话中)。需要将地址保存到报价单中,以便结帐(onestepcheckout,免费版)会自动填写(城市,州,邮编,国家,运输方式[其中3个])中的这些值并加载费率报价通过ajax(它已经在做)。
我已经通过使用观察者来解决这个问题,并观察购物车事件。我填写地址并保存。当我最终进入购物车页面或结帐页面时,数据丢失了约 4/5 次,并且 sql 表显示 quote_address 正在保存而没有地址信息,即使有明确的保存也是如此。
我使用的观察者方法是:
checkout_cart_update_item_complete
checkout_cart_product_add_after
代码保存是:(我已经用地址、报价和购物车试过了,都没有调用 save() 的结果相同,也没有调用 setQuote()
// $params = Mage::app()->getRequest()->getParams()
// $quote = Mage::getSingleton('checkout/cart')->getQuote()
// or
// $quote = observer->getProduct()->getQuoteItem()->getQuote();
// where applicable, but both methods seemed to === each other
$quote->getShippingAddress()
->setCountryId($params['estimate_to_country'])
->setCity($params['estimate_to_city'])
->setPostcode($params['estimate_to_zip_code'])
->setRegionId($params['estimate_to_state_code'])
->setRegion($params['estimate_to_state'])
->setCollectShippingRates(true)
->setShippingMethod($params['carrier_method'])
->setQuote($quote)
->save();
$quote->getBillingAddress()
->setCountryId($params['estimate_to_country'])
->setCity($params['estimate_to_city'])
->setPostcode($params['estimate_to_zip_code'])
->setRegionId($params['estimate_to_state_code'])
->setRegion($params['estimate_to_state'])
->setCollectShippingRates(true)
->setShippingMethod($params['carrier_method'])
->setQuote($quote)
->save();
$quote->save();
$cart->save();
// I also tried:
Mage::getSingleton('checkout/session')->setQuote($quote);
我想这很有可能不是保存此信息的最佳位置,但我不太确定。我想知道是否有一个好地方可以做到这一点,而无需覆盖整个控制器来保存添加到购物车操作中的地址。
非常感谢,如果我需要澄清,请告诉我