5

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

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

我创建了一个简单的 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(); 

}

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

从错误日志中:

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

其次是堆栈跟踪...

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

4

4 回答 4

5

我不得不研究这个问题并发现了问题。整个库存数据/项目界面有点棘手。

问题

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

该集合中产品的库存项目通过Mage_CatalogInventory_Model_Observer->addStockStatusToCollection监听事件的事件观察器加载catalog_product_collection_load_after。仅当设置addStockStatusToCollection了标志时才加载产品的库存项目。require_stock_itemstrue

如果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();
于 2016-04-29T08:39:46.027 回答
4

我在这里找到了一种方法来保存似乎在我的场景中有效的数据(不知道为什么有效): https ://stackoverflow.com/a/7608195/1110880

使其工作的代码如下:

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

    $stockItem->save();

我希望这可以帮助别人。

于 2012-09-24T21:22:16.913 回答
1

我可以看到两个潜在的问题。

  1. 你确定loadByAttribute('sku', 62701 )只能退货一件吗?(当人们试图一次更新不止一件东西时,就会出现这个错误。
  2. $stockData没有定义。至少定义它会更安全。

看起来你缺少这样的东西:

$stockData = $tempProduct->getStockData();
于 2012-09-24T20:46:33.240 回答
1

我可能做错了什么,但我遇到了同样的问题,这有帮助:

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setProductId($product->getId());
$stockItem->setStockId(Mage_CatalogInventory_Model_Stock::DEFAULT_STOCK_ID);
于 2013-08-12T09:44:18.353 回答