Импортируйте новые и обновляйте продукты и их атрибуты с помощью CSV-файла и задания cron Magento2


Я использую Magento 2.3.3 и хочу импортировать продукты с помощью cron и csv. У меня есть лист Google, который содержит все данные о продуктах, и данные листа постоянно меняются. Поэтому мне приходится каждый день запускать cron, который обновляет цену продукта, количество и некоторые значения атрибутов.

  1. Я сгенерировал csv-файл из листа, и он успешно импортируется вручную.
  2. Затем я попытался импортировать csv с помощью cron, нажав некоторые функции импорта, существующие в модуль - импорт-экспорт. Но не сработало, и все пошло наперекосяк.
  3. Теперь я пытаюсь импортировать продукты, напрямую сохраняя их в базе данных.

Возможно ли это сделать? Или у них другой путь?

Также проверил эту ссылку , но не понял этого.

Author: vartika sharma, 2020-07-18

3 answers

Я думаю, что вы ищете этот пример программы , который может быть лучшим вариантом. В комментариях также есть примечание об изображениях.

Я бы подумал, имея какую-то стратегию отката вместе с модулем cron, что-то вроде (псевдокод)

take product data dump 
run cron import 
  if Import successful 
     delete dump
     log something
  else if import fail
     rollback from dump
     log error and other relevant stuff 
 0
Author: rex, 2020-07-22 03:18:00

Я понял вашу озабоченность тем, что вы хотите добавлять новые продукты, обновлять цены на существующие продукты и значение атрибутов продукта, не путаясь со старыми данными.

Я рекомендовал вам создать команду исправления для импорта продуктов, в этом исправлении указаны следующие условия

  1. Проверьте код веб-сайта и состояние просмотра магазина
  2. Независимо от того, существует ли продукт или нет
  3. Чтобы обновить какие-либо данные, включите дополнительную опцию в командной строке **productupdate==1** на основе этого условия вы обновите новые значения старыми данными

После проверки этого условия вам необходимо проверить, как показано ниже, пример кода.

        $import_file = pathinfo($import_path);
        $import = $this->importFactory->create();
        $import->setData(
            array(
                'entity' => 'catalog_product',
                'behavior' => $import->getDefaultBehavior(),
                'validation_strategy' => 'validation-stop-on-errors',
            )
        );

        $read_file = $this->readFactory->create($import_file['dirname']);
        $csvSource = $this->csvSourceFactory->create(
            array(
                'file' => $import_file['basename'],
                'directory' => $read_file,
            )
        );
        $validate = $import->validateSource($csvSource);
        if (!$validate) {
            $output->writeln('<error>Unable to validate the CSV.</error>');
            exit;
        }

        $result = $import->importSource();
        if ($result) {
            $import->invalidateIndex();
        }

        if ($import->getCreatedItemsCount() > 0 && $productUpdate == 0) {
            $output->writeln("<info>Finished importing products from $import_path</info>");
        } else if ($import->getUpdatedItemsCount() > 0 && $productUpdate == 1) {
            $output->writeln("<info>Finished Updating the products from $import_path</info>");
        } else {
            $output->writeln("<error> Products are not created/updated, cross check the source file from $import_path</error>");
        }

Примечание: Файл CSV должен содержать все данные о продуктах при импорте нового значения Пример: Если вы обновляете значение цены, то CSV-файл продукта должен содержать все данные и включать в себя новое значение цены. Это позволит избежать пропуска данных при обновлении.

Я слежу за этим, и это работает на меня.

 1
Author: Sathishkumar, 2020-07-25 14:46:15

Вы можете создать рабочий процесс CRON и повторно использовать модель модуль-импорт-экспорт для импорта любой сущности.

Это пример класса для определения модели импорта Magento.

<?php


use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\ImportExport\Model\Import\Adapter as ImportAdapter;
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;

class ImportCron
{
    const ENTITY = 'catalog_product'; //catalog_product, customer, advanced_pricing...
    const BEHAVIOR = 'append'; //append, replace, delete


    protected $importModel;

    protected $fileSystem;

    /**
     * ImportCron constructor.
     * @param \Magento\ImportExport\Model\Import $importModel
     * @param \Magento\Framework\Filesystem $filesystem
     */
    public function __construct(
        \Magento\ImportExport\Model\Import $importModel,
        Magento\Framework\Filesystem $filesystem

    )
    {
        $this->importModel = $importModel;
        $this->fileSystem = $filesystem;
    }

    public function execute(){

        try{
            //TODO: Set Area scope, cron, adminhtml

            //TODO: Check entity, beavior, input file exist, etc...

            $fileName = '';
            $skipValidate = true;

            $sourceFile = $this->importModel->getWorkingDir() . self::ENTITY . '.csv';
            $importedFile = $this->importModel->getWorkingDir() . $fileName;
            if (strtolower($fileName) != self::ENTITY . '.csv') {
                copy($importedFile, $sourceFile);
            }

            $data = array(
                'entity' => '',
                'based_entity' => self::ENTITY,
                'behavior' => self::BEHAVIOR,
                $this->importModel::FIELD_NAME_VALIDATION_STRATEGY => $skipValidate ? ProcessingErrorAggregatorInterface::VALIDATION_STRATEGY_SKIP_ERRORS : ProcessingErrorAggregatorInterface::VALIDATION_STRATEGY_STOP_ON_ERROR,
                $this->importModel::FIELD_NAME_ALLOWED_ERROR_COUNT => 10,
                $this->importModel::FIELD_FIELD_MULTIPLE_VALUE_SEPARATOR => \Magento\ImportExport\Model\Import::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR,
                $this->importModel::FIELD_FIELD_SEPARATOR => ',',
                $this->importModel::FIELD_NAME_IMG_FILE_DIR => 'pub/media/import'
            );


            $this->importModel->setData($data);

            $source = ImportAdapter::findAdapterFor(
                $sourceFile,
                $this->fileSystem->getDirectoryWrite(DirectoryList::ROOT),
                $data[$this->importModel::FIELD_FIELD_SEPARATOR]
            );

            $validationResult = $this->importModel->validateSource($source);

            if (!$this->importModel->getProcessedRowsCount()) {
                if (!$this->importModel->getErrorAggregator()->getErrorsCount()) {
                } else {
                    foreach ($this->importModel->getErrorAggregator()->getAllErrors() as $error) {
                        //echo error;
                    }
                }
            } else {
                $errorAggregator = $this->importModel->getErrorAggregator();
                if (!$validationResult) {
                    foreach ($errorAggregator->getRowsGroupedByErrorCode() as $errorMessage => $rows) {
                        //echo error;
                    }
                } else {
                    if ($this->importModel->isImportAllowed()) {
                        $this->importModel->importSource();
                        $errorAggregator = $this->importModel->getErrorAggregator();
                        if ($errorAggregator->hasToBeTerminated()) {
                            foreach ($errorAggregator->getRowsGroupedByErrorCode() as $errorMessage => $rows) {
                                //echo error;
                            }
                        } else {
                            $this->importModel->invalidateIndex();
                            foreach ($errorAggregator->getRowsGroupedByErrorCode() as $errorMessage => $rows) {
                                //echo error;
                            }
                        }

                        //TODO: Move source file to archive or some folder.

                    } else {
                        //file valid but could not import
                    }
                }
            }
        }
        catch (\Exception $e){

        }

    }

}

С уважением,

 0
Author: vinhphon, 2020-07-24 09:58:42