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

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

Статья будет скучная и не говорите, что я вас не предупреждал. Прекрасное средство обмена данными 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.
Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий для Igor Chishkala Отменить ответ

Этот сайт использует 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’);”;

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

    Ответить