CSV импорт по крону
Материал из Umicms
Версия от 08:38, 20 августа 2018; Whoa (обсуждение | вклад)
Актуально для версии 18.
Для того чтобы настроить CSV импорт по расписанию необходим модуль "Обмен данными" и следующий код:
Создадим файл custom_events.php в папке /components/exchange и добавим в него следующий код:
<?php
new umiEventListener('cron', 'exchange', 'onCronCsvUpdate');
В файл customMacros.php добавим обработчик события:
<?php
use UmiCms\Service;
/** Класс пользовательских макросов */
class ExchangeCustomMacros {
/** @var exchange $module */
public $module;
public function onCronCsvUpdate(iUmiEventPoint $event) {
$id = 38853; // идентификатор выгрузки
$umiObjects = umiObjectsCollection::getInstance();
$settings = $umiObjects->getObject($id);
if (!$settings instanceof iUmiObject) {
throw new publicException(getLabel('exchange-err-settings_notfound'));
}
$importFile = $settings->getValue('file');
if (!($importFile instanceof umiFile) || $importFile->getIsBroken()) {
throw new publicException(getLabel('exchange-err-importfile'));
}
$format_id = $settings->getValue('format');
$importFormat = $umiObjects->getObject($format_id);
if (!$importFormat instanceof iUmiObject) {
throw new publicException(getLabel('exchange-err-format_undefined'));
}
$suffix = $importFormat->getValue('sid');
$session = Service::Session();
$importOffset = (int) $session->get('import_offset_' . $id);
$umiConfig = mainConfiguration::getInstance();
$blockSize = $umiConfig->get('modules', 'exchange.splitter.limit') ?: 25;
$splitter = umiImportSplitter::get($suffix);
if ($splitter instanceof csvSplitter) {
$this->setCsvEncoding($splitter, $settings);
}
$splitter->load($importFile->getFilePath(), $blockSize, $importOffset);
$doc = $splitter->getDocument();
$dump = $splitter->translate($doc);
umiHierarchy::$ignoreSiteMap = true;
$importer = new xmlImporter();
$importer->loadXmlString($dump);
$elements = $settings->getValue('elements');
if (is_array($elements) && umiCount($elements)) {
$importer->setDestinationElement($elements[0]);
}
$importer->setIgnoreParentGroups($splitter->ignoreParentGroups);
$importer->setAutoGuideCreation($splitter->autoGuideCreation);
$importer->setRenameFiles($splitter->getRenameFiles());
$importer->execute();
}
public function setCsvEncoding(csvSplitter $splitter, iUmiObject $settings) {
$scenarioEncodingId = $settings->getValue('encoding_import');
$scenarioEncodingCode = '';
$scenarioEncoding = umiObjectsCollection::getInstance()
->getObject($scenarioEncodingId);
if ($scenarioEncoding instanceof iUmiObject) {
$scenarioEncodingCode = $scenarioEncoding->getName();
}
$configEncoding = mainConfiguration::getInstance()
->get('system', 'default-exchange-encoding');
$defaultEncoding = 'windows-1251';
$encoding = $scenarioEncodingCode ?: $configEncoding;
try {
$splitter->setEncoding($encoding);
} catch (InvalidArgumentException $e) {
$splitter->setEncoding($defaultEncoding);
}
}
}
Теперь осталось только настроить автоматический запуск cron на какое-то время, это вы самостоятельно устанавливаете на хостинге, информацию о cron в нашей документации вы можете посмотреть здесь: http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/ .