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