Как переместить страницу если её раздел поменялся — различия между версиями
Mad grant (обсуждение | вклад) (Новая страница: «'''Актуально для версии 2.9.5''' == Задача == Допустим мы импортировали из 1С товар с одним типом…») |
Mad grant (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | '''Актуально для версии 2.9. | + | '''Актуально для версии 2.9.6''' |
== Задача == | == Задача == | ||
Строка 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> | ||
+ | |||
+ | После этого товары будут менять раздел, если он поменялся в 1С. В обработчике задействован [[Класс_umiImportRelations]]. | ||
[[category:Интеграция с 1С]] | [[category:Интеграция с 1С]] |
Текущая версия на 15:01, 7 апреля 2014
Актуально для версии 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.