Dalam kode berikut, saya bisa menyimpan semua informasi dengan mengesampingkan data stok. Apakah ada yang berubah di Magento 2?
public function __construct(
ScopeConfigInterface $scopeConfig, CollectionFactory $product,
Magento\Catalog\Api\ProductRepositoryInterface $productRepository
) {
$this->scopeConfig = $scopeConfig;
$this->product = $product;
$this->productRepository = $productRepository;
}
public function update(\XXXXXX\XXXXXX\Api\Data\InventoryCollectionInterface $data) {
foreach ($data['list'] as $d) {
$product = $this->productRepository->getById($d['entity_id']);
$product->setStatus(($d['quantity'] > 0 ? 1 : 0));
$product->setUpc($d['upc']);
$product->setStockData(array(
'qty' => $d['quantity'],
'is_in_stock' => ($d['quantity'] > 0 ? 1 : 0)
));
$this->productRepository->save($product);
}
return "Done";
}
magento2
inventory
magento-2.0
programmatically
Stephen Malenshek
sumber
sumber
Jawaban:
Ini bekerja untuk saya:
Edit :
Ini bukan lagi cara yang benar untuk menangani ini, karena
$product->save()
sudah usang sejak Magento 2.1. Cara yang benar untuk melakukan ini adalah dengan menggunakanStockRegistryInterface
:Dengan kode di atas, Anda dapat menggunakan yang berikut:
Gunakan Manajer sebanyak mungkin. Biarkan modul Anda dipisahkan satu sama lain.
Ini The Magento Way ™
sumber
Jika Anda menggunakan solusi @ giel-berkers, Anda mungkin perlu mengatur isInStock juga, karena itu tidak akan ditetapkan secara otomatis. Jadi, kode berikut bermanfaat bagi saya:
sumber
getStockItemBySku()
metodeSatu hal yang terlewatkan oleh jawaban lain adalah jika Anda
setQty($qty)
, itu akan menerapkan nilai persis yang Anda berikan. Tetapi jika penjualan dilakukan untuk produk itu sesaat sebelum penyimpanan Anda, jumlah asli mungkin bisa berubah. Jadi yang ingin Anda lakukan adalah memberi tahu Magento perbedaan yang ingin Anda terapkan pada qty.Untungnya, Magento 2 menyediakan mekanisme yang bagus untuk ini. Lihatlah
Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:Di sini kita melihat bahwa jika Anda menetapkan
qty_correction
nilai, itu akan menerapkan perbedaan secara bertahap alih-alih menerapkan jumlah yang tepat.Jadi saran saya untuk menghemat qty lebih aman adalah ini:
sumber
Saya berjuang dengan masalah yang sama ini. Saat debugging saya menemukan bahwa data produk memiliki array kuantitas_and_stock_status, jadi saya mencoba mengaturnya dengan:
dan itu mulai bekerja untuk saya. Saya masih menyetel $ product-> setStockData juga jika Anda mengedit produk dan memeriksa elemen pada bidang yang Anda akan melihat keduanya, satu ada di tab umum, yang lain di bidang inventaris canggih. Saya belum sepenuhnya menyelidiki mengapa ada 2 di antaranya.
sumber
Kode di bawah ini berfungsi dengan baik bagi saya untuk memperbarui jumlah produk,
sumber
sumber
Coba atur StoreId ke $ produk sebelumnya, dan mungkin ganti:
$product->setStockData(...)
untuk$product->setData('stock_data', '...') // A Paranoid Recommendation
BTW Jika Anda melihat Simpan ActionController di backend M2 menggunakan filter untuk mempersiapkan stock_data Anda bisa menemukan filter itu di:
sumber
Coba ini, saat menyimpan produk di admin, mereka menyimpan data inventaris dengan menggunakan catalog_product_save_after acara di
Magento_CatalogInventory
pengamat modulsumber
Saya memiliki masalah yang sama untuk magento 2.0.9 dan kode berikut berfungsi dalam kasus saya
sumber
Magento2 juga hadir dengan fitur multi stok sehingga untuk memperbarui pada sumber stok tertentu Anda dapat mengikuti solusi ini
sumber