我尝试了一些在线找到的摘要,但没有成功。

只是试图将产品设置为库存 /库存中的库存,这是我得到的:

$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()

这是我的C#代码

var inStock = qty > 0 ? 1 : 0;    
var stock_data = new catalogInventoryStockItemUpdateEntity()
            {
                qty = qty,
                is_in_stock = inStock,
                manage_stock = 1,
                is_in_stockSpecified = true,
            };

is_in_stockSpecified 很重要

这是输出

enter image description here

许可以下: CC-BY-SA归因
scroll top