Как обновить количество продуктов и статус запасов программным способом по идентификатору продукта: Magento 2


Я хочу обновить количество продуктов и изменить статус запасов, как на складе, программно по идентификатору продукта. Я не хочу вставлять новый продукт, но я хочу только обновить существующий продукт по его идентификатору. Кто-нибудь знает, как это сделать? Я попытался следовать коду, но не получил результата.

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

use Magento\Framework\App\Bootstrap;

require __DIR__ . '/app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$storeManager = $obj->get('\Magento\Store\Model\StoreManagerInterface');
$objectManager =  \Magento\Framework\App\ObjectManager::getInstance();  
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
//$productMetadata = $objectManager->get('Magento\Framework\App\ProductMetadataInterface');
//echo 'VERSION ==> '.$productMetadata->getVersion();

$product_id = 1;
$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
$productRepository = $objectManager->create('Magento\Catalog\Api\ProductRepositoryInterface');

$StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');


//$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
$product->setQty(100);
$product->save();

Редактировать: я хочу запустить в корневом каталоге и простой php-файл. Я хочу работать как

Localhost/m229/updateproduct.php

Author: Chirag Parmar, 2019-09-12

4 answers

Вы можете использовать приведенный ниже пример кода

$product->setStockData(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->save();
 2
Author: Narayan Jat, 2019-09-12 06:03:46

Вы можете использовать приведенный ниже фрагмент кода в своем скрипте для обновления данных о запасах и статусе продукта.

$stockData = [
        'use_config_manage_stock' => 0, // checkbox for 'Use config settings' 
        'manage_stock' => 1, // manage stock
        'min_sale_qty' => 1, // Shopping Cart Minimum Qty Allowed 
        'max_sale_qty' => 2, // Shopping Cart Maximum Qty Allowed
        'is_in_stock' => 1, // Stock Availability of product
        'qty' => 100 // qty of product
        ];

$product->setStockData($stockData);
$product->setQuantityAndStockStatus($stockData);
$product->save();

Кроме того, вы можете использовать приведенный ниже код в своем классе помощника или блока в пользовательском модуле для обновления состояния запасов продукта.

protected $_product;

/**
 * @var Magento\CatalogInventory\Api\StockStateInterface 
 */
protected $_stockStateInterface;

/**
 * @var Magento\CatalogInventory\Api\StockRegistryInterface 
 */
protected $_stockRegistry;

/**
* @param Magento\Framework\App\Helper\Context $context
* @param Magento\Catalog\Model\Product $product
* @param Magento\CatalogInventory\Api\StockStateInterface $stockStateInterface,
* @param Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry
*/
public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Catalog\Model\Product $product,
    \Magento\CatalogInventory\Api\StockStateInterface $stockStateInterface,
    \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry, 
) {
    $this->_product = $product;
    $this->_stockStateInterface = $stockStateInterface;
    $this->_stockRegistry = $stockRegistry;
    parent::__construct($context);
}

/**
 * For Update stock of product
 * @param int $productId which stock you want to update
 * @param array $stockData your updated data
 * @return void 
*/
public function updateProductStock($productId,$stockData) {
    $product=$this->_product->load($productId); //load product which you want to update stock
    $stockItem=$this->_stockRegistry->getStockItem($item['product_id']); // load stock of that product
    $stockItem->setData('is_in_stock',$stockData['is_in_stock']); //set updated data as your requirement
    $stockItem->setData('qty',$stockData['qty']); //set updated quantity 
    $stockItem->setData('manage_stock',$stockData['manage_stock']);
    $stockItem->setData('use_config_notify_stock_qty',1);
    $stockItem->save(); //save stock of item
    $product->save(); //  also save product
}

Надеюсь, это поможет!!!

 0
Author: Sumit, 2019-09-12 06:29:03

Примечание: использование диспетчера объектов не рекомендуется, но поскольку вы используете пользовательский скрипт, я также дам вам ответ с помощью диспетчера объектов

Попробуйте этот код:

$objectManager =  \Magento\Framework\App\ObjectManager::getInstance();  
$productRepository = $objectManager->create('\Magento\Catalog\Model\ProductRepository');
$stockRegistry = $objectManager->create('\Magento\CatalogInventory\Api\StockRegistryInterface');

$id = 1;
$product = $productRepository->getById($id);
$stockItem = $stockRegistry->getStockItemBySku($product->getSku());
$stockItem->setQty(100);
$stockRegistry->updateStockItemBySku($product->getSku(), $stockItem);

Надеюсь, это сработает для вас

 0
Author: Shoaib Munir, 2019-09-12 06:35:20
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

use Magento\Framework\App\Bootstrap;

require __DIR__ . '/app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$storeManager = $obj->get('\Magento\Store\Model\StoreManagerInterface');
$objectManager =  \Magento\Framework\App\ObjectManager::getInstance();  
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
//$productMetadata = $objectManager->get('Magento\Framework\App\ProductMetadataInterface');
//echo 'VERSION ==> '.$productMetadata->getVersion();

$product_id = 1;
$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
$productRepository = $objectManager->create('Magento\Catalog\Api\ProductRepositoryInterface');

$StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');


//$product = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
//$product->setQty(100);
$yourQty = 100;
$product->setStockData(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $yourQty, 'is_in_stock' => 1]);
$product->save();

Это работает для меня. я скопировал некоторый код из ответа Нарайяна.

 0
Author: Chirag Parmar, 2019-09-12 06:40:18