Dans le code suivant, je suis en mesure de stocker toutes les informations à l'exclusion des données de stock. Quelque chose a-t-il changé dans 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
la source
la source
Réponses:
Cela fonctionne pour moi:
Modifier :
Ce n'est plus la bonne façon de gérer cela, car il
$product->save()
est obsolète depuis Magento 2.1. La bonne façon de procéder consiste à utiliserStockRegistryInterface
:Avec le code ci-dessus, vous pouvez utiliser les éléments suivants:
Utilisez autant que possible les gestionnaires . Gardez vos modules découplés les uns des autres.
C'est The Magento Way ™
la source
Si vous utilisez la solution @ giel-berkers, vous devrez peut-être également définir isInStock, car il ne sera pas défini automatiquement. Ainsi, le code suivant m'a été utile:
la source
getStockItemBySku()
méthodeUne chose que les autres réponses ont manqué, c'est que si vous
setQty($qty)
, il appliquera la valeur exacte que vous fournissez. Mais si une vente avait été faite pour ce produit un moment avant votre sauvegarde, la quantité d'origine aurait pu changer. Donc, ce que vous voulez vraiment faire, c'est dire à Magento la différence que vous souhaitez appliquer à la quantité.Heureusement, Magento 2 fournit un bon mécanisme pour cela. Jetez un œil à
Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:Ici, nous voyons que si vous définissez la
qty_correction
valeur, il appliquera la différence de manière incrémentielle au lieu d'appliquer un montant exact.Donc, ma suggestion pour une sauvegarde de quantité plus sûre est la suivante:
la source
J'ai eu du mal avec ce même problème. Lors du débogage, j'ai constaté que les données du produit avaient un tableau quantity_and_stock_status, j'ai donc essayé de le définir avec:
et ça a commencé à marcher pour moi. Je suis toujours en train de définir $ product-> setStockData aussi si vous modifiez un produit et inspectez un élément sur les champs, vous verrez qu'il a les deux, l'un sur l'onglet général, l'autre sur les champs d'inventaire avancés. Je n'ai pas cherché à savoir pourquoi il y en a 2.
la source
Le code ci-dessous fonctionne bien pour moi pour mettre à jour la quantité de produit,
la source
la source
Essayez de définir StoreId sur $ product avant tout, et remplacez peut-être:
$product->setStockData(...)
pour$product->setData('stock_data', '...') // A Paranoid Recommendation
BTW Si vous regardez Save ActionController sur le backend M2 utilise un filtre pour préparer stock_data, vous pouvez trouver ce filtre dans:
la source
Essayez ceci, tout en enregistrant le produit dans admin, ils ont enregistré les données d'inventaire en utilisant l'événement catalog_product_save_after dans le
Magento_CatalogInventory
module observerla source
J'ai eu le même problème pour magento 2.0.9 et le code suivant fonctionne dans mon cas
la source
Magento2 propose également la fonction Multi stock, donc pour mettre à jour sur une source de stock particulière, vous pouvez suivre cette solution
la source