Im folgenden Code kann ich alle Informationen unter Ausschluss der Bestandsdaten speichern. Hat sich in Magento 2 etwas geändert?
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
quelle
quelle
Antworten:
Das funktioniert bei mir:
Bearbeiten :
Dies ist nicht mehr der richtige Weg, um damit
$product->save()
umzugehen , da es seit Magento 2.1 veraltet ist. Der richtige Weg, dies zu tun, ist die Verwendung vonStockRegistryInterface
:Mit dem obigen Code können Sie Folgendes verwenden:
Verwenden Sie Manager so oft wie möglich. Halten Sie Ihre Module voneinander entkoppelt.
Es ist der Magento Way ™
quelle
Wenn Sie die @ giel-berkers-Lösung verwenden, müssen Sie möglicherweise auch isInStock festlegen, da diese nicht automatisch festgelegt wird. Der folgende Code war also nützlich für mich:
quelle
getStockItemBySku()
Methode zu übergebenEine Sache, die die anderen Antworten übersehen haben, ist, dass wenn Sie
setQty($qty)
, genau den Wert anwenden, den Sie angeben. Wenn jedoch ein Verkauf für dieses Produkt einen Moment vor dem Speichern durchgeführt wurde, könnte sich die ursprüngliche Menge geändert haben. Was Sie also wirklich tun möchten, ist Magento den Unterschied mitzuteilen, den Sie auf die Menge anwenden möchten.Glücklicherweise bietet Magento 2 einen guten Mechanismus dafür. Schauen Sie sich an
Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:Hier sehen wir, dass, wenn Sie den
qty_correction
Wert festlegen , die Differenz schrittweise angewendet wird, anstatt einen genauen Betrag anzuwenden.Mein Vorschlag für eine sicherere Mengenersparnis lautet also:
quelle
Ich hatte mit dem gleichen Problem zu kämpfen. Beim Debuggen habe ich festgestellt, dass die Produktdaten ein Array "Quantity_und_Stock_Status" haben. Deshalb habe ich versucht, Folgendes festzulegen:
und es fing an, für mich zu arbeiten. Ich setze auch weiterhin $ product-> setStockData, wenn Sie ein Produkt bearbeiten und das Element in den Feldern untersuchen, in denen beide angezeigt werden. Eines befindet sich auf der Registerkarte "Allgemein", das andere in den Feldern für das erweiterte Inventar. Ich habe nicht vollständig untersucht, warum es zwei davon gibt.
quelle
Der folgende Code funktioniert einwandfrei, damit ich die Produktmenge aktualisieren kann.
quelle
quelle
Versuchen Sie, StoreId vor allem auf $ product zu setzen, und ersetzen Sie möglicherweise:
$product->setStockData(...)
zum$product->setData('stock_data', '...') // A Paranoid Recommendation
Übrigens: Wenn Sie sich den Save ActionController im Backend ansehen, verwendet M2 einen Filter zum Vorbereiten von stock_data. Sie finden diesen Filter in:
quelle
Versuchen Sie dieses, während das Produkt im Admin - Speichern gespeichert sie Bestandsdaten von Ereignis mit catalog_product_save_after in
Magento_CatalogInventory
Modul Beobachterquelle
Ich hatte das gleiche Problem für Magento 2.0.9 und der folgende Code funktioniert in meinem Fall
quelle
Magento2 verfügt auch über eine Multi-Stock-Funktion. Um eine bestimmte Stock-Quelle zu aktualisieren, können Sie dieser Lösung folgen
quelle