В следующем коде я могу хранить всю информацию за исключением биржевых данных. Что-то изменилось в 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
Стивен Маленшек
источник
источник
Ответы:
Это работает для меня:
Редактировать :
Это больше не правильный способ справиться с этим, потому что
$product->save()
устарел начиная с Magento 2.1. Правильный способ сделать это с помощьюStockRegistryInterface
:С помощью приведенного выше кода вы можете использовать следующее:
Используйте менеджеров как можно больше. Держите ваши модули отделенными друг от друга.
Это Путь Магенто ™
источник
Если вы используете решение @ giel-berkers, вам также может потребоваться установить isInStock, поскольку оно не будет установлено автоматически. Итак, следующий код был полезен для меня:
источник
getStockItemBySku()
методаОдна вещь, которую другие ответы пропустили, это то, что если вы
setQty($qty)
, она будет применять точное значение, которое вы предоставляете. Но если бы продажа была сделана для этого продукта за мгновение до сохранения, первоначальное количество могло измениться. Итак, что вы действительно хотите сделать, это сообщить Magento разницу, которую вы хотите применить к количеству.К счастью, Magento 2 предоставляет хороший механизм для этого. Посмотрите на
Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:Здесь мы видим, что если вы установите
qty_correction
значение, оно будет применять разницу постепенно, а не точное значение.Итак, мое предложение по более безопасному количеству:
источник
Я боролся с этой же проблемой. Во время отладки я обнаружил, что данные о продукте имеют массив amount_and_stock_status, поэтому я попытался установить его с помощью:
и это начало работать для меня. Я по-прежнему устанавливаю $ product-> setStockData, если вы редактируете продукт и проверяете элемент в тех полях, в которых вы увидите оба поля: одно на вкладке "Общие", другое - в полях расширенного инвентаря. Я не до конца исследовал, почему их 2.
источник
источник
Ниже код работает нормально для меня, чтобы обновить продукт кол-во,
источник
Попробуйте установить StoreId равным $ product, и возможно замените:
$product->setStockData(...)
за$product->setData('stock_data', '...') // A Paranoid Recommendation
Кстати, если вы посмотрите Сохранить ActionController на серверной части M2 использует фильтр для подготовки stock_data, вы можете найти этот фильтр в:
источник
Попробуйте это, при сохранении продукта в админке, они сохранили данные инвентаризации, используя событие catalog_product_save_after в
Magento_CatalogInventory
модуле обозревателяисточник
У меня была та же проблема для magento 2.0.9 и следующий код работает в моем случае
источник
Magento2 также предлагает функцию Multi Stock, поэтому для обновления на конкретном складе вы можете воспользоваться этим решением.
источник