如何以编程方式将产品设置为缺货/缺货


8

我尝试了一些在网上找到的片段,但没有成功。

只是尝试通过代码将产品设置为有货/无货,这是我所知道的:

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

通过管理面板查看产品信息时,它没有任何改变,有什么想法吗?


但是,您的代码对我有用,您必须进行设置以允许通过后端管理库存。
philwinkle

Answers:


12

尝试以下方法:

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product);

然后像以前一样设置并保存您的更改。


谢谢,我通过在管理面板中手动切换到“管理库存” = yes解决了该问题。完成后,您的代码将完美运行。
2013年

这适用于magento 1.6
ahnbizcad

当我在观察器功能中执行此操作时,显示以下错误消息。“产品名称”的请求数量不可用。是否有任何方法$ stockItem = Mage :: getModel('cataloginventory / stock_item')-> loadByProduct($ postProductId); $ stockItem-> setData('qty',$ currentStock); $ stockItem-> save();
Naveenbos

8

尝试以下方法。您不必加载新的库存对象

$product->setStockData(
   array( 
          'is_in_stock' => 0, 
          'qty' => 0,
          'manage_stock' => 1,
          'use_config_notify_stock_qty' => 1
   )
 ); 

然后像在脚本中一样保存产品


在1.8 CE下无法正常工作...
2014年

2
OP发布了ce1.6的问题。但是到底什么是行不通的。它会引发错误吗?
桑德甜菜

在1.9 CE下工作。
user487772

3

我有一个类似的问题,但不同之处在于,特定产品没有任何库存项目对象。发生这种情况时,最好在设置数量之前先创建库存项目对象(除非同时有一种方法可以使用它们)。

//检查是否有库存项目对象
$ stockItem = Mage :: getModel('cataloginventory / stock_item')-> loadByProduct($ product-> getId());
$ stockItemData = $ stockItem-> getData();
如果(empty($ stockItemData)){

    //创建初始库存项目对象
    $ 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();

    //保存后再次初始化对象,这样我们就可以得到完整的对象
    $ stockItem = Mage :: getModel('cataloginventory / stock_item')-> loadByProduct($ product-> getId());
}

//设置数量
$ stockItem-> setData('qty',$ qty);
$ stockItem-> save();
$ product-> save();

1
$product->save();-保存后是否需要$stockItem
Styx

1
除非您要更改其他产品属性,否则可能不是仅针对库存商品。
2015年

是的,因为如果您从头开始创建它,则需要将stockItem添加到产品中,观察员将其选中并稍后保存(这样就无需重复保存
Max S

3

尝试使用magento 1.8.1.0 CE,由于缺少“ type_id”值(对于新商品)而无法保存“ qty”。由...解决

$stockItem->setTypeId( $product->getTypeId() );

伴侣,花了我很长时间才能为我的问题找到正确的解决方案。您的评论挽救了我的生命。干杯! ;-)
麦地那

也救了我的命!
锁定

3

作为所有答案的补充,最好使用addData代替而不是setData为了安全地更新信息而不仅仅是设置信息。


2

我想建议更改Raj的答案以支持特殊情况。为了使答案生效,我必须注释掉if语句,因为以编程方式创建的产品可能具有部分但不完整的库存数据。这是我能够使其正常工作的唯一方法。

//检查是否有库存项目对象
$ stockItem = Mage :: getModel('cataloginventory / stock_item')-> loadByProduct($ product-> getId());
$ stockItemData = $ stockItem-> getData();
// if(empty($ stockItemData)){
    //创建初始库存项目对象
    $ 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();

    //保存后再次初始化对象,这样我们就可以得到完整的对象
    $ stockItem = Mage :: getModel('cataloginventory / stock_item')-> loadByProduct($ product-> getId());
//}

//设置数量
$ stockItem-> setData('qty',$ qty);
$ stockItem-> save();
$ product-> save();

1

这可能是导致我花了大约2个小时的时间的原因:我尝试了很久才想知道为什么它不省钱。exit;->save()和一堆回声之后,我有一个php语句,因此它不会自动移至下一个屏幕(以帮助调试)。

但是,对数据库的提交必须在页面加载的后期进行,直到我删除了exit;


1

就像在其他答案中建议的那样,可以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()

0

这是我的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 很重要

这是输出

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.