Обновление объектов созданных вручную данными из 1С
Практически всегда происходит интеграция 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С могут быть заполнены вручную, либо не смотря на трудности описанные в данной статье, данные могут быть импортированы через файл 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, в тот момент когда уже пойдет импорт данных, в системе будет присутствовать необходимое соответствие.