Cara mengatur produk agar stoknya habis / habis secara terprogram

8

Saya mencoba beberapa cuplikan yang ditemukan secara online tetapi tidak berhasil.

Hanya mencoba untuk menetapkan suatu produk dalam stok / kehabisan stok dengan kode, ini sejauh yang saya dapatkan:

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

Itu tidak membuat perubahan pada informasi produk ketika dilihat melalui panel admin, ada ide?

Mike
sumber
Kode Anda berfungsi untuk saya, meskipun, Anda harus memiliki pengaturan untuk memungkinkan stok dikelola melalui backend.
philwinkle

Jawaban:

12

Coba ini sebagai gantinya:

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

lalu atur dan simpan perubahan Anda seperti sebelumnya.

mpaepper
sumber
Terima kasih untuk itu, saya memecahkan masalah dengan beralih secara manual ke "kelola stok" = ya di panel admin. Setelah selesai, kode Anda berfungsi dengan baik.
Mike
ini bekerja untuk
magento
Ketika saya melakukan ini dalam fungsi pengamat, pesan kesalahan di bawah ini menampilkan Kuantitas yang diminta untuk "Nama Produk" tidak tersedia. apakah ada metode $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> save ();
Naveenbos
8

Coba yang berikut ini. Anda tidak harus memuat objek stok baru

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

Dan simpan saja produk seperti yang Anda lakukan dalam skrip Anda

Sander Mangel
sumber
Tidak bekerja di bawah 1,8 CE ...
Dor
2
OP memposting pertanyaan untuk ce1.6. Tetapi apa yang sebenarnya tidak berhasil. Apakah ada kesalahan?
Sander Mangel
Apakah berfungsi di bawah 1.9 CE.
user487772
3

Saya memiliki masalah yang sama tetapi dengan perbedaan bahwa tidak ada objek stok barang untuk produk tertentu. Ketika ini terjadi, ada baiknya untuk membuat objek stok barang awalnya sebelum menetapkan kuantitas (kecuali ada cara untuk mereka pada saat yang sama).

// Periksa apakah ada objek stok barang
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (kosong ($ stockItemData)) {

    // Buat objek stok barang awal
    $ 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 objek lagi setelah telah disimpan sehingga kita mendapatkan objek penuh
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
}

// Tetapkan jumlahnya
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ product-> save ();
Raj
sumber
1
$product->save();- apakah diperlukan setelah menabung $stockItem?
Styx
1
Mungkin tidak untuk stok barang saja kecuali Anda mengubah atribut produk lainnya.
Raj
Ya, karena jika Anda membuatnya dari awal, Anda perlu menambahkan stockItem ke produk, Pengamat akan mengambilnya dan menyimpannya nanti (jadi duplikat tabungan tidak diperlukan
Max S
3

mencoba magento 1.8.1.0 CE dan tidak dapat menyimpan "qty" karena nilai "type_id" yang hilang (untuk item baru). dipecahkan oleh

$stockItem->setTypeId( $product->getTypeId() );
jaro
sumber
Mate, butuh waktu lama untuk menemukan solusi yang tepat untuk masalah saya. Anda berkomentar menyelamatkan hidup saya. Bersulang! ;-)
medina
Menyelamatkan hidup saya juga !!!!
Kunci
3

Sebagai tambahan untuk semua jawaban, mungkin ide yang baik untuk digunakan addDataalih-alih setDataaman untuk memperbarui informasi dan tidak hanya menyetelnya.

pengguna487772
sumber
2

Saya ingin menyarankan perubahan pada jawaban Raj untuk mendukung situasi aneh. Agar jawaban untuk bekerja saya harus mengomentari pernyataan if, karena produk yang dibuat secara terprogram dapat memiliki data stok parsial, namun tidak lengkap. Ini adalah satu-satunya cara saya bisa membuatnya bekerja.

// Periksa apakah ada objek stok barang
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
// if (kosong ($ stockItemData)) {
    // Buat objek stok barang awal
    $ 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 objek lagi setelah telah disimpan sehingga kita mendapatkan objek penuh
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
//}

// Tetapkan jumlahnya
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ product-> save ();
pengguna3338098
sumber
1

Inilah kemungkinan penyebab yang menghabiskan waktu sekitar 2 jam kerja: Saya sudah mencoba ini sejak lama bertanya-tanya mengapa itu tidak menghemat. Saya memiliki exit;pernyataan php setelah ->save()dan banyak gema sehingga tidak akan pindah ke layar berikutnya secara otomatis (untuk membantu debug).

Namun komit ke database harus terjadi terlambat pada halaman memuat itu tidak akan menyelamatkan saya sampai saya menghapus exit;!

colmde
sumber
1

Seperti pada jawaban lain yang disarankan seseorang dapat menggunakan kelas Mage_CatalogInventory_Model_Stock_Itemsecara langsung. Tetapi kita harus mereferensikan produk dengan benar melalui panggilan setProductuntuk memiliki kode yang berfungsi baik untuk item stok baru dan yang ada.

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

Solusi alternatif

Namun jika Anda $product->savetetap menelepon saya hanya akan mengatur data stok melalui $product->setStockdata($array)sebagai berikut. Dengan cara ini Magento membuat item stok yang benar dari data stok. Keuntungan besar adalah bahwa pembaruan stok barang terjadi dalam transaksi yang sama dengan $product->save(). Ini penting untuk konsistensi data.

$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()
fheyer
sumber
0

Ini adalah kode C # saya

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 penting

Ini adalah output

masukkan deskripsi gambar di sini

phanvugiap
sumber