Сообщество Вебмастеров

OC 2.x Синхронизация OpenCart 2.0 c 1C

vadim

Administrator
Команда форума
screen_tab3.png
Внимание: Модуль полностью идентичен модулю OpenCart Exchange 1C. Отличие заключается только в том, что он нормально работает с OpenCart 2.0.

Поддержка: OpenCart 2.0.0.x, 2.0.1.x, 2.0.2.x, 2.0.3.x, 2.1.0.x.

Возможности:
  • выгрузка товаров и категорий;
  • загрузка заказов.
Установить:
  • Система -> Настройки -> Редактировать -> FTP. Здесь указываем логин, пароль к ftp и домашнюю директорию.
  • Модули -> Установка расширений. Выбираем наш архив и нажимаем Продолжить.
  • Модули -> Модификаторы. Нажимаем кнопку Обновить
    update.png
    .
Обновить:
  • Модули -> Модификаторы. Выбираем наш модуль и нажимаем кнопку Удалить
    delete.png
    .
    После Обновить
    update.png
    .
  • Модули -> Установка расширений. Выбираем наш архив и нажимаем Продолжить.
  • Модули -> Модификаторы. Нажимаем кнопку Обновить
    update.png
    .
Удалить:
  • Модули -> Модификаторы. Выбираем наш модуль и нажимаем кнопку Удалить
    delete.png
    .
    После Обновить
    update.png
    .
Настройка модуля аналогично модулю синхронизации для OpenCart Exchange 1C.

Демонстрация модуля: http://asamat.com/demo/2.1.0.x/admin/
Логин: demo
Пароль: demo

Примечание: Домашняя директория - это по другому те папки, которые нужно открыть, после того, как вы заходите по ftp клиенту. Например: Я захожу по ftp клиенту и вижу папку public_html и внутри этой папки установлен OpenCart. Тогда в этом случае мы укажем "public_html/".

Скрытое содержимое. Вам нужно войти или зарегистрироваться.
 

Вложения

  • screen_tab3.png
    screen_tab3.png
    59.4 KB · Просмотры: 19

Алексей

Пользователь
Пользователь
День добрый.
Хотел бы уточнить. Установил модуль и тестирую. Не могу пройти авторизацию.
OC - Version 2.0.3.1 (rs.2)
Давайте докрутим модуль.
Попробую еще ручную выгрузку. отпишу результат.
 

Алексей

Пользователь
Пользователь
Порылся в интернете и наткнулся на такую ссылку. Пробуйте. Может Вам поможет она более детально разобраться в процессе синхронизации Вашего сайта с 1С.
 

Алексей

Пользователь
Пользователь
Для тех у кого проблемы с ручной загрузкой:

В главном php.ini изменить параметры на
Код:
magic_quotes_gpc = Off; register_globals = Off; default_charset = UTF-8; memory_limit = 64M; max_execution_time = 18000; upload_max_filesize = 999M; safe_mode = Off; mysql.connect_timeout = 200; session.use_cookies = On; session.use_trans_sid = Off; session.gc_maxlifetime = 12000000; allow_url_fopen = on; ;display_errors = 1; ;error_reporting = E_ALL;
 
Последнее редактирование модератором:

Алексей

Пользователь
Пользователь
Почему то при загрузке не создается таблица в SQL
пришлось создать вручную:
$this->db->query('CREATE TABLE `" . DB_PREFIX . "product_to_1c` (`product_id` int(11) , `1c_id` TEXT)');
 

Алексей

Пользователь
Пользователь
Вот нашел проблему. Ручная синхронизация и автоматическая с 1с не проходит, т.к. сбрасывается загрузка файла. В php.ini все изменено, а файл упорно не идет. Вот морочу голову. Что может быть?
Демо-версия работает нормально.
 

Алексей

Пользователь
Пользователь
Для полноты работы, изменим файлы в drevstroy.org/admin/model/catalog
(жирным, что добавляем)
product.php
public function deleteProduct($product_id) {
........
$this->db->query("DELETE FROM " . DB_PREFIX . "url_alias WHERE query = 'product_id=" . (int)$product_id . "'");
$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_1c WHERE 'product_id=" . (int)$product_id . "'");
........
}

category.php
public function deleteCategory($category_id) {
.......
$this->db->query("DELETE FROM " . DB_PREFIX . "url_alias WHERE query = 'category_id=" . (int)$category_id . "'");
$this->db->query("DELETE FROM " . DB_PREFIX . "category_to_1c WHERE 'category_id=" . (int)$category_id . "'");
.......
}

attribute.php
public function deleteAttribute($attribute_id) {
$this->event->trigger('pre.admin.attribute.delete', $attribute_id);

$this->db->query("DELETE FROM " . DB_PREFIX . "attribute WHERE attribute_id = '" . (int)$attribute_id . "'");
$this->db->query("DELETE FROM " . DB_PREFIX . "attribute_description WHERE attribute_id = '" . (int)$attribute_id . "'");
$this->db->query("DELETE FROM " . DB_PREFIX . "attribute_to_1c WHERE attribute_id = '" . (int)$attribute_id . "'");

$this->event->trigger('post.admin.attribute.delete', $attribute_id);
}
После этого можно спокойно не засорять базу старыми значениями.
Можно создать xml, но это для vqmod-овцов
 
Последнее редактирование модератором:

Алексей

Пользователь
Пользователь
Не удается синхронизировать 1C с сайтом. Запускаю. Пишет 1С, что обмен завершен, а в итоге ничего не происходит. Файл соответственно не скачивает на сервер и не пишет ничего в log. Где может быть ступор? Как проверить?

Добавил логирование в файл с выгрузкой(model/tool/exchange1c.php).

public function errorsLog($log){
$file=DIR_LOGS.'error.log';
$current = file_get_contents($file);
$current.= date("d.m.Y H:m:s")." - ".$log."\n";
file_put_contents($file, $current);
}


$this->errorsLog('Передача параметров для выгрузки файла на сервер!');

В итоге: почему то не срабатывает $this->load->model('tool/exchange1c');. И получается, что файлы все передались на сервер, а данные в базу данных не были занесены.
 
Последнее редактирование:

Алексей

Пользователь
Пользователь
Ошибку нашел.
Для людей, которые занимаются seo.


private function initCategory($category, $parent, $data = array(), $language_id) {

$result = array(
'status' => isset($data['status']) ? $data['status'] : 1
,'top' => isset($data['top']) ? $data['top'] : 1
,'category_store' => isset($data['category_store']) ? $data['category_store'] : array(0)
,'keyword' => isset($data['keyword']) ? $data['keyword'] : ''
,'image' => (isset($category->Картинка)) ? (string)$category->Картинка : ((isset($data['image'])) ? $data['image'] : '')
,'sort_order' => (isset($category->Сортировка)) ? (int)$category->Сортировка : ((isset($data['sort_order'])) ? $data['sort_order'] : 0)
,'column' => 1
);

$result['category_description'] = array(
$language_id => array(
'name' => (isset($data['name'])? $data['name'] : (string)$category->Наименование
,'meta_keyword' => (isset($data['category_description'][$language_id]['meta_keyword'])) ? $data['category_description'][$language_id]['meta_keyword'] : ''
,'meta_description' => (isset($data['category_description'][$language_id]['meta_description'])) ? $data['category_description'][$language_id]['meta_description'] : ''
,'description' => (isset($category->Описание)) ? (string)$category->Описание : ((isset($data['category_description'][$language_id]['description'])) ? $data['category_description'][$language_id]['description'] : '')
,'seo_title' => (isset($data['category_description'][$language_id]['seo_title'])) ? $data['category_description'][$language_id]['seo_title'] : ''
,'seo_h1' => (isset($data['category_description'][$language_id]['seo_h1'])) ? $data['category_description'][$language_id]['seo_h1'] : ''
),
);

$result['category_description'][$language_id]['meta_title'] = (isset($data['category_description'][$language_id]['meta_title'])) ? $data['category_description'][$language_id]['meta_title'] : '';
return $result;
}

private function insertCategory($xml, $parent = 0, $language_id) {

$this->load->model('catalog/category');

foreach ($xml as $category){

if (isset($category->Ид) && isset($category->Наименование) ){
$id = (string)$category->Ид;

$data = array();

$query = $this->db->query('SELECT * FROM `' . DB_PREFIX . 'category_to_1c` WHERE `1c_category_id` = "' . $this->db->escape($id) . '"');

if ($query->num_rows) {
$category_id = (int)$query->row['category_id'];
$data = $this->model_catalog_category->getCategory($category_id);
$data['category_description'] = $this->model_catalog_category->getCategoryDescriptions($category_id);
$data = $this->initCategory($category, $parent, $data, $language_id);
$this->model_catalog_category->editCategory($category_id, $data);
}
else {
$data = $this->initCategory($category, $parent, array(), $language_id);
//$category_id = $this->getCategoryIdByName($data['category_description'][1]['name']) ? $this->getCategoryIdByName($data['category_description'][1]['name']) : $this->model_catalog_category->addCategory($data);
$category_id = $this->model_catalog_category->addCategory($data);
$this->db->query('INSERT INTO `' . DB_PREFIX . 'category_to_1c` SET category_id = ' . (int)$category_id . ', `1c_category_id` = "' . $this->db->escape($id) . '"');
}

$this->CATEGORIES[$id] = $category_id;
}

if (!$query->num_rows) {
//только если тип 'translit'
if ($this->config->get('exchange1c_seo_url') == 2) {
$cat_name = "category-" . $data['parent_id'] . "-" . $data['category_description'][$language_id]['name'];
$this->setSeoURL('category_id', $category_id, $cat_name);
}
}


if ($category->Группы) $this->insertCategory($category->Группы->Группа, $category_id, $language_id);
}

unset($xml);
}
 
Последнее редактирование:

Алексей

Пользователь
Пользователь
Сохраняем ЧПУ у продукта, после выгрузки.
Внести поправку, переместив и изменив блоки.

private function setProduct($product, $language_id) {

if (!$product) return;

// Проверяем, связан ли 1c_id с product_id
$product_id = $this->getProductIdBy1CProductId($product['1c_id']);
$data = $this->initProduct($product, array(), $language_id);

$data['product_description'][$language_id]['name']=str_replace('"', "'", $data['product_description'][$language_id]['name']);

if ($product_id) {
$this->updateAndRebild($data, $product, $product_id, $language_id);
}
else {

if ($this->config->get('exchange1c_dont_use_artsync')) {
$this->load->model('catalog/product');
$product_id = $this->model_catalog_product->addProduct($data);
} else {
// Проверяем, существует ли товар с тем-же артикулом
// Если есть, то обновляем его
$product_id = $this->getProductByModel($data['sku']);

if ($product_id !== false and $data['sku']!='') {
$this->updateProduct($product, $product_id, $language_id);
}
// Если нет, то создаем новый
else {
if ($this->config->get('exchange1c_dont_use_name')) {
$this->load->model('catalog/product');
$product_id = $this->model_catalog_product->addProduct($data);
} else{
$product_id = $this->getProductByName($data['product_description'][$language_id]['name'], $language_id);

if ($product_id !== false){
$this->updateProduct($product, $product_id, $language_id);
}
else{

$this->load->model('catalog/product');
$product_id = $this->model_catalog_product->addProduct($data);
}
}
}
}

// Добавляем линк
if ($product_id){
$this->db->query('INSERT INTO `' . DB_PREFIX . 'product_to_1c` SET product_id = ' . (int)$product_id . ', `1c_id` = "' . $this->db->escape($product['1c_id']) . '"');
}
// Устанавливаем SEO URL
if ($product_id){
//только если тип 'translit'
if ($this->config->get('exchange1c_seo_url') == 2) {
$this->setSeoURL('product_id', $product_id, $product['name']);
}
}

}
}

Изменить строку записи keywords

,'keyword' => (isset($data['keyword'])) ? $data['keyword'] : (isset($product['keyword']) ? $product['keyword']: '')

Если хотите оставить информацию без изменений при синхронизации, то в функции initProduct файла admin/model/tool/exchange1c.php просто поменяйте местами $data и $product.
 

ihos

Пользователь
Пользователь
У кого то получилось настроить нормальную синхронизацию???
 

Shurx

Пользователь
Пользователь
А с какой версией 1с работает данный модуль? У меня 8.2
 
Сверху