Импорт объектов каталога сразу в несколько разделов
В некоторых системах 1С, номенклатурная позиция привязывается сразу к нескольким группам, а в файле import.xml, в узле Товар это будет представлено следующим образом:
<Группы>
<Ид>0000390133</Ид>
<Ид>0000390115</Ид>
<Ид>0000490133</Ид>
<Ид>0000490115</Ид>
<Ид>0001090133</Ид>
<Ид>0001090115</Ид>
</Группы>
В стандартных средствах системы, такой редкий функционал не поддерживается, но его можно реализовать кастоным образом. Чтобы решить данную задачу, необходимо настроить XSL-шаблон импорта: \xsl\import\custom\commerceML2.xsl и добавить дополнительный php-метод. Из оригинального файла \xsl\import\commerceML2.xsl, скопируем блок:
<xsl:template match="Товары/Товар">
...
</xsl:template>
в файл \xsl\import\custom\commerceML2.xsl. После строки:
<page id="{Ид}" parentId="{$group_id}" type-id="{$group_id}">
добавим строки:
<groups>
<xsl:apply-templates select="Группы/Ид" mode="groups" />
</groups>
Также, после шаблона "Товары/Товар", добавим еще один:
<xsl:template match="Ид" mode="groups" >
<id><xsl:value-of select="." /></id>
</xsl:template>
Данные действия необходимы, чтобы в UmiDump'e, в узле page присутствовал блок groups,
который мы обработаем в кастомном макросе.
Теперь в папку \classes\modules\exchange\ добавим файл custom_events.php следующего содержания:
<?php
new umiEventListener("exchangeOnUpdateElement", "exchange", "addVirtualCopy");
new umiEventListener("exchangeOnAddElement", "exchange", "addVirtualCopy");
?>
А в файл __custom.php, после слов //TODO: Write here your own macroses, добавим методы addVirtualCopy и isVirtualCopy:
public function addVirtualCopy($e) {
if($e->getMode() == "after") {
$hierarchy = umiHierarchy::getInstance();
$element = $e->getRef('element');
if (!$element instanceof umiHierarchyElement || $element->getMethod() != 'object') return false;
$object_id = $element->objectId;
$element_info = $e->getParam('element_info');
$source_id = $e->getParam('source_id');
$nl = $element_info->getElementsByTagName('groups');
$nodGroups = $nl->length ? $nl->item(0) : null;
if($nodGroups){
$nl_id_groups = $nodGroups->getElementsByTagName('id');
foreach($nl_id_groups as $key => $item){
$commercML_id = $item->nodeValue;
if($key == 0) continue;
$parent_id = umiImportRelations::getInstance()->getNewIdRelation($source_id, $commercML_id);
if(!$this->isVirtualCopy($object_id, $parent_id)){
$hierarchy->copyElement($element->id, $parent_id);
}
}
}
}
}
public function isVirtualCopy($object_id, $parent_id) {
$sql = "SELECT count(id) FROM `cms3_hierarchy` WHERE `rel` ='$parent_id' AND `obj_id` ='{$object_id}'";
$result = l_mysql_query($sql);
list($count) = mysql_fetch_row($result);
return (boolean) $count;
}
В результате выполнения всех описанных выше действий, при импорте xml-данных в формате
CommerceML 2.0, в дополнительных разделах будут созданы Виртуальные копии товаров.