Impor CSV: Bagaimana saya bisa mengimpor produk terkait di Magento 2?

9

Bagaimana saya bisa mengimpor produk terkait melalui csv di Magento 2?

Dalam file csv saya, saya memiliki baris dengan atribut related_skus dengan data contoh "11-111,22-222" untuk suatu produk. Tetapi di admin Produk-> Katalog dalam produk impor ini tab sidebar Produk Terkait tidak menunjukkan produk meskipun produk dengan skus ada dalam katalog.

Dimana kesalahannya?

Tamu
sumber
Magento menunjukkan kesalahan? Apa Perilaku Impor Anda: Tambah / Perbarui, Ganti atau Hapus?
Khoa TruongDinh
Tidak ada kesalahan, impor berhasil diselesaikan. Perilaku Impor adalah "Tambah / Perbarui".
Tamu
Anda mencoba mengindeks ulang basis data Anda?
Khoa TruongDinh
Ya, saya menggunakan perintah php bin / magento indexer: reindex dan mem -flush cache. Saya menggunakan pipa "|" sebagai pemisah nilai berganda dan data contohnya adalah "11-111 | 22-222". Mungkin Magento tidak mendukung pemisah nilai berganda lainnya untuk atribut related_skus ?
Tamu
Sudahkah Anda berhasil mengimpor produk Anda sekarang?
Nolwennig

Jawaban:

5

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>');
    }
}
Raul Sanchez
sumber
adalah kode ini akan berfungsi saat membuat produk baru tetapi sejauh saya memeriksa kode Anda di sini Anda menambahkan produk terkait ke sku induk yang ada.
Hitesh Balpande
Jika Anda memiliki ide saat membuat sku induk saja kami dapat menambahkan beberapa skus terkait / upsell / crossel ke produk tersebut. Tolong sarankan saya terima kasih sebelumnya.
Hitesh Balpande
Kode ini berfungsi untuk saya, terima kasih @Raul Sanchez
Hitesh Balpande