CSV импорт по крону
Материал из Umicms
Актуально для версии 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/ .
