Обновление объектов созданных вручную данными из 1С
Материал из Umicms
Практически всегда происходит интеграция UMI и 1С со стороны 1С, т.е. данные выгружаются из 1С, после чего автоматически создаются объекты каталога и разделы. При повторной выгрузке данных, все объекты и разделы обновляются, UMI.CMS находит нужный объект для обновления, благодаря сохраненным соответствиям в Базе данных. В базе данных присутствует таблица cms3_import_sources, в ней перечислен список источников данных, в том числе commerceML2. Если id для commerceML2 = 3, то в таблице cms3_import_relations будут присутствовать соответствия для данного источника данных, т.е. source_id будет = 3, а на месте old_id будет Ид номенклатурной позиции в 1С, а new_id будет равняться page_id страницы в UMI.CMS. При импорте данных система из источника данных commerceML2 и для определенного Ид, к примеру dee6e16d-55bc-11d9-848a-00112f43529a в столбце old_id, будет искать new_id. Если соответствие будет найдено, то объект с найденным new_id будет обновлен.
Если все объекты каталога в UMI.CMS создавались вручную, а потом возникла необходимость подключить интеграцию с 1С, то чтобы цены обновлялись по данным из 1С, не хватает соответствий в базе данных, по которым UMI.CMS могла бы определить какой объект обновлять. Данные в 1С могут быть заполнены вручную, либо не смотря на трудности описанные в данной статье Импорт товаров в систему 1С, данные могут быть импортированы через файл CommerceML2.0, созданный в UMI через модуль "Обмен данными". Необходимые соответствия можно добавить вручную с помощью кода:
<?php header("Content-type: text/html; charset=utf-8"); include "standalone.php"; $relation = umiImportRelations::getInstance(); $source_id = $relation->getSourceId('commerceML2'); if(!$source_id) $source_id = $relation->addNewSource('commerceML2'); $old_id = trim(getRequest('old_id')); $new_id = trim(getRequest('new_id')); if($new_id){ $is_exists = umiHierarchy::getInstance()->isExists($new_id); if(!$is_exists) echo 'Страницы с id = ' . $new_id . ' не существует в системе;'; } if($source_id && $old_id && $is_exists){ $relation->setIdRelation($source_id, $old_id, $new_id); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ImportRelation </title> </head> <body> <form method="post" action = ""> <table> <tr><td>Id страницы в 1С:</td><td> <input type = "text" name = "old_id" style="width:350px;"></td> </tr> <tr><td>Id страницы в UMI:</td><td> <input type = "text" name = "new_id" style="width:350px;"></td> </tr> </table> <input type="submit" value="Добавить соответствие" /> </form> </body> </html>
в корне сайта необходимо создать php-файл, с указанным выше содержимым и запустить. С помощью формы указывается Ид 1С и page_id UMI.CMS, для добавления соответствия.
Также возможен вариант автоматического добавления соответствий, если каждый объект каталога имеет уникальное название и в 1С объект имеет такое же название. Для добавления данного функционала, добавим в файл classes/modules/custom.php новый метод:
public function set_relation($old_id = false, $name = false) { if(!$old_id || !$name) return; $old_id = htmlspecialchars($old_id); $name = htmlspecialchars($name); // поиск объекта с указанным name $sql_new_id = "SELECT id FROM `cms3_hierarchy` WHERE `obj_id` = (SELECT id FROM `cms3_objects` WHERE `name` = '{$name}' LIMIT 1) LIMIT 1"; $result = l_mysql_query($sql_new_id); list($new_id) = mysql_fetch_row($result); if(!$new_id) return; $relation = umiImportRelations::getInstance(); $source_id = $relation->getSourceId('commerceML2'); $new_id_test = $relation->getNewIdRelation($source_id, $old_id); // записываем соответсвие в таблице БД: cms3_import_relations if($source_id && !$new_id_test) $relation->setIdRelation($source_id, $old_id, $new_id); }
Далее необходимо из файла \xsl\import\commerceML2.xsl скопировать шаблон:
<xsl:template match="Товары/Товар"> ... </xsl:template>
в файл \xsl\import\custom\commerceML2.xsl.
Далее, перед строкой:
<page id="{Ид}" parentId="{$group_id}" type-id="{$group_id}">
необходимо поставить вызов:
<xsl:value-of select="document(concat('udata://custom/set_relation/', Ид, '/', php:function('urlencode', string($name)) ))" />
это вызов кастомного метода set_relation, который по имени объекта найдет его в UMI и проставит соответствие для переданного Ид (1С). Благодаря методу set_relation, в тот момент когда уже пойдет импорт данных, в системе будет присутствовать необходимое соответствие.
