题
我尝试了一些在线找到的摘要,但没有成功。
只是试图将产品设置为库存 /库存中的库存,这是我得到的:
$product = Mage::getModel('catalog/product')->load( 'id' );
$stockItem = $product->getStockItem();
$stockItem->setData('manage_stock', 1);
$stockItem->setData('is_in_stock', 0);
$stockItem->setData('use_config_notify_stock_qty', 0);
$stockItem->setData('qty', 0);
$stockItem->save();
$product->save();
通过管理面板查看时,它没有对产品信息进行任何更改,任何想法吗?
解决方案
反试试:
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product);
然后像以前一样设置并保存您的更改。
其他提示
尝试以下内容。您不必加载新的库存对象
$product->setStockData(
array(
'is_in_stock' => 0,
'qty' => 0,
'manage_stock' => 1,
'use_config_notify_stock_qty' => 1
)
);
就像您在脚本中所做的那样,仅保存产品
我也有类似的问题,但区别是没有任何特定产品的库存物品对象。当发生这种情况时,最好在设置数量之前创建库存项目对象(除非有一种方法同时找到它们)。
// Check if there is a stock item object $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId()); $stockItemData = $stockItem->getData(); if (empty($stockItemData)) { // Create the initial stock item object $stockItem->setData('manage_stock',1); $stockItem->setData('is_in_stock',$qty ? 1 : 0); $stockItem->setData('use_config_manage_stock', 0); $stockItem->setData('stock_id',1); $stockItem->setData('product_id',$product->getId()); $stockItem->setData('qty',0); $stockItem->save(); // Init the object again after it has been saved so we get the full object $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId()); } // Set the quantity $stockItem->setData('qty',$qty); $stockItem->save(); $product->save();
作为所有答案的补充,使用可能是一个好主意 addData
代替 setData
在ODER中可以安全地更新信息,而不仅仅是设置信息。
尝试使用Magento 1.8.1.0 CE,并且由于缺少“ type_id”值(对于新项目)而无法保存“数量”。解决
$stockItem->setTypeId( $product->getTypeId() );
我想建议对拉吉的答案进行更改,以支持奇怪的情况。为了获得工作的答案,我必须评论IF语句,因为以程序化方式创建的产品可能会有部分但不完整的库存数据。这是我能够使它工作的唯一方法。
// Check if there is a stock item object $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId()); $stockItemData = $stockItem->getData(); //if (empty($stockItemData)) { // Create the initial stock item object $stockItem->setData('manage_stock',1); $stockItem->setData('is_in_stock',$qty ? 1 : 0); $stockItem->setData('use_config_manage_stock', 0); $stockItem->setData('stock_id',1); $stockItem->setData('product_id',$product->getId()); $stockItem->setData('qty',0); $stockItem->save(); // Init the object again after it has been saved so we get the full object $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId()); //} // Set the quantity $stockItem->setData('qty',$qty); $stockItem->save(); $product->save();
这是一个可能的原因,使我花了大约2个小时的工作:我已经尝试了很长时间,想知道为什么它不会保存。我有一个 exit;
PHP声明之后 ->save()
还有一堆Echos,因此它不会自动移动到下一个屏幕上(以帮助调试)。
但是,对数据库的提交必须在页面加载中迟到,直到我删除 exit;
!
就像其他答案中,建议可以使用班级 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();
替代解决方案
但是,如果您打电话 $product->save
无论如何我只会通过 $product->setStockdata($array)
如下。这样,Magento从库存数据中创建了正确的库存项目。最大的优势是库存项目更新发生在与 $product->save()
. 。这对于数据一致性很重要。
$stockData = array();
$stockData['qty'] = 1;
$stockData['is_in_stock'] = 1;
$stockData['manage_stock'] = 1;
$stockData['use_config_manage_stock'] = 0;
$stockData['use_config_backorders'] = 0;
$stockData['backorders'] = 0;
$stockData['use_config_max_sale_qty'] = 0;
$stockData['max_sale_qty'] = 1;
$product->setStockData($stockData);
//...
$product->save()