Kami mengalami masalah yang sama, sepertinya modul impor memiliki beberapa jenis bug dengan produk terkait
Kami telah menyelesaikannya dengan menulis perintah konsol baru yang mengharapkan file 2 kolom (parent sku & children skus) related.csv di folder var , dengan koma sebagai pemisah csv, dan pipa sebagai pemisah children_skus
Ini adalah file, jika Anda ingin mencoba. Anda akan mengganti Sinapsis dengan nama vendor yang Anda inginkan, dan Sinkronkan dengan nama modul yang Anda inginkan
Setelah menginstal modul, jalankan bin/magento setup:upgrade
& Anda akan melihat perintah baru jika Anda memeriksa bin/magento list
, yang dapat dieksekusi dengan menjalankanbin/magento sync:related
memperbarui
Sejak versi 2.2. *, Ada 2 perubahan yang diperlukan: baris tambahan sebelum menyimpan $product
, untuk mencegah masalah yang dilaporkan di sini https://github.com/magento/magento2/issues/10687
$product->unsetData('media_gallery');
Dan mengubah admin menjadi adminhtml di
$this->_appState->setAreaCode('adminhtml');
Saya pikir perubahan pertama tidak berbahaya untuk versi yang lebih lama, tidak sama untuk yang kedua. Jadi saya hanya menambahkan yang pertama dalam kode di bawah ini
app / code / 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>
app / code / 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>
app / code / Sinapsis / Sync / registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Sinapsis_Sync',
__DIR__
);
app / kode / Sinapsis / Sinkronisasi / Konsol / Perintah / RelatedCommand.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>');
}
}