Import CSV: Comment importer des produits associés dans Magento 2?


9

Comment puis-je importer des produits connexes via csv dans Magento 2?

Dans mon fichier csv, j'ai une ligne avec l'attribut related_skus avec des données d'exemple "11-111,22-222" pour un produit. Mais dans admin Produits-> Catalogue de ce produit importé, l'onglet de la barre latérale Produits associés n'affiche aucun produit bien que ces produits avec skus existent dans le catalogue.

Où peut être l'erreur?


Magento a montré des erreurs? Quel est votre comportement d'importation: ajouter / mettre à jour, remplacer ou supprimer?
Khoa TruongDinh

Aucune erreur, l'importation s'est terminée avec succès. Le comportement d'importation était "Ajouter / Mettre à jour".
Invité

Vous essayez de réindexer votre base de données?
Khoa TruongDinh

Oui, j'ai utilisé la commande php bin / magento indexer: reindex et vidé le cache. J'ai utilisé la pipe "|" comme séparateur de valeurs multiples et les données d'exemple étaient "11-111 | 22-222". Peut-être que Magento ne prend pas en charge un autre séparateur de valeurs multiples pour l' attribut related_skus ?
Invité

Avez-vous réussi à importer vos produits maintenant?
Nolwennig

Réponses:


5

Nous avons rencontré le même problème, il semble que le module d'importation présente une sorte de bogue avec des produits connexes

Nous l'avons résolu en écrivant une nouvelle commande de console qui attend un fichier related.csv à 2 colonnes (sku parent et skus enfants) dans le dossier var , avec une virgule comme séparateur csv et un tuyau comme séparateur children_skus

Ce sont les fichiers, si vous voulez essayer. Vous remplaceriez Sinapsis par le nom de votre fournisseur souhaité et Sync par le nom de votre module souhaité

Après avoir installé le module, exécutez bin/magento setup:upgradeet vous verrez la nouvelle commande si vous cochez bin/magento list, qui pourrait être exécutée en exécutantbin/magento sync:related

mise à jour

Depuis la version 2.2. *, 2 modifications sont nécessaires: une ligne supplémentaire avant l'enregistrement $product, pour éviter le problème signalé ici https://github.com/magento/magento2/issues/10687

$product->unsetData('media_gallery');

Et changer admin en adminhtml dans

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

Je pense que le premier changement est inoffensif pour les anciennes versions, pas le même pour le second. J'ai donc ajouté uniquement le premier code ci-dessous

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

est ce code fonctionnera lors de la création de nouveaux produits, mais pour autant que j'ai vérifié votre code ici, vous ajoutez des produits connexes à la référence parent existante.
Hitesh Balpande

Si vous avez une idée lors de la création du sku parent, nous pouvons ajouter des skus connexes / upsell / crossel à ce produit. Veuillez me suggérer des remerciements à l'avance.
Hitesh Balpande

Ce code a fonctionné pour moi merci @Raul Sanchez
Hitesh Balpande
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.