プログラムで製品の在庫を設定する方法


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 2013年

回答:


12

代わりにこれを試してください:

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

変更を設定して保存します。


そのおかげで、管理パネルで「在庫の管理」=はいに手動で切り替えることで問題を解決しました。これが完了すると、コードは完全に機能します。
マイク

これはmagento 1.6で機能しました
ahnbizcad 2015年

オブザーバー関数でこれを行うと、以下のエラーメッセージが表示されます。$ 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 2017

3

同様の問題がありましたが、特定の製品には在庫アイテムオブジェクトがありませんでした。これが発生した場合、数量を設定する前に在庫アイテムオブジェクトを最初に作成することをお勧めします(同時にそれらに方法がない場合を除く)。

//在庫アイテムオブジェクトがあるかどうかを確認します
$ 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
$product->save();-保存後に必要$stockItemですか?
Styx 2015年

1
他の製品属性を変更している場合を除いて、おそらく在庫品目のみではありません。
Raj

はい、最初から作成する場合は、stockItemを製品に追加する必要があるため、オブザーバーがそれを取得して後で保存します(したがって、重複保存は必要ありません
最大S

3

magento 1.8.1.0 CEを試してみましたが、「type_id」の値が欠落しているため(「新しいアイテム」)、「qty」を保存できませんでした。によって解決

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

メイト、私の問題の正しい解決策を見つけるのに長い時間がかかりました。コメントは私の命を救った。乾杯!;-)
メディナ

私の命も救った!!!!
ロック

3

すべての回答への追加として、情報を更新するだけでなく、設定するだけではなく、安全にするaddDataにはsetData、オーダの代わりに使用することをお勧めします。


2

奇妙な状況をサポートするために、ラージの答えを変更することを提案したいと思います。答えが機能するためには、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;後にphpステートメントが->save()あり、たくさんのエコーがあったので、次の画面に自動的に移動しません(デバッグに役立ちます)。

ただし、データベースへのコミットは、ページの読み込みの後半に発生する必要があります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 は重要

これは出力です

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.