Nhập CSV: Làm cách nào tôi có thể nhập các sản phẩm liên quan trong Magento 2?


9

Làm cách nào tôi có thể nhập các sản phẩm liên quan qua csv trong Magento 2?

Trong tệp csv của tôi, tôi có một hàng với thuộc tính có liên quan với dữ liệu ví dụ "11-111,22-222" cho một sản phẩm. Nhưng trong quản trị Sản phẩm-> Danh mục trong sản phẩm được nhập này, tab thanh bên Sản phẩm liên quan không hiển thị sản phẩm nào mặc dù những sản phẩm có skus tồn tại trong danh mục.

Đâu có thể là sai lầm?


Magento có lỗi gì không? Hành vi nhập của bạn là gì: Thêm / Cập nhật, Thay thế hoặc Xóa?
Khoa TruongDinh

Không có lỗi, nhập đã hoàn thành. Hành vi nhập khẩu là "Thêm / Cập nhật".
Khách

Bạn cố gắng lập chỉ mục lại cơ sở dữ liệu của bạn?
Khoa TruongDinh

Có, tôi đã sử dụng lệnh php bin / magento indexer: reindex và xóa bộ đệm. Tôi đã sử dụng đường ống "|" dưới dạng phân tách nhiều giá trị và dữ liệu mẫu là "11-111 | 22-222". Có lẽ Magento không hỗ trợ khác tách giá trị nhiều cho related_skus thuộc tính?
Khách

Bạn đã đạt được để nhập khẩu sản phẩm của bạn bây giờ?
Nolwennig

Câu trả lời:


5

Chúng tôi đã gặp vấn đề tương tự, có vẻ như mô-đun nhập khẩu có một số loại lỗi với các sản phẩm liên quan

Chúng tôi đã giải quyết nó bằng cách viết một lệnh console mới, dự kiến ​​sẽ có một tệp 2 cột (cha mẹ sku & skus trẻ em) có liên quan trong thư mục var , với dấu phẩy là dấu tách csv và đường ống là dấu phân cách children_skus

Đây là các tập tin, nếu bạn muốn thử. Bạn sẽ thay thế Sinapsis bằng tên nhà cung cấp mong muốn của bạn và Đồng bộ hóa với tên mô-đun mong muốn của bạn

Sau khi cài đặt mô-đun, hãy chạy bin/magento setup:upgradevà bạn sẽ thấy lệnh mới nếu bạn kiểm tra bin/magento list, có thể được thực thi bằng cách chạybin/magento sync:related

cập nhật

Kể từ phiên bản 2.2. *, Có 2 thay đổi bắt buộc: một dòng bổ sung trước khi lưu $product, để ngăn sự cố được báo cáo tại đây https://github.com/magento/magento2/issues/10687

$product->unsetData('media_gallery');

Và thay đổi admin thành adminhtml trong

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

Tôi nghĩ rằng thay đổi đầu tiên là vô hại đối với các phiên bản cũ, không giống với phiên bản thứ hai. Vì vậy, tôi đã chỉ thêm đầu tiên trong mã dưới đây

ứng dụng / mã / 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>

ứng dụng / mã / 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>

ứng dụng / mã / Sinapsis / Sync / đăng ký.php

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

ứng dụng / mã / Sinapsis / Sync / Console / Command / RecentCommand.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>');
    }
}

là mã này sẽ hoạt động trong khi tạo các sản phẩm mới nhưng theo như tôi đã kiểm tra mã của bạn ở đây thì bạn đang thêm các sản phẩm liên quan vào sku cha hiện có.
Hitesh Balpande

Nếu bạn có bất kỳ ý tưởng nào trong khi tạo sku cha mẹ, chúng ta chỉ có thể thêm một số skus liên quan / upell / crossel vào sản phẩm đó. Xin đề nghị tôi cảm ơn trước.
Hitesh Balpande

Mã này hoạt động với tôi cảm ơn @Raul Sanchez
Hitesh Balpande
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.