Свои поля при обмене данными в 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.
Оцените автора
Авторский блог Игоря Чишкалы
Добавить комментарий для St@lker Отменить ответ

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

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

    Ответить