Перейти к содержанию

Синхронизация OpenCart 2.0 c 1C


Гость vadim

Рекомендуемые сообщения

[ATTACH]393._xfImport[/ATTACH]

Внимание: Модуль полностью идентичен модулю 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/".

 

[spoiler=Скачать][HIDE=1]

http://sh.st/bId0u

 

[/HIDE]

screen_tab3.thumb.png.857dc915993b22c4053e71a86c140436.png

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • Ответов 64
  • Создана
  • Последний ответ

День добрый.

Хотел бы уточнить. Установил модуль и тестирую. Не могу пройти авторизацию.

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

(жирным, что добавляем)

[spoiler=Код:]

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).

 

[spoiler=Сама функция]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);

}

 

 

 

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

 

 

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

Ссылка на комментарий
Поделиться на другие сайты

Ошибку нашел.

Для людей, которые занимаются seo.

 

 

[spoiler=Сохраняем имя категории:]

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;

}

 

 

 

[spoiler=И сохраняем url, перенося выделенный код]

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);

}

 

 

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

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

Внести поправку, переместив и изменив блоки.

 

[spoiler=admin/model/tool/exchange1c.php функция setProduct]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']);

}

}

}

}

 

 

[spoiler=admin/model/tool/exchange1c.php функция initProduct]

 

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

 

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

 

 

 

 

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

Ссылка на комментарий
Поделиться на другие сайты

1564 version compatibil?

thanks

 

You can change your Opnecart form 1.5.x to 2.x.x . I find information for you:

 

 

Simulary, you can change any module 2.x.x to 1.5.x opencart version.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...
  • 3 недели спустя...
У кого то получилось настроить нормальную синхронизацию???

Если нужна помощь, пиши мне личные сообщения. Помогу.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Странная штука. Если сливать с 1с с помощью логина и пароля, то товар не появляется, а вручную все работает. Где-то косяк в скрипта есть. Опенкарт 2.0.3.1, а 1с 8.2 Предприятие

Ссылка на комментарий
Поделиться на другие сайты

Если у вас поддомен, то ОдинС передавать инфу туда не будет.

Если у вас есть ограничение в php.ini меньше чем нужно, при передаче файлов - не будет работать.

Ссылка на комментарий
Поделиться на другие сайты

В общем я разобрался. В скрипте есть косяки, после исправления все выгружается с ценами и количеством. 1с 8.2 УТ11 на Opencart 2.0.3.1

 

admin/model/tool/exchange1c.php

 

Строка 1467. $query = $this->db->query("SHOW TABLES FROM ". DB_DATABASE ." LIKE '". DB_PREFIX ."manufacturer_description'");

На

$query = $this->db->query("SHOW TABLES FROM `". DB_DATABASE ."` LIKE '". DB_PREFIX ."manufacturer_description'");

Строка 1015. if($product_id !==falseand $data['sky']!=''){

На

if($product_id !==falseand $data['sku']!=''){

 

Строка 272. if(!$config_price_type_main['keyword']){

На

if(!isset($config_price_type_main['keyword'])){

 

Найти и заменить:

все seo_h1 на meta_h1

все seo_title на meta_title

 

 

 

 

Н

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...