เราประสบปัญหาเดียวกันดูเหมือนว่าโมดูลนำเข้ามีข้อผิดพลาดบางอย่างกับผลิตภัณฑ์ที่เกี่ยวข้อง
เราได้แก้ไขมันด้วยการเขียนคำสั่งคอนโซลใหม่ซึ่งคาดว่าจะมีไฟล์ 2 ไฟล์ (parent sku & children skus) ที่เกี่ยวข้องในโฟลเดอร์varโดยใช้เครื่องหมายจุลภาคเป็นตัวคั่น csv และไพพ์เป็น children_skus separator
นี่คือไฟล์ถ้าคุณต้องการลอง คุณจะแทนที่Sinapsisด้วยชื่อผู้ขายที่คุณต้องการและซิงค์ด้วยชื่อโมดูลที่คุณต้องการ
หลังจากติดตั้งโมดูลแล้วให้รันbin/magento setup:upgrade
& คุณจะเห็นคำสั่งใหม่หากคุณตรวจสอบbin/magento list
ซึ่งสามารถเรียกใช้งานได้โดยการเรียกใช้bin/magento sync:related
ปรับปรุง
ตั้งแต่เวอร์ชัน 2.2. * ต้องมีการเปลี่ยนแปลง 2 รายการ: บรรทัดเพิ่มเติมก่อนบันทึก$product
เพื่อป้องกันปัญหาที่รายงานที่นี่https://github.com/magento/magento/magento2/issues/10687
$product->unsetData('media_gallery');
และเปลี่ยนผู้ดูแลระบบเป็นadminhtmlใน
$this->_appState->setAreaCode('adminhtml');
ฉันคิดว่าการเปลี่ยนแปลงครั้งแรกนั้นไม่น่ากลัวสำหรับคนรุ่นเก่า ดังนั้นฉันได้เพิ่มเฉพาะครั้งแรกในรหัสด้านล่าง
แอป / รหัส / 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__
);
แอป / รหัส / Sinapsis / ซิงค์ / คอนโซล / คำสั่ง / 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>');
}
}