我不得不研究这个问题并发现了问题。整个库存数据/项目界面有点棘手。
问题
Mage_Catalog_Model_Abstract->loadByAttribute
在集合上使用集合加载,catalog/product_collection
限制为 1。
该集合中产品的库存项目通过Mage_CatalogInventory_Model_Observer->addStockStatusToCollection
监听事件的事件观察器加载catalog_product_collection_load_after
。仅当设置addStockStatusToCollection
了标志时才加载产品的库存项目。require_stock_items
true
如果Mage_Catalog_Model_Abstract->loadByAttribute
没有设置这个标志,那么我们最终$product->_data['stock_item']
会成为类型Varien_Object
(参见Mage_CatalogInventory_Model_Stock_Status
第 488-491 行)。
这会导致错误
无效的方法 Varien_Object::save...
上$product->save
。
如果您仍然保存产品并希望在同一交易中进行库存更新,我推荐解决方案 1。解决方案 2 仅设置 stock 数据,因此它避免调用昂贵的$product->save
.
解决方案 1
在产品上使用额外的负载:这会$product->_data['stock_item']
正确加载。
Mage::getModel('catalog/product')->loadByAttribute('sku', 62701 );
$tempProduct->load($tempProduct->getId());
这是数据库上的附加读取事务,它会减慢速度。
解决方案 2
正如在其他答案中建议的那样,直接使用该类Mage_CatalogInventory_Model_Stock_Item
。但是您已经通过调用正确地引用了产品,setProduct
以便为新的和现有的库存项目提供工作代码。
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setProduct($product)
->setData('stock_id', Mage_CatalogInventory_Model_Stock::DEFAULT_STOCK_ID)
->setData('qty', 1)
->setData('is_in_stock', 1)
->setData('manage_stock', 1)
->setData('use_config_manage_stock', 0)
->setData('use_config_backorders', 0)
->setData('backorders', 0)
->setData('use_config_max_sale_qty', 0)
->setData('max_sale_qty', 1)
->save();