Как сделать активными только импортируемые товары — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 9: Строка 9:
 
new umiEventListener("exchangeOnAddElement", "exchange", "onExchangeDisactivateElements");
 
new umiEventListener("exchangeOnAddElement", "exchange", "onExchangeDisactivateElements");
 
new umiEventListener("exchangeOnUpdateElement", "exchange", "onExchangeDisactivateElements");
 
new umiEventListener("exchangeOnUpdateElement", "exchange", "onExchangeDisactivateElements");
 +
new umiEventListener("exchangeOnImportFinish", "exchange", "onImportFinishUnsetFlag");
 +
new umiEventListener("exchangeOnAutoFinish", "exchange", "onImportFinishUnsetFlag");
 
?>
 
?>
 
</source>
 
</source>
Строка 15: Строка 17:
  
 
<source lang="php">
 
<source lang="php">
static $flag = false;
+
<?php
 +
abstract class __custom_exchange {
 +
public function onExchangeDisactivateElements(iUmiEventPoint $e) {
 +
if ($e->getMode() === 'after') {
 +
return;
 +
}
  
public function onExchangeDisactivateElements(iUmiEventPoint $e) {
+
$element = $e->getRef('element');
if ($e->getMode() === 'after') {
 
return;
 
}
 
  
$element = $e->getRef('element');
+
if ($element->getMethod() == 'category') {
 +
return;
 +
}
  
if ($element->getMethod() == 'category') {
+
// начало импорта, деактивируем все товары
return;
+
if (!file_exists("onExchangeDisactivateElementsFlag")) {
}
+
$pages = new selector('pages');
 +
$pages->types('hierarchy-type')->name('catalog', 'object');
  
$importId = getRequest('param0');
+
foreach ($pages as $p) {
 +
$p->setIsActive(false);
 +
}
  
if ($importId) {
+
file_put_contents("onExchangeDisactivateElementsFlag", "done");
$offset = getSession("import_offset_{$importId}");
+
}
} else {
 
$offset = getSession("1c_import_offset");
 
}
 
  
// начало импорта, деактивируем все товары
+
$element->setIsActive(true);
if (!self::$flag && !$offset) {
+
}
$pages = new selector('pages');
 
$pages->types('hierarchy-type')->name('catalog', 'object');
 
  
foreach ($pages as $p) {
+
public function onImportFinishUnsetFlag(iUmiEventPoint $e) {
$p->setIsActive(false);
+
unlink("onExchangeDisactivateElementsFlag");
 
}
 
}
 
self::$flag = true;
 
 
}
 
}
 +
?>
 +
</source>
  
$element->setIsActive(true);
+
Мы добавили обработчик событий добавления и обновления элемента механизмом импорта, в котором все объекты каталога становятся неактивными, а импортируемые элементы - активными. Несколько замечаний:
}
 
</source>
 
  
Мы добавили обработчик событий добавления и обновления элемента механизмом импорта, в котором все объекты каталога становятся неактивными, а импортируемые элементы - активными.
+
* В процессе импорта в корне сайта будет создан файл onExchangeDisactivateElementsFlag. Это значит, что у umi.cms должны быть права на запись этой директории. После завершения импорта файл удалится. Если импорт по каким-то причинам прервется, то нужно будет вручную удалить файл.
 +
* В нашей реализации селектор находит ВСЕ объекты каталога и делает их неактивными. Если у Вас очень много товаров на сайте, этот метод может быть неприемлемым из-за большого потребления оперативной памяти/ресурсов сервера. Если в процессе импорта Вы увидите сообщение "Ошибка разбора данных", это может означать, что сервер не успел деактивировать все объекты. В таком случае Вам нужно будет доработать скрипт, чтобы деактивация происходила поэтапно или каким-либо другим способом.Если Вам потребуется помощь в доработке скрипта, рекомендуем обратиться к нашим [http://www.umi-cms.ru/buy_now/find_webdevs/ партнерам:]

Версия 13:15, 8 февраля 2016

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

Задача: Сделать активными только импортируемые товары, все остальные товары в каталоге должны стать неактивными.

Реализация: В директорию \classes\modules\exchange\ нужно добавить файл custom_events.php со следующим содержанием:

<?php
	new umiEventListener("exchangeOnAddElement", "exchange", "onExchangeDisactivateElements");
	new umiEventListener("exchangeOnUpdateElement", "exchange", "onExchangeDisactivateElements");
	new umiEventListener("exchangeOnImportFinish", "exchange", "onImportFinishUnsetFlag");
	new umiEventListener("exchangeOnAutoFinish", "exchange", "onImportFinishUnsetFlag");
?>

В этой же директории в файл __custom.php нужно добавить следующий код:

<?php
	abstract class __custom_exchange {
		public function onExchangeDisactivateElements(iUmiEventPoint $e) {
			if ($e->getMode() === 'after') {
				return;
			}

			$element = $e->getRef('element');

			if ($element->getMethod() == 'category') {
				return;
			}

			// начало импорта, деактивируем все товары
			if (!file_exists("onExchangeDisactivateElementsFlag")) {
				$pages = new selector('pages');
				$pages->types('hierarchy-type')->name('catalog', 'object');

				foreach ($pages as $p) {
					$p->setIsActive(false);
				}

				file_put_contents("onExchangeDisactivateElementsFlag", "done");
			}

			$element->setIsActive(true);
		}

		public function onImportFinishUnsetFlag(iUmiEventPoint $e) {
			unlink("onExchangeDisactivateElementsFlag");
		}
	}
?>

Мы добавили обработчик событий добавления и обновления элемента механизмом импорта, в котором все объекты каталога становятся неактивными, а импортируемые элементы - активными. Несколько замечаний:

  • В процессе импорта в корне сайта будет создан файл onExchangeDisactivateElementsFlag. Это значит, что у umi.cms должны быть права на запись этой директории. После завершения импорта файл удалится. Если импорт по каким-то причинам прервется, то нужно будет вручную удалить файл.
  • В нашей реализации селектор находит ВСЕ объекты каталога и делает их неактивными. Если у Вас очень много товаров на сайте, этот метод может быть неприемлемым из-за большого потребления оперативной памяти/ресурсов сервера. Если в процессе импорта Вы увидите сообщение "Ошибка разбора данных", это может означать, что сервер не успел деактивировать все объекты. В таком случае Вам нужно будет доработать скрипт, чтобы деактивация происходила поэтапно или каким-либо другим способом.Если Вам потребуется помощь в доработке скрипта, рекомендуем обратиться к нашим партнерам: