2012-06-07 27 views
14

今天我與Magento的再次戰鬥:)我發現Magento的產品負載 - loadByAttribute和負載方法之間的差異

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku); 

之間的差異
$product = Mage::getModel('catalog/product')->load($product_id); 

誰能exaplain我一個差這兩種方法之間?我發現,當我通過sku加載產品時,然後當我嘗試用改變的數據重新保存它時,我得到錯誤異常'Varien_Exception',並帶有'無效方法Varien_Object :: save in app \ code \ core \ Mage \ CatalogInventory \ Model \ Observer.php(153):Varien_Object - > __ call('save',Array)這是真的,因爲一旦您嘗試通過sku加載,則另一個觀察者將產品的庫存項目設置爲Varien_Object,這看起來像是陷阱,或者我只是不夠明白,但

我從它的beginnig做每日Magento開發,所以我知道很多關於系統,這對我來說是新的。在此先感謝,Jaro。

+0

哇謝謝有同樣的問題,現在通過sku加載它,然後通過編號 – wutzebaer

+0

謝謝。第一種方法適用於我,我相信,第二種方法不接受變量?它確實工作,當我硬編碼一個SKU編號。 –

回答

17

有趣。雖然這兩種方法都會爲您提供具有滿載EAV數據的單一產品模型實例(假設第三個參數loadByAttribute()未通過或者爲*),但添加與股票相關的數據的觀察員對於產品與產品集合是不同的,庫存信息對象被添加到產品數據關鍵字「stock_item」。這是有爭議的,但這感覺就像一個錯誤。我會認爲Mage_CatalogInventory_Model_Observer::saveInventoryData()Mage_CatalogInventory_Model_Observer::_prepareItemForSave()會處理這個。

您可以通過使用stock_item對象在產品實例上完全設置產品庫存項來解決此問題。

+0

它看起來像一種錯誤,你創建了一個集合,你在那裏有僞造股票信息的產品,一旦你想改變它就會失敗。我花了3天的時間才弄清楚這一點,因爲它發生在覈心層面,你不會懷疑和期待。我需要與其他人分享這些信息,節省他們的時間和生活:) – Jaro

+2

[成爲Magento Contributor](http://www.magentocommerce.com/images/uploads/MCA-Magento-Contributor-Agreement-230909.pdf): - ) – benmarks

+0

它似乎仍然發生在1.8?我今天面臨這個問題。 – Nikitas