2012-12-20 63 views
1

我正在編寫一個定製的Magento模塊,該模塊在產品頁面上給出了價格報價(基於外部API)。在產品頁面上獲得響應後,它將響應中的一些信息添加到產品視圖的表單中。Magento - 使用觀察器保存購物車addAction上的quote_address

目標是保存地址(以及一些其他的東西,但那些可以在現在的會話中)。地址需要保存到報價中,以便結賬(onestepcheckout,免費版)將自動填充(城市,州,郵編,國家,運輸方式[其中有3個])的這些值並加載費率報價通過ajax(它已經在做)。

我已經通過使用Observer,並觀看購物車事件了。我填寫地址並保存。當我在購物車頁面或檢出頁面丟失大約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); 

我想有一個很好的機會,這是不保存這些信息的最佳場所,但我不是很確定。我想知道是否有做這個的好地方而不會覆蓋整個控制器以將地址保存在添加到購物車動作中

非常感謝,讓我知道如果我需要澄清

+0

這當然複雜的代碼,但你沒有一個公平的工作概括它。歡迎! –

+1

謝謝!我想詳細介紹一下我正在做什麼,所以有很多解釋。我是一個堆棧溢出的狂熱用戶,所以我希望我做到了這一點。 – Byron

回答

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();