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

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
'''Актуально для версии 2.9.5'''
+
'''Актуально для версии 2.11'''
  
 
Если на вашем сайте большое количество товаров и, соответственно, подготовка экспорта в формат YML занимает продолжительное время, то возникает необходимость запускать данную подготовку, например, ночью, чтобы днем была меньше нагрузка на сайт. Для выполнения данной задачи необходимо сделать следующее:
 
Если на вашем сайте большое количество товаров и, соответственно, подготовка экспорта в формат YML занимает продолжительное время, то возникает необходимость запускать данную подготовку, например, ночью, чтобы днем была меньше нагрузка на сайт. Для выполнения данной задачи необходимо сделать следующее:
  
1) В папке classes/modules/exchange разместите файл events.php , и в нем пропишите следующий код:
+
1) В папке classes/modules/exchange разместите файл custom_events.php , и в нем пропишите следующий код:
 +
 
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
    new umiEventListener("cron", "exchange", "prepareElementsToExportCustom");
+
new umiEventListener("cron", "exchange", "prepareElementsToExportCustom");
 
?>
 
?>
 
</source>
 
</source>
Строка 13: Строка 14:
  
 
<source lang="php">
 
<source lang="php">
 +
public function prepareElementsToExportCustom() {
 +
$objectId = '885'; // пропишите в эту переменную id выгрузки YML
  
public function prepareElementsToExportCustom($objectId) {
+
$objects = umiObjectsCollection::getInstance();
+
$object = $objects->getObject($objectId);
    if (!$objectId) {
+
$formatId = $object->format;
$objectId = getRequest('param0');
+
$format = $objects->getObject($formatId);
    }
+
$suffix = $format->sid;
+
if($suffix != 'YML') {
    $objectId = '885'; // если макрос будет запускаться через cron, то пропишите в эту переменную id выгрузки, подготовку
+
return;
// к которой необходимо выполнить. В ином случае - закомментируйте ее.
 
 
    $complete = false;
 
    $objects = umiObjectsCollection::getInstance();
 
    $object = $objects->getObject($objectId);
 
    $formatId = $object->format;
 
    $format = $objects->getObject($formatId);
 
    $suffix = $format->sid;
 
 
    if($suffix != 'YML') {
 
$data = array(
 
    "attribute:complete" => (int) $complete,
 
    "attribute:preparation" => (int) !$complete,
 
        );
 
 
 
baseModuleAdmin::setData($data);
 
return baseModuleAdmin::doData();
 
    }
 
 
 
    $offset = (int) getSession("export_offset_" . $objectId);
 
    $blockSize = mainConfiguration::getInstance()->get("modules", "exchange.splitter.limit") ?
 
    mainConfiguration::getInstance()->get("modules", "exchange.splitter.limit") : 25;
 
 
 
    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>');
 
    }
 
 
 
    $elementsToExport = unserialize(file_get_contents(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el'));
 
    $elements = umiHierarchy::getInstance();
 
 
 
    $errors = array();
 
 
    for ($i = $offset; $i <= $offset + $blockSize -1; $i++) {
 
 
        if(!array_key_exists($i, $elementsToExport)) {
 
    $complete = true;
 
    break;
 
 
}
 
}
 
        $element = $elements->getElement($elementsToExport[$i]);
 
  
if($element instanceof umiHierarchyElement) {
+
if(!file_exists(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el')) {
    try {
+
throw new publicException('<a href="' . getLabel("label-errors-no-information") . '" target="blank">' . getLabel("label-errors-no-information") .'</a>');
        $element->updateYML();
 
    } catch (Exception $e) {
 
$errors[] = $e->getMessage() . " #{$elementsToExport[$i]}";
 
    }
 
 
}
 
}
    }
 
  
    $_SESSION["export_offset_" . $objectId] = $offset + $blockSize;
+
$elements = unserialize(file_get_contents(CURRENT_WORKING_DIR . "/sys-temp/yml/" . $objectId . 'el'));
 +
$hierarchy = umiHierarchy::getInstance();
  
    if ($complete) {
+
foreach ($elements as $elementId) {
unset($_SESSION["export_offset_" . $objectId]);
+
$element = $hierarchy->getElement($elementId);
    }
 
  
    $data = array(
+
if ($element instanceof umiHierarchyElement) {
        "attribute:complete" => (int) $complete,
+
try {
"nodes:log" => $errors
+
$element->updateYML();
    );
+
} catch (Exception $e) {
 
+
echo $e->getMessage() . " #{$elementId}";
    baseModuleAdmin::setData($data);
+
return;
    return baseModuleAdmin::doData();
+
}
 +
}
 +
}
 
}
 
}
 
 
</source>
 
</source>
  
Все, теперь осталось только настроить автоматический запуск cron на какое-то время, это Вы самостоятельно устанавливаете на хостинге, информацию о cron в нашей документации Вы можете посмотреть здесь -  
+
Все, теперь осталось только настроить автоматический запуск cron на какое-то время, это вы самостоятельно устанавливаете на хостинге, информацию о cron в нашей документации вы можете посмотреть здесь: http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/ .
  
http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/.
+
Обратите внимание: в скрипте загружаются все товары сразу, поэтому на обработку большого каталога может уйти много оперативной памяти и времени.
  
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]

Версия 12:39, 1 февраля 2016

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

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

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

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

2) В файле classes/modules/exchange/__custom.php после строки //TODO: Write your macroses here добавьте следующий код:

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;
			}
		}
	}
}

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

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