Автоматическая подготовка экспорта в формат YML с помощью cron
Актуально для версии 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 в нашей документации Вы можете посмотреть здесь -