Importazione CSV: come posso importare prodotti correlati in Magento 2?


9

Come posso importare prodotti correlati tramite CSV in Magento 2?

Nel mio file CSV ho una riga con l'attributo related_skus con i dati di esempio "11-111,22-222" per un prodotto. Ma in admin Prodotti-> Catalogo in questo prodotto importato la scheda della barra laterale Prodotti correlati non mostra prodotti sebbene questi prodotti con skus siano presenti nel catalogo.

Dove può essere l'errore?


Magento ha mostrato errori? Qual è il tuo comportamento di importazione: Aggiungi / Aggiorna, Sostituisci o Elimina?
Khoa TruongDinh,

Nessun errore, l'importazione è stata completata correttamente. Il comportamento di importazione era "Aggiungi / Aggiorna".
Ospite

Cerchi di reindicizzare il tuo database?
Khoa TruongDinh,

Sì, ho usato il comando php bin / magento indexer: reindex e svuotato la cache. Ho usato la pipa "|" come separatore di valori multipli e i dati di esempio erano "11-111 | 22-222". Magento non supporta un altro separatore a più valori per l' attributo related_skus ?
Ospite

Sei stato in grado di importare i tuoi prodotti ora?
Nolwennig,

Risposte:


5

Abbiamo riscontrato lo stesso problema, sembra che il modulo di importazione abbia qualche tipo di bug con i prodotti correlati

Abbiamo risolto scrivendo un nuovo comando di console che si aspetta un 2 colonne (genitore SKU e bambini SKU) related.csv file in var cartelle, con la virgola come separatore csv, ed il tubo come separatore children_skus

Questi sono i file, se vuoi provare. Sostituiresti Sinapsis con il nome del fornitore desiderato e Sync con il nome del modulo desiderato

Dopo aver installato il modulo, esegui bin/magento setup:upgradee vedrai il nuovo comando se controlli bin/magento list, che potrebbe essere eseguito eseguendobin/magento sync:related

aggiornare

Dalla versione 2.2. *, Sono necessarie 2 modifiche: una riga aggiuntiva prima del salvataggio $product, per evitare problemi segnalati qui https://github.com/magento/magento2/issues/10687

$product->unsetData('media_gallery');

E cambiando admin in adminhtml in

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

Penso che il primo cambiamento sia innocuo per le versioni precedenti, non lo stesso per il secondo. Quindi ho aggiunto solo il primo nel codice seguente

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>');
    }
}

è che questo codice funzionerà durante la creazione di nuovi prodotti ma per quanto ho controllato il tuo codice qui stai aggiungendo prodotti correlati allo SKU padre esistente.
Hitesh Balpande,

Se hai idea durante la creazione dello sku parent, possiamo aggiungere alcuni skus correlati / upsell / crossel a quel prodotto. Per favore, suggeriscimi grazie in anticipo.
Hitesh Balpande,

Questo codice ha funzionato per me grazie a @Raul Sanchez
Hitesh Balpande il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.