CSV-Import: Wie kann ich verwandte Produkte in Magento 2 importieren?

9

Wie kann ich verwandte Produkte über CSV in Magento 2 importieren?

In meiner CSV-Datei habe ich eine Zeile mit dem Attribut related_skus mit den Beispieldaten "11-111,22-222" für ein Produkt. Aber im Admin - Produkte-> Katalog in diesem importierten Produkt der Seitenleisten Verwandte Produkte zeigen keine Produkte , obwohl diese Produkte mit SKUs im Katalog vorhanden ist .

Wo kann der Fehler sein?

Gast
quelle
Magento zeigte irgendwelche Fehler? Wie ist Ihr Importverhalten: Hinzufügen / Aktualisieren, Ersetzen oder Löschen?
Khoa TruongDinh
Keine Fehler, Import wurde erfolgreich abgeschlossen. Das Importverhalten war "Hinzufügen / Aktualisieren".
Gast
Sie versuchen, Ihre Datenbank neu zu indizieren?
Khoa TruongDinh
Ja, ich habe den Befehl php bin / magento indexer: reindex verwendet und den Cache geleert . Ich habe Rohr "|" verwendet als Trennzeichen für mehrere Werte und die Beispieldaten waren "11-111 | 22-222". Vielleicht unterstützt Magento kein weiteres Trennzeichen für mehrere Werte für das Attribut related_skus ?
Gast
Haben Sie es geschafft, Ihre Produkte jetzt zu importieren?
Nolwennig

Antworten:

5

Wir haben das gleiche Problem festgestellt, es scheint, dass das Importmodul einen Fehler mit verwandten Produkten aufweist

Wir haben es gelöst , indem einen neuen Konsolenbefehl zu schreiben , die eine 2 - Säulen (Mutter sku & Kinder SKUs) erwartet related.csv Datei in var Ordnern mit Komma als csv Separator und Rohr als children_skus Separator

Dies sind die Dateien, wenn Sie es versuchen möchten. Sie würden ersetzen Sinapsis mit Ihrem gewünschten Herstellernamen und Sync mit Ihrem gewünschten Modulnamen

Führen bin/magento setup:upgradeSie nach der Installation des Moduls & aus , und Sie sehen den neuen Befehl, wenn Sie überprüfen bin/magento list, welcher durch Ausführen ausgeführt werden kannbin/magento sync:related

aktualisieren

Seit der Version 2.2. * Sind zwei Änderungen erforderlich: eine zusätzliche Zeile vor dem Speichern $product, um Probleme zu vermeiden, die hier gemeldet werden: https://github.com/magento/magento2/issues/10687

$product->unsetData('media_gallery');

Und admin in adminhtml in ändern

$this->_appState->setAreaCode('adminhtml');

Ich denke, die erste Änderung ist für ältere Versionen harmlos, nicht die gleiche für die zweite. Also habe ich nur den ersten im folgenden Code hinzugefügt

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 / code / Sinapsis / Sync / Console / Command / 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
quelle
Ist dieser Code funktioniert beim Erstellen neuer Produkte, aber soweit ich Ihren Code hier überprüft habe, fügen Sie verwandte Produkte zum vorhandenen übergeordneten Sku hinzu.
Hitesh Balpande
Wenn Sie beim Erstellen eines übergeordneten Skus nur eine Idee haben, können wir diesem Produkt einige verwandte / Upsell / Crossel-Skus hinzufügen. Bitte schlagen Sie mir im Voraus Danke vor.
Hitesh Balpande
Dieser Code hat bei mir funktioniert, danke @Raul Sanchez
Hitesh Balpande