Свои поля при обмене данными в OpenCart через Export Import Tool

OpenCart
2 мин. на чтение

Статья будет скучная и не говорите, что я вас не предупреждал. Прекрасное средство обмена данными Export/Import Tool, которое без всякого сомнения входит в ТОП-10 дополнений OpenCart, позволяет также (при небольшой доработке напильником) выгружать и загружать свои поля.

Рассмотрим на примере моего случая. Мне нужно было наладить обмен данными поля main_product. Что делает это поле в нашем случае не существенно, но вот что нужно.

У нас в БД есть в таблице product есть нестандартное поле main_product, которое выгружается из 1С через .xlsx файл и должно попадать в БД через модуль Export/Import Tool:

Это же поле присутствует в Excel выгрузке из 1С.

Осталось самое интересное и простое: правки, которые нужно сделать. Делать их будем в Модели модуля, потому что туда вынесена вся логика обработки. Я так подход не одобряю, потому, что модель вышла очень сложной (более 8 000 строк) и в каком-то смысле процедурной (хотя OpenCart написан с использованием ООП).

Описанные правки проверены для версии модуля Export Import Tool версии 3.7!

Идем в admin/model/tool/export_import.php. Обращаю внимание, что номера строк примерно совпадают. В конце статьи будет ссылка на готовый файлик, чтобы вы могли все проверить.

После:

$location = $this->db->escape($product['location']);
$location = $this->db->escape($product['location']);
$store_ids = $product['store_ids'];
$layout = $product['layout'];
$related_ids = $product['related_ids'];
$subtract = $product['subtract'];
$subtract = ((strtoupper($subtract)=="TRUE") || (strtoupper($subtract)=="YES") || (strtoupper($subtract)=="ENABLED")) ? 1 : 0; $minimum = $product['minimum'];

добавляем:

$main_product = $product['main_product'];

Находим такую строк:

$sql .= "`tax_class_id`,`viewed`,`length`,`width`,`height`,`length_class_id`,`sort_order`,`subtract`,`minimum`) VALUES ";

Изменяем на:

$sql .= "`tax_class_id`,`viewed`,`length`,`width`,`height`,`length_class_id`,`sort_order`,`subtract`,`minimum`,`main_product`) VALUES ";

Строку:

$sql .= "$tax_class_id,$viewed,$length,$width,$height,'$length_class_id','$sort_order','$subtract','$minimum');";

Изменяем на:

$sql .= "$tax_class_id,$viewed,$length,$width,$height,'$length_class_id','$sort_order','$subtract','$minimum','$main_product');";

После:

$sort_order = $this->getCell($data,$i,$j++,'0');
$sort_order = $this->getCell($data,$i,$j++,'0');
$subtract = $this->getCell($data,$i,$j++,'true');
$minimum = $this->getCell($data,$i,$j++,'1');

Добавляем:

$main_product = $this->getCell($data,$i,$j++,'0');

После:

$product['subtract'] = $subtract;
$product['subtract'] = $subtract;
$product['minimum'] = $minimum;

Добавляем:

$product['main_product'] = $main_product;

Строку:

$expected_heading = array_merge( $expected_heading, array( "meta_description", "meta_keywords", "stock_status_id", "store_ids", "layout", "related_ids", "tags", "sort_order", "subtract", "minimum") );

Заменяем на:

$expected_heading = array_merge( $expected_heading, array( "meta_description", "meta_keywords", "stock_status_id", "store_ids", "layout", "related_ids", "tags", "sort_order", "subtract", "minimum", "main_product" ) );

После:

$sql .= "  p.stock_status_id, ";
$sql .= "  p.stock_status_id, ";
$sql .= "  mc.unit AS length_unit, ";
$sql .= "  p.subtract, "; $sql .= "  p.minimum, ";

Добавляем:

$sql .= " p.main_product, ";

И еще немного :) После:

$worksheet->getColumnDimensionByColumn($j++)->setWidth(max(strlen('sort_order'),8)+1);
$worksheet->getColumnDimensionByColumn($j++)->setWidth(max(strlen('sort_order'),8)+1);
$worksheet->getColumnDimensionByColumn($j++)->setWidth(max(strlen('subtract'),5)+1);
$worksheet->getColumnDimensionByColumn($j++)->setWidth(max(strlen('minimum'),8)+1);

Добавляем:

$worksheet->getColumnDimensionByColumn($j++)->setWidth(max(strlen('main_product'),8)+1);

После:

$data[$j++] = 'sort_order';
$data[$j++] = 'sort_order';
$data[$j++] = 'subtract';
$data[$j++] = 'minimum';

Добавляем:

$data[$j++] = 'main_product';

После:

$data[$j++] = $row['sort_order'];
$data[$j++] = $row['sort_order'];
$data[$j++] = ($row['subtract']==0) ? 'false' : 'true';
$data[$j++] = $row['minimum'];

Добавляем:

$data[$j++] = $row['main_product'];

 

Теперь модуль Export Import Tool будет корректно импортировать и экспортировать поле main_product в Excel.

Все конечно же понимают, что если у вас другое поле, просто поменяйте main_product на ваше значение или обратитесь к любому мало-мальски толковому php бекендщику.

Игорь Чишкала

Директор по технологиям в SoftForge.
Люблю ИТ, пишу технические статьи в этом блоге или для сайта фриланс-биржи Upwork. Кодю на PHP с использованием фреймворков Laravel или Symfony.

Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. Сергей

    Здравствуйте.
    Установили модуль «Мультивалютные товары». Модуль экспорта-импорта стоит версии 3.19.
    После колонки price нужно добавить цену в валюте (плюс колонка подбора валюты) и цену поставщика. Оплата Вашего труда гарантируется.

    Ответить
    1. Ihor Chyshkala

      К сожалению, нет сейчас времени :)
      Предлагаю написать в OpenCart чат в Телеграм https://t.me/opencartforumchatru, там скорее найдете исполнителя

      Ответить
  2. Сергей

    Спасибо за инфу.

    Ответить
  3. Макс

    Добрый день! Подскажите, а если нужное поле находится в другой таблице,Допустим не в product, а в address_simple_fields данная инструкция не подойдёт?
    Спасибо

    Ответить
    1. Ihor Chyshkala

      Добрый день!

      Эта инструкция не подойдет, она исключительно под этот модуль. Как выгружать/загружать поля в Simple Checkout, вы можете узнать у автора этого модуля, он никогда в помощи не отказывал (конечно, если вы купили его модуль).

      Ответить
  4. Сергей

    Вопрос не по теме возможно, но буду признателен за помощь) поскольку сам и на форуме не нашел ответа.
    Как изменить лимит экспортируемых товаров, то есть выгрузить одним файлом все 10 тыс, которые есть в базе, а не клеить файлы по 3 тыс для дальнейшей работы с таблицей excel?

    Ответить
  5. Андрей

    Здравствуйте! А подскажите, пожалуйста, как узнать название поля? В вашем случае — это main_product. В частности интересует вывод h1. Для его заполнения и вывода установлен meta_h1 от spectre. Пробовал просто h1 и meta_h1. По инструкции делал абсолютно всё, но дополнительной колонки в выгружаемом файле не появилось. Модификатор работает, вывод что и раньше. Заранее благодарен!

    Ответить
    1. анна

      Присоединяюсь. Колонки для Н1 нет, а если прописать вручную в карточке, после экспорта-импорта Н1 пропадает

      Ответить
  6. Вадим

    Спасибо очень познавательно. Скажите а как добавить свой путь к папке с изображениями например /tovar что бы не прописывать к каждому изображению путь

    Ответить
    1. Ihor Chyshkala

      Здравствуйте! Проще всего сделать это в excel. Если напишите пару примеров ваших путей как сейчас и как должно быть, подскажу как написать формулу. Но повторюсь, это удобнее делать именно в Excel или откуда вы будете выгружать товары в xls.

      Ответить
  7. Вадим

    строка 982
    \admin\model\tool\export_import.php
    $image = ‘catalog/demo/’. $this->db->escape($product[‘image’]);
    Добавить свою папку. Отличный вас материал!!

    Ответить
  8. St@lker

    Друзья, в версии 3.20-3.22

    Строку
    $sql .= «$tax_class_id,$viewed,$length,$width,$height,’$length_class_id’,’$sort_order’,’$subtract’,’$minimum’);»;

    Замените на
    $sql .= «$tax_class_id,$viewed,$length,$width,$height,’$length_class_id’,’$sort_order’,’$subtract’,’$minimum’,’$currency_id’);»;

    Иначе не будет работать импорт!

    Ответить
  9. Volodymyr

    Добрый день. Если нестандартное поле находится в таблице product_description как править? Если данным методом тогда выдает ошибку: Error: Unknown column ‘p.meta_h1’ in ‘field list’
    Error No: 1054
    SELECT p.product_id, GROUP_CONCAT( DISTINCT CAST(pc.category_id AS CHAR(11)) SEPARATOR «,» ) AS categories, p.sku, p.upc, p.ean, p.jan, p.isbn, p.mpn, p.location, p.quantity, p.model, m.name AS manufacturer, p.image AS image_name, p.shipping, p.price, p.points, p.date_added, p.date_modified, p.date_available, p.weight, wc.unit AS weight_unit, p.length, p.width, p.height, p.status, p.tax_class_id, p.sort_order, p.stock_status_id, mc.unit AS length_unit, p.subtract, p.minimum, p.meta_h1, GROUP_CONCAT( DISTINCT CAST(pr.related_id AS CHAR(11)) SEPARATOR «,» ) AS related FROM `eveg_product` p LEFT JOIN `eveg_product_to_category` pc ON p.product_id=pc.product_id LEFT JOIN `eveg_manufacturer` m ON m.manufacturer_id = p.manufacturer_id LEFT JOIN `eveg_weight_class_description` wc ON wc.weight_class_id = p.weight_class_id AND wc.language_id=3 LEFT JOIN `eveg_length_class_description` mc ON mc.length_class_id=p.length_class_id AND mc.language_id=3 LEFT JOIN `eveg_product_related` pr ON pr.product_id=p.product_id WHERE p.product_id BETWEEN 28648 AND 28648 GROUP BY p.product_id ORDER BY p.product_id ;

    Ответить
    1. Ihor Chyshkala

      У вас не корректный SQL запрос. Если поле лежит в таблице product_description, то Вы забыли сделать LEFT JOIN этой таблицы. Кроме того, у вас не правильный алиас поля – p.meta_h1, это значит что интерпретатор запроса будет искать искать это поле в таблицы product, а не product_description.
      Читайте документацю MySQL

      Ответить