Я создал консольную команду, которая просматривает продукты и пытается обновить количество на складе. Я переиндексирую (из командной строки) после его завершения, но он никогда не меняется. Я нахожусь на блуждающем ящике, в котором установлена 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>');
}
}
попробуйте такой код:
$product->setStockData(['qty' => $qty, 'is_in_stock' => 1]);
$product->setQuantityAndStockStatus(['qty' => $qty, 'is_in_stock' => 1]);
это работает для меня. setQty не будет работать, так как количество напрямую не хранится в таблице EAV продукта, оно использует отдельную таблицу stock_item
Других решений пока нет …