Кей для синхронизации двух магазинов с помощью модуля UniXML.

Для того чтобы синхронизировать два магазина нам надо установить модуль UniXML на оба. 

Далее на доноре нам надо настроить выгрузку для сайта приемника (акцептора). Рекомендуется создать новый фид и взять структуру выгрузки rozetka. 

настраиваем все данные. Изначально заменяем все данные для нового сайта, например название сайта или любая принадлежность до донора меняется на сайт акцептора. Задача настроить выходные данные чтобы они были подготовлены под импорт товара. 

В пункте 3.12 добавляем дополнительные данные для переноса, например: <sku> <meta_h1> <meta_title> <meta_description> <meta_keyword> <stock_status_id> и другие данные которые нужно синхронизировать. 

Если вам надо передавать все категории товара в пункте 4.3 делаем добавление их в фид

$category_query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product['product_original_id'] . "' ORDER BY main_category ASC");
foreach($category_query->rows as $cat){
    $product['attributes_full'][] = array(
    'name' => 'categoryId',
    'text' => $cat['category_id'],
    'end' => 'categoryId'
    );
}

Если вам надо добавить и группы атрибутов в пункте 4.2 ставим

$data['attributes_with_group'] = true;

Если у вам надо передать опции и желательно в оригинале тогда в пункте 4.3 добавляем

foreach($product['option_data'] as $option_value_id => $option_value_data){}
$oquery = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value WHERE product_id = " . $product['product_original_id'] . " AND option_value_id = " . $option_value_id);
$product['price'] = $oquery->row['price'];
$product['attributes_full'][] = array(
  'name' => 'price_prefix',
  'text' => $oquery->row['price_prefix'],
  'end' => 'price_prefix',
);
$product['attributes_full'][] = array(
  'name' => 'option_weight',
  'text' => $oquery->row['weight'],
  'end' => 'option_weight',
);
$product['attributes_full'][] = array(
  'name' => 'is_default',
  'text' => $oquery->row['is_default'],
  'end' => 'is_default',
);
$product['attributes_full'][] = array(
  'name' => 'quantity_original',
  'text' => $product['quantity_original'],
  'end' => 'quantity_original',
);
$product['attributes_full'][] = array(
  'name' => 'price_original',
  'text' => $product['price_original'],
  'end' => 'price_original',
);

После этого у нас в фиде будут идти опции 1в1 как на доноре. 

Если категории на акцепторе отличаются от донора тогда в пункте 3.7 делаем нужные соответствия категорий. 

Если надо на двух и более языках сделать синхронизацию тогда после всех настроек делаем копию фида и выбираем соответствующий язык. 


После того как все настроено на доноре переходим на акцептор. 

Добавляем импорт - ставим первую главную ссылку и добавляем для других языков. Делаем настройки для всех данных - какие теги за что отвечают. Посмотреть их можно в сформированном фиде с донора. 

В пункте Дополнительные данные с фида в любые поля делает соответствующие приставки что куда грузим. 

Если вам надо передавать в оригинале ЧПУ товаров (заранее подготовьте их в фиде с донора) и в пункте Кастомный код до импорта поставьте

$data['custom_url'] = 'url';

также в пункте ниже поставьте

$product['url'] = (string)$row->url;

Если у вас идет передача атрибутов с учетом групп в пункте Кастомный код при обходе товара добавьте

$product['attributes'] = array();
foreach($row->param as $param){
  $attr_data = $this->importGetXmlDataAttribute($param);
  $product['attributes'][] = array(
    'name' => $attr_data['name'],
    'value' => (string)$param,
    'group' => $attr_data['group'],
  );
}

Если вам надо загружать в количество товара оригинальное количество а не сумму опций в пункте Кастомный код до импорта поставьте

$data['quantity_original'] = true;

Если вы загружаете опции в оригинале или же дополнительные поля для опций в пункте Кастомный код до импорта поставьте

$data['option_data'] = array(
  'price_prefix' => 'price_prefix',
  'price' => 'price',
  'quantity' => 'quantity_in_stock',
  'weight' => 'option_weight',
  'is_default' => 'is_default'
);

Если вам надо обновлять стикеры от шаблона octemtlates в этом же пункте добавьте

$data['oct_stickers'] = '';
if((string)$row->oct_stickers){
  $data['oct_stickers'] = unserialize((string)$row->oct_stickers);
  $data['oct_stickers'] = $this->db->escape(serialize($data['oct_stickers']));
}
$this->db->query("UPDATE " . DB_PREFIX . "product SET oct_stickers = '" . $data['oct_stickers'] . "' WHERE product_id = '" . (int)$product['product_id'] . "'");

Если вам надо в импортируемых товарах поставить какой-то id статуса товара когда у него нет остатка в пункте Кастомный код при обходе товара поставьте

$product['stock_status_id'] = 10;
$data['fields_p']['stock_status_id'] = 'stock_status_id';

Если нужно загрузить минимальное количество товара с текста из тега sales_notes в пункте Кастомный код при обходе товара 

$product['upc'] = preg_replace("/[^0-9]/", '', $row->sales_notes);
if(!$product['upc']){
$product['upc'] = 1;
}
$data['fields_p']['upc'] = 'upc';

Пунктом ниже добавьте

$this->db->query("UPDATE " . DB_PREFIX . "product SET minimum = upc");
$this->db->query("UPDATE " . DB_PREFIX . "product SET upc = ''");

Если вам надо загрузить идентификаторы offer в поле location в пункте Кастомный код при обходе товара добавьте

$product['location'] = $product['link_xml'];
$data['fields_p']['location'] = 'location';

Ниже код в пункте Кастомный код при обходе товара добавляет опции знак = и оригинал цены в опцию а также в кастомное поле location таблицы product_option_value добавляет offer id

$data['option_data'] = array(
  'location' => $product['link_xml'],
  'prefix' => '=',
  'price' => (string)$row->price,
);

Если после импорта надо например полю sku задать значение id товара - id импорта можно в пункте Кастомный код после импорта добавить

$this->db->query("UPDATE " . DB_PREFIX . "product SET model = CONCAT(product_id, '-', unixml_feed) WHERE unixml_feed = '" . $data['import_id'] . "'");

Еще заметки как привязать фото к опции если стоит модуль фото опций с таблицей в базе poip_option_image

В фиде донора выводим фото в тег image_option и название опции в тег color_option

Далее в импорте в пункте Кастомный код до импорта добавляем

$data['images_o'] = array();

В кастомный код при обходе товара

$product['url'] = (string)$row->url;
$product['stock_status_id'] = 5;
$data['fields_p']['stock_status_id'] = 'stock_status_id';
$group_id = $this->importGetXmlData($row, $data['unixml_import_xml_product_options']);
$id_for_option = $product['product_xml_id'];
if(isset($data['group'][$group_id])){
  $id_for_option = $data['group'][$group_id]['product_xml_id'];
}
$data['images_o'][$id_for_option][(string)$row->color_option] = (string)$row->image_option;

В кастомный код после импорта

foreach($data['images_o'] as $xml_id => $options){
  if(isset($data['products'][$xml_id])){
    $product_id = $data['products'][$xml_id];
    $option_id = 2;
    foreach($options as $option_value => $option_image){
      if(isset($data['option_oc']['Колір']['values'][$option_value])){
        $option_value_id = $data['option_oc']['Колір']['values'][$option_value];
        
        $image_query = $this->db->query("SELECT oc FROM " . DB_PREFIX . "unixml_import_image WHERE product_id = '" . (int)$product_id . "' AND image = '" . $this->db->escape($option_image) . "'");
        $q = $this->db->query("SELECT product_option_id, product_option_value_id FROM " . DB_PREFIX . "product_option_value WHERE option_value_id = '" . $option_value_id . "' AND option_id = '" . $option_id . "' AND product_id = '" . (int)$product_id . "'");
        if($q->num_rows){
          $sql = "DELETE FROM " . DB_PREFIX . "poip_option_image 
                  WHERE product_option_id = '" . $q->row['product_option_id'] . "' 
                  AND product_option_value_id = '" . $q->row['product_option_value_id'] . "' 
                  AND product_id = '" . (int)$product_id . "'";
                  $qd = $this->db->query($sql);
          if($image_query->num_rows && $image_query->row['oc']){
            $image_option_db = $image_query->row['oc'];
          }else{ //if not photo in DB
            $image_option_db = 'catalog/unixml/49/' . $product_id . '/oi_' . $product_id . '_' . $option_value_id . '.' . $this->getImageExtension($option_image);
            $image_data = array(
              'image' => $option_image,
              'name' => $image_option_db,
            );
            if(is_file(DIR_IMAGE . $image_option_db)){
              unlink(DIR_IMAGE . $image_option_db);
            }
            $this->importDownloadImage($data, $image_data, $product_id);
          }
          $sql = "INSERT INTO " . DB_PREFIX . "poip_option_image 
                  SET image = '" . $image_option_db . "' 
                  , product_option_id = '" . $q->row['product_option_id'] . "' 
                  , product_option_value_id = '" . $q->row['product_option_value_id'] . "' 
                  , product_id = '" . (int)$product_id . "'";
                  $qd = $this->db->query($sql);
        }
      }
    }
  }
}
×
Информация только для UniXML 7.x
Модуль не работает в рф и работать не будет

Разработчик модуля - Прут Николай.

Работаю с opencart c 2010 года.

Создал успешные модули UniXML Pro, MicrodataPro, Easyphoto, Редиректор 301 и другие.

Авторское право на модуль UniXML и информацию на этом сайте принадлежит Прут Николаю.

Копирование материала или использования нелицензионного модуля запрещено.