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?


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.


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


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

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

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.


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

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;!


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.