$ product-> save(); 导致错误-更改产品数量时

shn*_*lla 5 php magento

我正在创建一个自定义模块。

我正在测试更新产品数量的能力。

我创建了一个简单的magento模块,并开始使用indexController.php中的代码进行测试,这是我的代码:

public function indexAction() {

    //Just grabbing sku# 62701 for testing...
    $tempProduct = Mage::getModel('catalog/product')->loadByAttribute('sku', 62701 );

    $stockData['qty'] = 300;
    $tempProduct->setStockData($stockData);

    $tempProduct->save(); 

}
Run Code Online (Sandbox Code Playgroud)

通过在那里的最后一行,我得到了错误。

从错误日志中:

a:5:{i:0; s:46:“无效的方法Varien_Object :: save(Array()

紧接着是堆栈跟踪...

任何帮助表示赞赏,谢谢。

fhe*_*yer 5

我不得不调查这个问题并找到了问题。整个库存数据/物料界面有点棘手。

问题

Mage_Catalog_Model_Abstract->loadByAttribute对集合使用集合加载,catalog/product_collection限制为1。

该集合中的产品库存项目通过事件Mage_CatalogInventory_Model_Observer->addStockStatusToCollection侦听器加载,该事件侦听器侦听事件catalog_product_collection_load_afteraddStockStatusToCollection仅当require_stock_items设置了标志时才加载产品的库存项目true

如果Mage_Catalog_Model_Abstract->loadByAttribute未设置此标志,那么我们最终$product->_data['stock_item']会成为type Varien_Object(请参见Mage_CatalogInventory_Model_Stock_Status第488-491行)。

这会导致错误

无效的方法Varien_Object :: save ...

$product->save

如果您仍然保存产品并希望在同一笔交易中进行库存更新,则建议使用解决方案1。解决方案2仅设置库存数据,因此避免了昂贵的调用$product->save

解决方案1

在产品上使用额外的负载:此负载$product->_data['stock_item']正确。

Mage::getModel('catalog/product')->loadByAttribute('sku', 62701 );
$tempProduct->load($tempProduct->getId());
Run Code Online (Sandbox Code Playgroud)

这是数据库上的附加读取事务,它会使事情变慢。

解决方案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();
Run Code Online (Sandbox Code Playgroud)


shn*_*lla 4

我找到了一种保存似乎在我的场景中有效的数据的方法(不确定为什么它有效): /sf/answers/532573681/

使其工作的代码如下:

    $productId = $tempProduct->getId();
    $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
    $stockItem->setData('qty', $qty);

    $stockItem->save();
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人。