CSV импорт по крону

Материал из Umicms
Версия от 08:39, 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/ .