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

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

Актуально для версии 2.9.5

Задача

Допустим мы импортировали из 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);
	} 

}