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