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

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
[[category:Модуль Обмен данными]][[Категория:Написание кастомных макросов]]
+
[[category:Модуль Обмен данными]][[Категория:Написание кастомных макросов]][[category:Интеграция с 1С]]
'''Актуально для версии 2.11'''
+
'''Актуально для версии 14'''
  
 
'''Задача''': Сделать активными только импортируемые товары, все остальные товары в каталоге должны стать неактивными.<br/><br/>
 
'''Задача''': Сделать активными только импортируемые товары, все остальные товары в каталоге должны стать неактивными.<br/><br/>

Версия 07:12, 13 июля 2016

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

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

Реализация: В директорию \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 должны быть права на запись этой директории. После завершения импорта файл удалится. Если импорт по каким-то причинам прервется, то нужно будет вручную удалить файл.
  • В нашей реализации селектор находит ВСЕ объекты каталога и делает их неактивными. Если у Вас очень много товаров на сайте, этот метод может быть неприемлемым из-за большого потребления оперативной памяти/ресурсов сервера. Если в процессе импорта Вы увидите сообщение "Ошибка разбора данных", это может означать, что сервер не успел деактивировать все объекты. В таком случае Вам нужно будет доработать скрипт, чтобы деактивация происходила поэтапно или каким-либо другим способом.Если Вам потребуется помощь в доработке скрипта, рекомендуем обратиться к нашим партнерам: