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

时间:2012-09-24 20:34:04

标签: 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(); 

}

通过在那里有最后一行我得到错误。

从错误日志中:

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

随后是堆栈跟踪...

感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:4)

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

使其运作的代码如下:

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

    $stockItem->save();

我希望这有助于某人。

答案 1 :(得分:4)

我不得不调查这个问题,发现了问题。整个股票数据/项目界面有点棘手。

问题

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']的类型为Varien_Object(请参阅Mage_CatalogInventory_Model_Stock_Status第488-491行)。

这会导致错误

  

无效方法Varien_Object :: save ...

on $product->save

如果您保存产品并且希望在同一交易中进行库存更新,我建议使用解决方案1。解决方案2仅设置库存数据,以避免调用昂贵的$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();

答案 2 :(得分:1)

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

  1. 您确定loadByAttribute('sku', 62701 )只能 返回一项吗? (当人们试图同时更新多个内容时,该错误has shown up。)
  2. $stockData未定义。至少定义它会更安全。
  3. 看起来你错过了这样的事情:

    $stockData = $tempProduct->getStockData();
    

答案 3 :(得分:1)

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

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setProductId($product->getId());
$stockItem->setStockId(Mage_CatalogInventory_Model_Stock::DEFAULT_STOCK_ID);