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

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «'''Актуально для версии 2.9.5''' == Задача == Допустим мы импортировали из 1С товар с одним типом…»)
 
Строка 6: Строка 6:
 
Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя, так как специально была дана возможность иметь независимую иерархию
 
Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя, так как специально была дана возможность иметь независимую иерархию
 
каталогов в UMI.CMS и 1С. Но эту логику можно поменять, необходимо написать обработчик события exchangeOnUpdateElement, пример оного дан ниже.  
 
каталогов в UMI.CMS и 1С. Но эту логику можно поменять, необходимо написать обработчик события exchangeOnUpdateElement, пример оного дан ниже.  
 +
 +
== Решение ==
 +
 +
Создаем в директории /classes/modules/catalog/ файл custom_events.php следующего содержания:
 +
 +
<source lang="php">
 +
<?php
 +
new umiEventListener("exchangeOnUpdateElement", "catalog", "onCatalogObjectImportUpdate");
 +
?>
 +
</source>
 +
 +
и добавляем в файл /classes/modules/catalog/__custom_adm.php следующий метод:
 +
 +
<source lang="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);
 +
}
 +
 +
}
 +
</source>
 
  [[category:Интеграция с 1С]]
 
  [[category:Интеграция с 1С]]

Версия 14:00, 4 апреля 2014

Актуально для версии 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);
	} 

}