Chúng tôi đã gặp vấn đề tương tự, có vẻ như mô-đun nhập khẩu có một số loại lỗi với các sản phẩm liên quan
Chúng tôi đã giải quyết nó bằng cách viết một lệnh console mới, dự kiến sẽ có một tệp 2 cột (cha mẹ sku & skus trẻ em) có liên quan trong thư mục var , với dấu phẩy là dấu tách csv và đường ống là dấu phân cách children_skus
Đây là các tập tin, nếu bạn muốn thử. Bạn sẽ thay thế Sinapsis bằng tên nhà cung cấp mong muốn của bạn và Đồng bộ hóa với tên mô-đun mong muốn của bạn
Sau khi cài đặt mô-đun, hãy chạy bin/magento setup:upgrade
và bạn sẽ thấy lệnh mới nếu bạn kiểm tra bin/magento list
, có thể được thực thi bằng cách chạybin/magento sync:related
cập nhật
Kể từ phiên bản 2.2. *, Có 2 thay đổi bắt buộc: một dòng bổ sung trước khi lưu $product
, để ngăn sự cố được báo cáo tại đây https://github.com/magento/magento2/issues/10687
$product->unsetData('media_gallery');
Và thay đổi admin thành adminhtml trong
$this->_appState->setAreaCode('adminhtml');
Tôi nghĩ rằng thay đổi đầu tiên là vô hại đối với các phiên bản cũ, không giống với phiên bản thứ hai. Vì vậy, tôi đã chỉ thêm đầu tiên trong mã dưới đây
ứng dụng / mã / Sinapsis / Sync / etc / di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\Console\CommandList">
<arguments>
<argument name="commands" xsi:type="array">
<item name="sync_related" xsi:type="object">Sinapsis\Sync\Console\Command\RelatedCommand</item>
</argument>
</arguments>
</type>
ứng dụng / mã / Sinapsis / Sync / etc / module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="module.xsd">
<module name="Sinapsis_Sync" setup_version="1.0.0">
</module>
ứng dụng / mã / Sinapsis / Sync / đăng ký.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Sinapsis_Sync',
__DIR__
);
ứng dụng / mã / Sinapsis / Sync / Console / Command / RecentCommand.php
<?php
namespace Sinapsis\Sync\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\App\State as AppState;
use Magento\Framework\App\Filesystem\DirectoryList;
class RelatedCommand extends Command
{
const CSV_SEPARATOR = ',';
const CHILDREN_SEPARATOR = '|';
protected $_appState;
protected $_objectManager;
protected $_directorylist;
public function __construct(
DirectoryList $_directorylist,
AppState $appState,
ObjectManagerInterface $objectManager
) {
$this->_appState = $appState;
$this->_objectManager = $objectManager;
$this->_directorylist = $_directorylist;
parent::__construct();
}
protected function configure()
{
$this->setName('sync:related')
->setDescription('Synchronize catalog related products');
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln('<info>Starting process...<info>');
$output->writeln('');
$this->_appState->setAreaCode('admin');
$productRepository = $this->_objectManager->create('Magento\Catalog\Model\ProductRepository');
$output->writeln('<info>Loading csv content...<info>');
$output->writeln('');
$filePath = $this->_directorylist->getPath('var') . DIRECTORY_SEPARATOR . 'related.csv';
//@todo control Exception if file does not exist
$parseData = array();
if (($handle = fopen($filePath, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 0, self::CSV_SEPARATOR)) !== FALSE) {
$parseData[] = $data;
}
fclose($handle);
} else {
$output->writeln('<info>Could not read .csv file<info>');
return;
}
$headers = array_shift($parseData); // remove headers
foreach ($parseData as $row){
$skuParent = trim($row[0]);
$skuChildren = trim($row[1]);
$output->writeln('<info>Loading parent product ' . $skuParent . ' ... <info>');
try {
$product = $productRepository->get($skuParent);
} catch (\Magento\Framework\Exception\NoSuchEntityException $e){
$output->writeln('<info>Could not load!<info>');
continue;
}
$links = $product->getProductLinks();
$children = explode(self::CHILDREN_SEPARATOR, $skuChildren);
$i = 1;
foreach ($children as $skuChild){
$output->writeln('<info>Loading related product ' . $skuChild . ' ... <info>');
try {
$child = $productRepository->get($skuChild);
} catch (\Magento\Framework\Exception\NoSuchEntityException $e){
$output->writeln('<info>Could not load!<info>');
continue;
}
$productLink = $this->_objectManager->create('Magento\Catalog\Api\Data\ProductLinkInterface')
->setSku($skuParent)
->setLinkedProductSku($skuChild)
->setPosition($i)
->setLinkType('related');
$links[] = $productLink;
$i++;
}
$product->setProductLinks($links);
$product->unsetData('media_gallery');
$productRepository->save($product);
$output->writeln('<info>Relations saved for ' . $skuParent . '<info>');
}
$output->writeln('');
$output->writeln('<info>Done<info>');
}
}