Как переместить страницу если её раздел поменялся
Актуально для версии 2.9.6
Задача
Допустим мы импортировали из 1С товар с одним типом данных и разделом, а потом мы импортируем тот же товар, но у него ид типа, а значит и раздел другой. Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя, так как специально была дана возможность иметь независимую иерархию каталогов в UMI.CMS и 1С. Но эту логику можно поменять, необходимо написать обработчик события exchangeOnUpdateElement, пример оного дан ниже.
Решение
Создаем в директории /classes/modules/catalog/ файл custom_events.php следующего содержания:
<?php
new umiEventListener("exchangeOnUpdateElement", "catalog", "onCatalogObjectImportUpdate");
?>
и добавляем в файл /classes/modules/catalog/__custom_adm.php следующий метод:
public function onCatalogObjectImportUpdate(iUmiEventPoint $eventPoint) {
if ($eventPoint->getMode() !== 'before') {
return;
}
$element = $eventPoint->getRef('element');
if ($element->getHierarchyType()->getMethod() !== 'object' || $element->getHierarchyType()->getModule() !== 'catalog') {
return;
}
$elementInfo = $eventPoint->getParam('element_info');
$relations = umiImportRelations::getInstance();
$object = $element->getObject();
$commerceMLTypeId = $elementInfo->getAttribute('type-id');
$umiCurrentTypeId = $object->getTypeId();
$sourceId = $relations->getSourceId('commerceML2');
$umiNewTypeId = $relations->getNewTypeIdRelation($sourceId, $commerceMLTypeId);
if ($umiNewTypeId && $umiCurrentTypeId == $umiNewTypeId) {
$object->setTypeId($umiNewTypeId);
$object->commit();
}
$umiCurrentParentId = $element->getParentId();
$umiNewParentId = $relations->getNewIdRelation($sourceId, $commerceMLTypeId);
if ($umiNewParentId && $umiNewParentId != $umiCurrentParentId) {
$element->setRel($umiNewParentId);
$element->commit();
umiHierarchy::getInstance()->rebuildRelationNodes($umiNewParentId);
}
}
После этого товары будут менять раздел, если он поменялся в 1С. В обработчике задействован Класс_umiImportRelations.