Автоматическая подготовка экспорта в формат YML с помощью cron — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
Строка 1: Строка 1:
'''Актуально для версии 2.11'''
+
'''Актуально для версии 20'''
 +
 
 +
== Задача ==
 +
 
 +
Реализовать автоматическую подготовку экспорта в формат YML c помощью cron.
 +
 
 +
== Решение ==
  
 
Если на вашем сайте большое количество товаров и, соответственно, подготовка экспорта в формат YML занимает продолжительное время, то возникает необходимость запускать данную подготовку, например, ночью, чтобы днем была меньше нагрузка на сайт. Для выполнения данной задачи необходимо сделать следующее:
 
Если на вашем сайте большое количество товаров и, соответственно, подготовка экспорта в формат YML занимает продолжительное время, то возникает необходимость запускать данную подготовку, например, ночью, чтобы днем была меньше нагрузка на сайт. Для выполнения данной задачи необходимо сделать следующее:
  
1) В папке classes/modules/exchange разместите файл custom_events.php , и в нем пропишите следующий код:
+
1) В папке classes/components/exchange разместите файл custom_events.php , и в нем пропишите следующий код:
  
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
 
new umiEventListener("cron", "exchange", "prepareElementsToExportCustom");
 
new umiEventListener("cron", "exchange", "prepareElementsToExportCustom");
?>
+
 
 
</source>
 
</source>
  
2) В файле classes/modules/exchange/__custom.php после строки //TODO: Write your macroses here добавьте следующий код:
+
2) В файле classes/components/exchange/customMacros.php добавьте следующий код:
  
 
<source lang="php">
 
<source lang="php">
Строка 22: Строка 28:
 
$format = $objects->getObject($formatId);
 
$format = $objects->getObject($formatId);
 
$suffix = $format->sid;
 
$suffix = $format->sid;
if($suffix != 'YML') {
+
if ($suffix != 'YML') {
 
return;
 
return;
 
}
 
}
  
if(!file_exists(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el')) {
+
if (!file_exists(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el')) {
 
throw new publicException('<a href="' . getLabel("label-errors-no-information") . '" target="blank">' . getLabel("label-errors-no-information") .'</a>');
 
throw new publicException('<a href="' . getLabel("label-errors-no-information") . '" target="blank">' . getLabel("label-errors-no-information") .'</a>');
 
}
 
}
Строка 48: Строка 54:
 
</source>
 
</source>
  
Все, теперь осталось только настроить автоматический запуск cron на какое-то время, это вы самостоятельно устанавливаете на хостинге, информацию о cron в нашей документации вы можете посмотреть здесь: http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/ .
+
В коде необходимо указать идентификатор экспорта данных в YML настроенного в модуле Обмен данными. Его можно посмотреть в адресной строке при редактировании экспорта данных или на вкладке Экспорт данных при наведении:
 +
 
 +
[[Файл:Export_YML_id.png]]
 +
 
 +
Все, теперь осталось только настроить автоматический запуск cron на нужное время, это можно сделать в админке хостинга, информацию о cron в нашей документации вы можете посмотреть здесь: http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/ .
  
Обратите внимание: в скрипте загружаются все товары сразу, поэтому на обработку большого каталога может уйти много оперативной памяти и времени.
+
'''Обратите внимание:''' В скрипте загружаются все товары сразу, поэтому на обработку большого каталога может уйти много оперативной памяти и времени.
  
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]

Текущая версия на 07:59, 31 мая 2019

Актуально для версии 20

Задача

Реализовать автоматическую подготовку экспорта в формат YML c помощью cron.

Решение

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

1) В папке classes/components/exchange разместите файл custom_events.php , и в нем пропишите следующий код:

<?php
	new umiEventListener("cron", "exchange", "prepareElementsToExportCustom");

2) В файле classes/components/exchange/customMacros.php добавьте следующий код:

public function prepareElementsToExportCustom() {
	$objectId = '885'; // пропишите в эту переменную id выгрузки YML

	$objects = umiObjectsCollection::getInstance();
	$object = $objects->getObject($objectId);
	$formatId = $object->format;
	$format = $objects->getObject($formatId);
	$suffix = $format->sid;
	if ($suffix != 'YML') {
		return;
	}

	if (!file_exists(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el')) {
		throw new publicException('<a href="' . getLabel("label-errors-no-information") . '" target="blank">' . getLabel("label-errors-no-information") .'</a>');
	}

	$elements = unserialize(file_get_contents(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el'));
	$hierarchy = umiHierarchy::getInstance();

	foreach ($elements as $elementId) {
		$element = $hierarchy->getElement($elementId);

		if ($element instanceof umiHierarchyElement) {
			try {
				$element->updateYML();
			} catch (Exception $e) {
				echo $e->getMessage() . " #{$elementId}";
				return;
			}
		}
	}
}

В коде необходимо указать идентификатор экспорта данных в YML настроенного в модуле Обмен данными. Его можно посмотреть в адресной строке при редактировании экспорта данных или на вкладке Экспорт данных при наведении:

Export YML id.png

Все, теперь осталось только настроить автоматический запуск cron на нужное время, это можно сделать в админке хостинга, информацию о cron в нашей документации вы можете посмотреть здесь: http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/ .

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