Как сделать активными только импортируемые товары — различия между версиями
Материал из Umicms
Stexe (обсуждение | вклад) (Новая страница: « category:Модуль Обмен данными '''Задача''': Сделать активными только импортируемые товары, в…») |
Aposio (обсуждение | вклад) |
||
(не показано 8 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
− | + | [[category:Модуль Обмен данными]][[Категория:Написание кастомных макросов]][[category:Интеграция с 1С]] | |
+ | '''Актуально для версии 20''' | ||
+ | |||
+ | == Задача == | ||
+ | |||
+ | Сделать активными только импортируемые товары, все остальные товары в каталоге должны стать неактивными. | ||
+ | |||
+ | == Решение == | ||
+ | |||
+ | В директорию \classes\components\exchange\ нужно добавить файл custom_events.php со следующим содержанием: | ||
− | |||
− | |||
<source lang="php"> | <source lang="php"> | ||
<?php | <?php | ||
− | + | new umiEventListener("exchangeOnAddElement", "exchange", "onExchangeDisactivateElements"); | |
− | + | new umiEventListener("exchangeOnUpdateElement", "exchange", "onExchangeDisactivateElements"); | |
− | + | new umiEventListener("exchangeOnImportFinish", "exchange", "onImportFinishUnsetFlag"); | |
+ | new umiEventListener("exchangeOnAutoFinish", "exchange", "onImportFinishUnsetFlag"); | ||
</source> | </source> | ||
− | В этой же директории в файл | + | В этой же директории в файл customMacros.php нужно добавить следующий код: |
+ | |||
<source lang="php"> | <source lang="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"); | ||
+ | } | ||
+ | } | ||
+ | } | ||
</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");
}
}
}
Мы добавили обработчик событий добавления и обновления элемента механизмом импорта, в котором все объекты каталога становятся неактивными, а импортируемые элементы - активными. Несколько замечаний:
- В процессе импорта в корне сайта будет создан файл onExchangeDisactivateElementsFlag. Это значит, что у umi.cms должны быть права на запись этой директории. После завершения импорта файл удалится. Если импорт по каким-то причинам прервется, то нужно будет вручную удалить файл.
- В нашей реализации селектор находит ВСЕ объекты каталога и делает их неактивными. Если у Вас очень много товаров на сайте, этот метод может быть неприемлемым из-за большого потребления оперативной памяти/ресурсов сервера. Если в процессе импорта Вы увидите сообщение "Ошибка разбора данных", это может означать, что сервер не успел деактивировать все объекты. В таком случае Вам нужно будет доработать скрипт, чтобы деактивация происходила поэтапно или каким-либо другим способом.Если Вам потребуется помощь в доработке скрипта, рекомендуем обратиться к нашим партнерам.