Jump to content

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


Guest vadim
 Share

Recommended Posts

[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

Link to comment
Share on other sites

  • 2 weeks later...
Guest Алексей

День добрый.

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

OC - Version 2.0.3.1 (rs.2)

Давайте докрутим модуль.

Попробую еще ручную выгрузку. отпишу результат.

Link to comment
Share on other sites

Не могу пройти авторизацию

В .htaccess

пропиши правила

RewriteCond %{HTTP:Authorization} ^Basic.*

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

Link to comment
Share on other sites

Guest Алексей

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

Link to comment
Share on other sites

Guest Алексей

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

 

В главном 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;

Link to comment
Share on other sites

Guest Алексей

Почему то при загрузке не создается таблица в SQL

пришлось создать вручную:

$this->db->query('CREATE TABLE `" . DB_PREFIX . "product_to_1c` (`product_id` int(11) , `1c_id` TEXT)');

Link to comment
Share on other sites

Guest Алексей

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

Демо-версия работает нормально.

Link to comment
Share on other sites

Guest Алексей

Для полноты работы, изменим файлы в 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-овцов

Link to comment
Share on other sites

Guest Алексей

Не удается синхронизировать 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');. И получается, что файлы все передались на сервер, а данные в базу данных не были занесены.

Link to comment
Share on other sites

Guest Алексей

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

Для людей, которые занимаются 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);

}

 

 

Link to comment
Share on other sites

  • 2 weeks later...
Guest Алексей

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

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

 

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

Link to comment
Share on other sites

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

У Алексея,двумя постами выше

Link to comment
Share on other sites

  • 3 weeks later...
Guest Алексей
У кого то получилось настроить нормальную синхронизацию???

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

Link to comment
Share on other sites

  • 3 weeks later...
Guest Алексей
А с какой версией 1с работает данный модуль? У меня 8.2

У меня тоже. Работает 100%

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Guest Алексей

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

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

Link to comment
Share on other sites

В общем я разобрался. В скрипте есть косяки, после исправления все выгружается с ценами и количеством. 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

 

 

 

 

Н

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...