Импортируйте новые и обновляйте продукты и их атрибуты с помощью CSV-файла и задания cron Magento2
Я использую Magento 2.3.3 и хочу импортировать продукты с помощью cron и csv. У меня есть лист Google, который содержит все данные о продуктах, и данные листа постоянно меняются. Поэтому мне приходится каждый день запускать cron, который обновляет цену продукта, количество и некоторые значения атрибутов.
- Я сгенерировал csv-файл из листа, и он успешно импортируется вручную.
- Затем я попытался импортировать csv с помощью cron, нажав некоторые функции импорта, существующие в модуль - импорт-экспорт. Но не сработало, и все пошло наперекосяк.
- Теперь я пытаюсь импортировать продукты, напрямую сохраняя их в базе данных.
Возможно ли это сделать? Или у них другой путь?
Также проверил эту ссылку , но не понял этого.
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
Я понял вашу озабоченность тем, что вы хотите добавлять новые продукты, обновлять цены на существующие продукты и значение атрибутов продукта, не путаясь со старыми данными.
Я рекомендовал вам создать команду исправления для импорта продуктов, в этом исправлении указаны следующие условия
- Проверьте код веб-сайта и состояние просмотра магазина
- Независимо от того, существует ли продукт или нет
- Чтобы обновить какие-либо данные, включите дополнительную опцию в командной строке
**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-файл продукта должен содержать все данные и включать в себя новое значение цены. Это позволит избежать пропуска данных при обновлении.
Я слежу за этим, и это работает на меня.
Вы можете создать рабочий процесс 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){
}
}
}
С уважением,