Magento - 使用observer在book addAction上保存quote_address

时间:2012-12-20 05:02:18

标签: magento magento-1.7

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

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

非常感谢,请告诉我是否需要澄清

1 个答案:

答案 0 :(得分: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();