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

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «'''Актуально для версии 2.9.5''' Категория:Вопросы и уроки разработки сайтов на UMI.CMS[[Катего…»)
 
Строка 1: Строка 1:
 
'''Актуально для версии 2.9.5'''
 
'''Актуально для версии 2.9.5'''
  
 +
Если на вашем сайте большое количество товаров и, соответственно, подготовка экспорта в формат YML занимает продолжительное время, то возникает необходимость запускать данную подготовку, например, ночью, чтобы днем была меньше нагрузка на сайт. Для выполнения данной задачи необходимо сделать следующее:
 +
 +
1) В папке classes/modules/exchange разместите файл events.php , и в нем пропишите следующий код:
 +
<source lang="php">
 +
<?php
 +
    new umiEventListener("cron", "exchange", "prepareElementsToExportCustom");
 +
?>
 +
</source>
 +
 +
2) В файле classes/modules/exchange/__custom.php  после строки //TODO: Write your macroses here добавьте следующий код:
 +
 +
<source lang="php">
 +
 +
public function prepareElementsToExportCustom($objectId) {
 +
 +
    if (!$objectId) {
 +
$objectId = getRequest('param0');
 +
    }
 +
 +
    $objectId = '885'; // если макрос будет запускаться через cron, то пропишите в эту переменную id выгрузки, подготовку
 +
// к которой необходимо выполнить. В ином случае - закомментируйте ее.
 +
 +
    $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) {
 +
    try {
 +
        $element->updateYML();
 +
    } catch (Exception $e) {
 +
$errors[] = $e->getMessage() . " #{$elementsToExport[$i]}";
 +
    }
 +
}
 +
    }
 +
 +
    $_SESSION["export_offset_" . $objectId] = $offset + $blockSize;
 +
 +
    if ($complete) {
 +
unset($_SESSION["export_offset_" . $objectId]);
 +
    }
 +
 +
    $data = array(
 +
        "attribute:complete" => (int) $complete,
 +
"nodes:log" => $errors
 +
    );
 +
 +
    baseModuleAdmin::setData($data);
 +
    return baseModuleAdmin::doData();
 +
}
 +
 +
</source>
 +
 +
Все, теперь осталось только настроить автоматический запуск cron на какое-то время, это Вы самостоятельно устанавливаете на хостинге, информацию о cron в нашей документации Вы можете посмотреть здесь -
 +
 +
http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/.
  
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]

Версия 13:45, 31 января 2014

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

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

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

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

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

public function prepareElementsToExportCustom($objectId) {
		
    if (!$objectId) {
	$objectId = getRequest('param0');
    }
				
    $objectId = '885'; // если макрос будет запускаться через cron, то пропишите в эту переменную id выгрузки, подготовку 
// к которой необходимо выполнить. В ином случае - закомментируйте ее. 
	
    $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) {
	    try {
	        $element->updateYML();
	    } catch (Exception $e) {
		$errors[] = $e->getMessage() . " #{$elementsToExport[$i]}";
	    }
	}
    }

    $_SESSION["export_offset_" . $objectId] = $offset + $blockSize;

    if ($complete) {
	unset($_SESSION["export_offset_" . $objectId]);
    }

    $data = array(
        "attribute:complete" => (int) $complete,
	"nodes:log" => $errors
    );

    baseModuleAdmin::setData($data);
    return baseModuleAdmin::doData();
}

Все, теперь осталось только настроить автоматический запуск cron на какое-то время, это Вы самостоятельно устанавливаете на хостинге, информацию о cron в нашей документации Вы можете посмотреть здесь -

http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/.