1

我正在编写一个自定义 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);

我想这很有可能不是保存此信息的最佳位置,但我不太确定。我想知道是否有一个好地方可以做到这一点,而无需覆盖整个控制器来保存添加到购物车操作中的地址。

非常感谢,如果我需要澄清,请告诉我

4

1 回答 1

0

在 Magento 中,您可以在任何需要的地方创建自己的事件,但在这种情况下,您可以使用checkout_cart_product_add_after事件来更新 quore 地址详细信息。

所以这是相同的代码

$quote = Mage::getSingleton('checkout/session')->getQuote();

$billingAddress = Mage::getModel('sales/quote_address')
        ->setStoreId($storeId)
        ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
        ->setCustomerId(('Your_Value_Here'))
        ->setCustomerAddressIpd(('Your_Value_Here'))
        ->setCustomer_address_id(('Your_Value_Here'))
        ->setPrefix(('Your_Value_Here'))
        ->setFirstname(('Your_Value_Here'))
        ->setMiddlename(('Your_Value_Here'))
        ->setLastname(('Your_Value_Here'))
        ->setSuffix(('Your_Value_Here'))
        ->setCompany(('Your_Value_Here'))
        ->setStreet(('Your_Value_Here'))
        ->setCity(('Your_Value_Here'))
        ->setCountry_id(('Your_Value_Here'))
        ->setRegion(('Your_Value_Here'))
        ->setRegion_id(('Your_Value_Here'))
        ->setPostcode(('Your_Value_Here'))
        ->setTelephone(('Your_Value_Here'))
        ->setFax(('Your_Value_Here'));
$quote->setBillingAddress($billingAddress);

$shippingAddress = Mage::getModel('sales/quote_address')
        ->setStoreId($storeId)
        ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
        ->setCustomerId(('Your_Value_Here'))
        ->setCustomerAddressId(('Your_Value_Here'))
        ->setCustomer_address_id(('Your_Value_Here'))
        ->setPrefix(('Your_Value_Here'))
        ->setFirstname(('Your_Value_Here'))
        ->setMiddlename(('Your_Value_Here'))
        ->setLastname(('Your_Value_Here'))
        ->setSuffix(('Your_Value_Here'))
        ->setCompany(('Your_Value_Here'))
        ->setStreet(('Your_Value_Here'))
        ->setCity(('Your_Value_Here'))
        ->setCountry_id(('Your_Value_Here'))
        ->setRegion(('Your_Value_Here'))
        ->setRegion_id(('Your_Value_Here'))
        ->setPostcode(('Your_Value_Here'))
        ->setTelephone(('Your_Value_Here'))
        ->setFax(('Your_Value_Here'));

$quote->setShippingAddress($shippingAddress)
        ->setShipping_method('flatrate_flatrate')
        ->setShippingDescription($this->getCarrierName('flatrate'));


$quote->save();
于 2012-12-20T20:59:37.717 回答