CSV आयात: मैं Magento 2 में संबंधित उत्पादों का आयात कैसे कर सकता हूं?


9

मैं Magento 2 में सीएसवी के माध्यम से संबंधित उत्पादों को कैसे आयात कर सकता हूं?

मेरी csv फ़ाइल में मैं विशेषता के साथ एक पंक्ति है related_skus एक उत्पाद के लिए उदाहरण डेटा "11-111,22-222" के साथ। लेकिन व्यवस्थापक उत्पादों में - इस आयातित उत्पाद में कैटलॉग साइडबार टैब संबंधित उत्पाद कोई उत्पाद नहीं दिखाते हैं, हालांकि उन उत्पादों में कैटलॉग मौजूद हैं।

कहां गलती हो सकती है?


Magento ने कोई त्रुटि दिखाई? आपका आयात व्यवहार क्या है: जोड़ें / अपडेट करें, बदलें या हटाएं?
खोआ TruongDinh

कोई त्रुटि नहीं, आयात सफलतापूर्वक पूरा हो गया था। आयात व्यवहार "जोड़ें / अद्यतन करें" था।
अतिथि

आप अपने डेटाबेस को पुन: अनुक्रमित करने का प्रयास करते हैं?
खोआ TruongDinh

हां, मैंने कमांड php bin / magento indexer का उपयोग किया: reindex और कैश फ्लश किया। मैंने पाइप का इस्तेमाल किया "|" एकाधिक मूल्य विभाजक के रूप में और उदाहरण डेटा "11-111 | 22-222" था। शायद Magento संबंधित_स्कस विशेषता के लिए एक और एकाधिक मूल्य विभाजक का समर्थन नहीं करता है ?
अतिथि

क्या आप अब अपने उत्पादों को आयात करने के लिए प्राप्त हुए हैं?
Nolwennig

जवाबों:


5

हमने एक ही मुद्दे का अनुभव किया है, ऐसा लगता है कि आयात मॉड्यूल में संबंधित उत्पादों के साथ किसी प्रकार की बग है

हमने इसे एक नया कंसोल कमांड लिखकर हल किया है, जो 2 कॉलम (पैरेंट स्कू और चिल्ड्रन स्कस) से संबंधित है। var फ़ोल्डर में csv सेपरेटर के रूप में अल्पविराम फ़ाइल , और बच्चों के रूप में पाइप के साथ बच्चों_स्कस विभाजक

यदि आप कोशिश करना चाहते हैं तो यह फाइलें हैं। आप अपने वांछित विक्रेता के नाम के साथ सिनैप्सिस की जगह लेंगे , और अपने इच्छित मॉड्यूल नाम के साथ सिंक करेंगे

मॉड्यूल को स्थापित करने के बाद, चलाएं bin/magento setup:upgradeऔर यदि आप जांच करते हैं तो आप नई कमांड देखेंगे bin/magento list, जिसे चलाकर निष्पादित किया जा सकता हैbin/magento sync:related

अपडेट करें

। सहेजने से पहले एक अतिरिक्त पंक्ति: 2.2 के बाद से * संस्करण, वहाँ 2 परिवर्तन आवश्यक हैं $product, यहां मुद्दा यह सूचना को रोकने के लिए https://github.com/magento/magento2/issues/10687

$product->unsetData('media_gallery');

और एडमिन को एडमिन में बदलना

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

मुझे लगता है कि पहला बदलाव पुराने संस्करणों के लिए सहज नहीं है, दूसरे के लिए समान नहीं है। इसलिए मैंने नीचे दिए गए कोड में केवल पहला जोड़ा है

ऐप / कोड / सिनैप्सिस / सिंक / आदि / 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>

ऐप / कोड / सिनैप्सिस / सिंक / आदि / मॉड्यूल। 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>

ऐप / कोड / सिनैप्सिस / सिंक / पंजीकरण। एफपी

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Sinapsis_Sync',
    __DIR__
);

ऐप / कोड / सिनैप्सिस / सिंक / कंसोल / कमांड / संबंधितCommand.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>');
    }
}

क्या यह कोड नए उत्पादों को बनाते समय काम करेगा लेकिन जहाँ तक मैंने आपके कोड की जाँच की यहाँ आप संबंधित उत्पादों को मौजूदा मूल sku से जोड़ रहे हैं।
हितेश बलपांडे

यदि आपके पास पेरेंट स्कू बनाते समय कोई विचार है, तो हम उस उत्पाद में कुछ संबंधित / अपसेल / क्रॉस स्कल जोड़ सकते हैं। कृपया मुझे एडवांस में धन्यवाद दें।
हितेश बलपांडे

इस कोड ने मेरे लिए काम किया धन्यवाद @Raul Sanchez
हितेश बलपांडे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.