En el siguiente código, puedo almacenar toda la información con la exclusión de los datos de stock. ¿Ha cambiado algo en 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
fuente
fuente
Respuestas:
Esto funciona para mi:
Editar :
Esta ya no es la forma correcta de manejar esto, porque
$product->save()
está en desuso desde Magento 2.1. La forma correcta de hacer esto es mediante el uso deStockRegistryInterface
:Con el código anterior, puede usar lo siguiente:
Use los gerentes tanto como sea posible. Mantenga sus módulos desacoplados entre sí.
Es el camino de Magento ™
fuente
Si está utilizando la solución @ giel-berkers, es posible que también deba configurar isInStock, ya que no se configurará automáticamente. Entonces, el siguiente código fue útil para mí:
fuente
getStockItemBySku()
métodoUna cosa que las otras respuestas perdieron es que si usted
setQty($qty)
aplicará el valor exacto que proporcione. Pero si se realizó una venta para ese producto un momento antes de su ahorro, la cantidad original podría haber cambiado. Entonces, lo que realmente quiere hacer es decirle a Magento la diferencia que desea aplicar a la cantidad.Afortunadamente, Magento 2 proporciona un buen mecanismo para esto. Echa un vistazo a
Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:Aquí vemos que si establece el
qty_correction
valor, aplicará la diferencia de forma incremental en lugar de aplicar una cantidad exacta.Entonces, mi sugerencia para un ahorro de cantidad más seguro es esta:
fuente
Luché con este mismo problema. Durante la depuración descubrí que los datos del producto tienen una matriz cantidad_y_stock_estado, así que intenté configurarlo con:
y comenzó a funcionar para mí Todavía estoy configurando $ product-> setStockData también si editas un producto e inspeccionas el elemento en los campos, verás que tiene ambos, uno está en la pestaña general y el otro en los campos de inventario avanzado. No he investigado completamente por qué hay 2 de ellos.
fuente
El siguiente código funciona bien para mí para actualizar la cantidad de productos,
fuente
fuente
Intente configurar StoreId en $ product antes de todo, y tal vez reemplace:
$product->setStockData(...)
para$product->setData('stock_data', '...') // A Paranoid Recommendation
Por cierto, si mira el Save ActionController en el backend, M2 usa un filtro para preparar stock_data, puede encontrar ese filtro en:
fuente
Intente esto, al guardar el producto en admin, guardaron los datos de inventario mediante el evento catalog_product_save_after en el
Magento_CatalogInventory
módulo observadorfuente
Tuve el mismo problema para magento 2.0.9 y el siguiente código funciona en mi caso
fuente
Magento2 también viene con la función Multi stock, por lo que para actualizar una fuente de stock en particular puede seguir esta solución
fuente