CSV 가져 오기 : Magento 2에서 관련 제품을 가져 오려면 어떻게해야합니까?


9

Magento 2에서 CSV를 통해 관련 제품을 가져 오려면 어떻게해야합니까?

내 CSV 파일 에는 제품에 대한 예제 데이터 "11-111,22-222"가있는 related_skus 속성이있는 행 이 있습니다. 그러나이 가져온 제품의 관리 제품-> 카탈로그 에서 skus가있는 제품이 카탈로그에 있지만 사이드 바 탭 관련 제품에 제품이 표시 되지 않습니다 .

실수는 어디일까요?


마 젠토에 오류가 있습니까? 가져 오기 동작은 무엇입니까 : 추가 / 업데이트, 교체 또는 삭제?
Khoa TruongDinh

오류가 없습니다. 가져 오기가 성공적으로 완료되었습니다. 가져 오기 동작은 "추가 / 업데이트"입니다.
게스트

데이터베이스를 다시 색인하려고합니까?
Khoa TruongDinh

예, php bin / magento indexer : reindex 명령을 사용 하여 캐시를 플러시했습니다. 파이프 "|"를 사용했습니다 같은 다중 값 분리기 및 예시적인 데이터했다 "11-111 | 22-222". 아마도 Magento는 related_skus 속성에 대해 다른 다중 값 구분 기호를 지원하지 않습니까?
손님

당신은 지금 당신의 제품을 수입 달성 되었습니까?
Nolwennig

답변:


5

동일한 문제가 발생했습니다. 가져 오기 모듈에 관련 제품과 관련된 버그가있는 것 같습니다.

var 폴더에 2 개의 열 (부모 sku & children skus) related.csv 파일이 있고 쉼표가 csv 구분 기호이고 pipe가 children_skus 구분 기호 인 것으로 예상되는 새로운 콘솔 명령을 작성하여 문제를 해결했습니다 .

당신이 시도하고 싶다면 이것은 파일입니다. Sinapsis 를 원하는 벤더 이름으로 바꾸고 Sync 를 원하는 모듈 이름으로 바꿉니다.

모듈을 설치 한 후 실행 bin/magento setup:upgrade하면 확인하면 새 명령이 표시 bin/magento list됩니다.bin/magento sync:related

최신 정보

. 저장하기 전에 여분의 라인 : 2.2 이후 * 버전 필요한이 변화가 $product, 문제는 여기에보고 방지하기 위해 https://github.com/magento/magento2/issues/10687은

$product->unsetData('media_gallery');

에서 adminadminhtml 로 변경

$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>

앱 / 코드 / 시냅 시스 / 동기화 / registration.php

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

응용 프로그램 / 코드 / 시냅 시스 / 동기화 / 콘솔 / 명령 / 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>');
    }
}

이 코드는 새 제품을 만드는 동안 작동하지만 여기에서 코드를 확인하는 한 기존 부모 sku에 관련 제품을 추가하고 있습니다.
Hitesh Balpande

부모 sku를 만드는 동안 아이디어가 있다면 해당 제품에 관련 / 업셀 / 크로스 skus를 추가 할 수 있습니다. 미리 감사드립니다.
Hitesh Balpande

이 코드는 @Raul Sanchez
Hitesh Balpande
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.