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

Материал из Umicms
Перейти к:навигация, поиск
 
(не показано 6 промежуточных версий 4 участников)
Строка 1: Строка 1:
[[category:Модуль Обмен данными]]
+
[[category:Модуль Обмен данными]][[Категория:Написание кастомных макросов]][[category:Интеграция с 1С]]
'''Актуально для версии 2.9'''
+
'''Актуально для версии 20'''
 +
 
 +
== Задача ==
 +
 
 +
Сделать активными только импортируемые товары, все остальные товары в каталоге должны стать неактивными.
 +
 
 +
== Решение ==
 +
 
 +
В директорию \classes\components\exchange\ нужно добавить файл custom_events.php со следующим содержанием:
  
'''Задача''': Сделать активными только импортируемые товары, все остальные товары в каталоге должны стать неактивными.<br/><br/>
 
'''Реализация''': В директорию \classes\modules\exchange\ нужно добавить файл custom_events.php со следующим содержанием:
 
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
    new umiEventListener("exchangeOnAddElement", "exchange", "disActive");
+
new umiEventListener("exchangeOnAddElement", "exchange", "onExchangeDisactivateElements");
    new umiEventListener("exchangeOnUpdateElement", "exchange", "disActive");
+
new umiEventListener("exchangeOnUpdateElement", "exchange", "onExchangeDisactivateElements");
?>
+
new umiEventListener("exchangeOnImportFinish", "exchange", "onImportFinishUnsetFlag");
 +
new umiEventListener("exchangeOnAutoFinish", "exchange", "onImportFinishUnsetFlag");
  
 
</source>
 
</source>
  
В этой же директории в файл __custom.php нужно добавить следующий код:
+
В этой же директории в файл customMacros.php нужно добавить следующий код:
 +
 
 
<source lang="php">
 
<source lang="php">
      static $flag = false;
+
<?php
            public function disActive(iUmiEventPoint $e){
+
 
                if($e->getMode()==='before'){  
+
/** Класс пользовательских макросов */
                    $element = $e->getRef('element');
+
class ExchangeCustomMacros {
                    $element->SetIsActive(true);
+
 
                    if((self::$flag===false)){
+
/** @var exchange $module */
                        $pages = new selector('pages');
+
public $module;
                        $pages->types('hierarchy-type')->name('catalog', 'object');
+
                        foreach ($pages as $p){
+
public function onExchangeDisactivateElements(iUmiEventPoint $event) {
                            $p->setIsActive(false);
+
if ($event->getMode() === 'after') {
                        }
+
return;
                        self::$flag = true;
+
}
                    }
+
 
                }      
+
$element = $event->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 $page) {
 +
$page->setIsActive(false);
 +
}
 +
 
 +
file_put_contents("onExchangeDisactivateElementsFlag", "done");
 +
}
 +
 
 +
$element->setIsActive(true);
 +
}
 +
 
 +
public function onImportFinishUnsetFlag(iUmiEventPoint $event) {
 +
if (file_exists("onExchangeDisactivateElementsFlag")) {
 +
unlink("onExchangeDisactivateElementsFlag");
 +
}
 +
}
 +
}
  
 
</source>
 
</source>
  
Мы добавили обработчик событий добавления и обновления элемента механизмом импорта, в котором все объекты каталога становятся неактивными, а импортируемые элементы - активными.
+
Мы добавили обработчик событий добавления и обновления элемента механизмом импорта, в котором все объекты каталога становятся неактивными, а импортируемые элементы - активными. Несколько замечаний:
 +
 
 +
# В процессе импорта в корне сайта будет создан файл onExchangeDisactivateElementsFlag. Это значит, что у umi.cms должны быть права на запись этой директории. После завершения импорта файл удалится. Если импорт по каким-то причинам прервется, то нужно будет вручную удалить файл.
 +
# В нашей реализации селектор находит ВСЕ объекты каталога и делает их неактивными. Если у Вас очень много товаров на сайте, этот метод может быть неприемлемым из-за большого потребления оперативной памяти/ресурсов сервера. Если в процессе импорта Вы увидите сообщение "Ошибка разбора данных", это может означать, что сервер не успел деактивировать все объекты. В таком случае Вам нужно будет доработать скрипт, чтобы деактивация происходила поэтапно или каким-либо другим способом.Если Вам потребуется помощь в доработке скрипта, рекомендуем обратиться к нашим [http://www.umi-cms.ru/buy_now/find_webdevs/ партнерам].

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

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

Задача

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

Решение

В директорию \classes\components\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");

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

<?php

	/** Класс пользовательских макросов */
	class ExchangeCustomMacros {

		/** @var exchange $module */
		public $module;
		
		public function onExchangeDisactivateElements(iUmiEventPoint $event) {
			if ($event->getMode() === 'after') {
				return;
			}

			$element = $event->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 $page) {
					$page->setIsActive(false);
				}

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

			$element->setIsActive(true);
		}

		public function onImportFinishUnsetFlag(iUmiEventPoint $event) {
			if (file_exists("onExchangeDisactivateElementsFlag")) {
				unlink("onExchangeDisactivateElementsFlag");
			}
		}
	}

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

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