Перемещение элементов при импорте их из 1С
В статье Как_переместить_страницу_если_её_раздел_поменялся есть более актуальное решение
В версии UMI.CMS 2.8.1.3 в модуль "Обмен данными" были добавлены "События" на различные действия, допустим на создание и обновление страниц. В системном файле \classes\system\subsystems\import\xmlImporter.php , присутствует метод importElement(), в котором прописано событие:
$oEventPoint = new umiEventPoint("exchangeOnUpdateElement");
$oEventPoint->setMode("after");
$oEventPoint->addRef("element", $element);
$oEventPoint->setParam("element_info", $info);
$oEventPoint->setParam("source_id", $this->source_id);
umiEventsController::getInstance()->callEvent($oEventPoint);
его мы можем использовать для добавления в систему такой функциональности как перемещение объекта каталога в новый раздел (в UMI.CMS), в том случае, если он был перемещен в системе 1С. Для этого зарегистрируем обработчик события, в папке classes/modules/exchange создадим файл custom_events.php со следующим содержанием:
<?php
new umiEventListener("exchangeOnUpdateElement", "exchange", "OnUpdateElementAfter");
?>
В той же папке, в файл __custom.php добавим метод-обработчик события exchangeOnUpdateElement:
public function OnUpdateElementAfter($e) {
if($e->getMode() == "after") {
$element = $e->getRef('element');
if (!$element instanceof umiHierarchyElement) return false;
$hierarchy = umiHierarchy::getInstance();
$element_id = (int) $element->getId();
// DOMElement с одним из элементов (раздел, объект)
$info = $e->getParam('element_info');
// текущий source_id
$source_id = $e->getParam('source_id');
// получаем parent_id из DOMElement
$parent_id_1с = $info->getAttribute('parentId');
// parent_id в UMI.CMS
$umi_parent_id = $hierarchy->getParent($element_id);
$relations = umiImportRelations::getInstance();
// id нового раздела из таблицы базы данных cms3_import_relations, parent_id в UMI.CMS
$new_parent_id = (int) $relations->getNewIdRelation($source_id, $parent_id_1с);
if (!$new_parent_id) return false;
// Проверка на изменение раздела для объекта каталога
if ($umi_parent_id != $new_parent_id && $element->getMethod() == 'object') {
// Перемещение объекта в другой раздел.
$hierarchy->moveBefore($element_id, $new_parent_id);
}
}
}
В итоге, если в 1С элемент номенклатуры был перемещен в другой раздел, то при повторном импорте данных в UMI.CMS, этот объект каталога также переместится в свой новый раздел. Строка $element->getMethod() == 'object' выставляет ограничения на перемещение только объектов каталога, т.е. без перемещения разделов.