Перемещение элементов при импорте их из 1С

Материал из Umicms
Перейти к:навигация, поиск


В статье Как_переместить_страницу_если_её_раздел_поменялся есть более актуальное решение

В версии 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' выставляет ограничения на перемещение только объектов каталога, т.е. без перемещения разделов.