นำเข้า CSV: ฉันจะนำเข้าผลิตภัณฑ์ที่เกี่ยวข้องใน Magento 2 ได้อย่างไร


9

ฉันจะนำเข้าผลิตภัณฑ์ที่เกี่ยวข้องผ่าน csv ใน Magento 2 ได้อย่างไร

ในไฟล์ csv ของฉันฉันมีแถวที่มีแอตทริบิวต์related_skusพร้อมข้อมูลตัวอย่าง "11-111,22-222" สำหรับผลิตภัณฑ์ แต่ในผู้ดูแลระบบผลิตภัณฑ์ -> แคตตาล็อกในผลิตภัณฑ์ที่นำเข้านี้แท็บแถบด้านข้างผลิตภัณฑ์ที่เกี่ยวข้องไม่แสดงผลิตภัณฑ์แม้ว่าจะมีผลิตภัณฑ์ที่มี skus อยู่ในแคตตาล็อก

ผิดพลาดได้ที่ไหน?


Magento พบข้อผิดพลาดใด ๆ ? พฤติกรรมการนำเข้าของคุณคืออะไร: เพิ่ม / อัพเดท, แทนที่หรือลบ?
Khoa TruongDinh

ไม่มีข้อผิดพลาดการนำเข้าเสร็จสมบูรณ์ พฤติกรรมการนำเข้าคือ "เพิ่ม / อัปเดต"
ผู้เข้าพัก

คุณพยายามจัดทำดัชนีฐานข้อมูลของคุณใหม่หรือไม่?
Khao TruongDinh

ใช่ฉันใช้คำสั่งphp bin / magento indexer: สร้างดัชนีใหม่และล้างแคช ฉันใช้ไพพ์ "|" เป็นตัวคั่นค่าหลายค่าและข้อมูลตัวอย่างคือ "11-111 | 22-222" Magento อาจไม่สนับสนุนตัวคั่นค่าหลายค่าสำหรับแอตทริบิวต์__ ที่เกี่ยวข้องหรือไม่
ผู้เข้าพัก

คุณนำเข้าผลิตภัณฑ์ของคุณสำเร็จหรือไม่?
Nolwennig

คำตอบ:


5

เราประสบปัญหาเดียวกันดูเหมือนว่าโมดูลนำเข้ามีข้อผิดพลาดบางอย่างกับผลิตภัณฑ์ที่เกี่ยวข้อง

เราได้แก้ไขมันด้วยการเขียนคำสั่งคอนโซลใหม่ซึ่งคาดว่าจะมีไฟล์ 2 ไฟล์ (parent sku & children skus) ที่เกี่ยวข้องในโฟลเดอร์varโดยใช้เครื่องหมายจุลภาคเป็นตัวคั่น csv และไพพ์เป็น children_skus separator

นี่คือไฟล์ถ้าคุณต้องการลอง คุณจะแทนที่Sinapsisด้วยชื่อผู้ขายที่คุณต้องการและซิงค์ด้วยชื่อโมดูลที่คุณต้องการ

หลังจากติดตั้งโมดูลแล้วให้รันbin/magento setup:upgrade& คุณจะเห็นคำสั่งใหม่หากคุณตรวจสอบbin/magento listซึ่งสามารถเรียกใช้งานได้โดยการเรียกใช้bin/magento sync:related

ปรับปรุง

ตั้งแต่เวอร์ชัน 2.2. * ต้องมีการเปลี่ยนแปลง 2 รายการ: บรรทัดเพิ่มเติมก่อนบันทึก$productเพื่อป้องกันปัญหาที่รายงานที่นี่https://github.com/magento/magento/magento2/issues/10687

$product->unsetData('media_gallery');

และเปลี่ยนผู้ดูแลระบบเป็นadminhtmlใน

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

ฉันคิดว่าการเปลี่ยนแปลงครั้งแรกนั้นไม่น่ากลัวสำหรับคนรุ่นเก่า ดังนั้นฉันได้เพิ่มเฉพาะครั้งแรกในรหัสด้านล่าง

แอป / รหัส / 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__
);

แอป / รหัส / Sinapsis / ซิงค์ / คอนโซล / คำสั่ง / 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>');
    }
}

รหัสนี้จะทำงานในขณะที่สร้างผลิตภัณฑ์ใหม่ แต่เท่าที่ฉันตรวจสอบรหัสของคุณที่นี่คุณกำลังเพิ่มผลิตภัณฑ์ที่เกี่ยวข้องกับ parent sku ที่มีอยู่
Hitesh Balpande

หากคุณมีความคิดใด ๆ ในขณะที่สร้าง parent sku เราสามารถเพิ่ม / skell / crossel skus ในผลิตภัณฑ์นั้นได้ กรุณาแนะนำฉันขอบคุณล่วงหน้า
Hitesh Balpande

รหัสนี้ใช้ได้กับฉันขอบคุณ @Raul Sanchez
Hitesh Balpande
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.