Magento 2: невозможно обновить товарный запас (количество)

Я создал консольную команду, которая просматривает продукты и пытается обновить количество на складе. Я переиндексирую (из командной строки) после его завершения, но он никогда не меняется. Я нахожусь на блуждающем ящике, в котором установлена ​​PHP7, и ранее я получал «Ошибка сегментации», когда прибыл в метод save (), поэтому мне пришлось изменить индексатор на «Обновление по расписанию» в разделе администратора и запустить Индексатор из командной строки вручную, но я все еще не вижу обновления количества продукта. Есть ли что-то еще, что мне нужно сделать, чтобы правильно сохранить продукт?

<?php

namespace MyApp\ProductUpdate\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Magento\Catalog\Api\Data\ProductInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Catalog\Model\Product\Interceptor;
use Magento\Framework\App\State;
use Magento\Framework\App\ObjectManager\ConfigLoader;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\Registry;

class UpdateCommand extends Command
{
/**
* @var ProductRepositoryInterface
*/
private $productRepo;

/**
* @var searchCriteriaBuilder
*/
private $searchCriteriaBuilder;

/**
* @var FilterBuilder
*/
private $filterBuilder;

/**
* @var State
*/
private $state;

/**
* @var ObjectManagerInterface
*/
private $objectManager;

/**
* @var Registry
*/
private $registry;

/**
* @var ConfigLoader
*/
private $configLoader;

/**
* Create new update command instance.
*
* @param ProductRepositoryInterface $productRepo           [description]
* @param SearchCriteriaBuilder      $searchCriteriaBuilder [description]
* @param FilterBuilder              $filterBuilder         [description]
* @param State                      $state                 [description]
* @param ObjectManagerInterface     $objectManager         [description]
* @param Registry                   $registry              [description]
*/
public function __construct(
ProductRepositoryInterface $productRepo,
SearchCriteriaBuilder $searchCriteriaBuilder,
FilterBuilder $filterBuilder,
State $state,
ObjectManagerInterface $objectManager,
Registry $registry,
ConfigLoader $configLoader
) {
$this->productRepo = $productRepo;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->filterBuilder = $filterBuilder;
$this->state = $state;
$this->objectManager = $objectManager;
$this->registry = $registry;
$this->configLoader = $configLoader;

parent::__construct();
}

/**
* {@inheritdoc}
*/
protected function configure()
{
$this->setName('myapp:inventory:update')
->setDescription('Updates product quantities.');

parent::configure();
}

/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->state->setAreaCode('adminhtml');
$this->objectManager->configure($this->configLoader->load('adminhtml'));
$this->registry->register('isSecureArea', true);

$continue = true;
$currentPage = 1;
$currentProduct = 1;
$perPage = 1000;

$output->writeln('<info>Getting list of products:<info>');

while ($continue) {
$searchCriteria = $this->searchCriteriaBuilder
->setPageSize(1000)
->setCurrentPage(1)
->create();

$results = $this->productRepo->getList($searchCriteria);

if ($results->getTotalCount() == 0) {
$continue = false;
continue;
}

$products = $results->getItems();

foreach ($products as $x => $product) {
// $product->setData('qty', 100); also tried this, but it does not work.
$product->setQty(100);
$product->setHasDataChanges(true);

$product->save();
$output->writeln('<info>Updated Product: '. $product->getSku() .' | Number: ' . $currentProduct . '</info>');

$currentProduct++;
}

$currentPage++;
}

$output->writeln('<info>Updating Complete!</info>');
}
}

0

Решение

попробуйте такой код:

$product->setStockData(['qty' => $qty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $qty, 'is_in_stock' => 1]);

это работает для меня. setQty не будет работать, так как количество напрямую не хранится в таблице EAV продукта, оно использует отдельную таблицу stock_item

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]