Статья будет скучная и не говорите, что я вас не предупреждал. Прекрасное средство обмена данными 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 бекендщику.
Здравствуйте.
Установили модуль «Мультивалютные товары». Модуль экспорта-импорта стоит версии 3.19.
После колонки price нужно добавить цену в валюте (плюс колонка подбора валюты) и цену поставщика. Оплата Вашего труда гарантируется.
К сожалению, нет сейчас времени :)
Предлагаю написать в OpenCart чат в Телеграм https://t.me/opencartforumchatru, там скорее найдете исполнителя
Спасибо за инфу.
Добрый день! Подскажите, а если нужное поле находится в другой таблице,Допустим не в product, а в address_simple_fields данная инструкция не подойдёт?
Спасибо
Добрый день!
Эта инструкция не подойдет, она исключительно под этот модуль. Как выгружать/загружать поля в Simple Checkout, вы можете узнать у автора этого модуля, он никогда в помощи не отказывал (конечно, если вы купили его модуль).
Вопрос не по теме возможно, но буду признателен за помощь) поскольку сам и на форуме не нашел ответа.
Как изменить лимит экспортируемых товаров, то есть выгрузить одним файлом все 10 тыс, которые есть в базе, а не клеить файлы по 3 тыс для дальнейшей работы с таблицей excel?
Здравствуйте! А подскажите, пожалуйста, как узнать название поля? В вашем случае — это main_product. В частности интересует вывод h1. Для его заполнения и вывода установлен meta_h1 от spectre. Пробовал просто h1 и meta_h1. По инструкции делал абсолютно всё, но дополнительной колонки в выгружаемом файле не появилось. Модификатор работает, вывод что и раньше. Заранее благодарен!
Присоединяюсь. Колонки для Н1 нет, а если прописать вручную в карточке, после экспорта-импорта Н1 пропадает
Спасибо очень познавательно. Скажите а как добавить свой путь к папке с изображениями например /tovar что бы не прописывать к каждому изображению путь
Здравствуйте! Проще всего сделать это в excel. Если напишите пару примеров ваших путей как сейчас и как должно быть, подскажу как написать формулу. Но повторюсь, это удобнее делать именно в Excel или откуда вы будете выгружать товары в xls.
строка 982
\admin\model\tool\export_import.php
$image = ‘catalog/demo/’. $this->db->escape($product[‘image’]);
Добавить свою папку. Отличный вас материал!!
Друзья, в версии 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’);»;
Иначе не будет работать импорт!
Добрый день. Если нестандартное поле находится в таблице 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 ;
У вас не корректный SQL запрос. Если поле лежит в таблице product_description, то Вы забыли сделать LEFT JOIN этой таблицы. Кроме того, у вас не правильный алиас поля – p.meta_h1, это значит что интерпретатор запроса будет искать искать это поле в таблицы product, а не product_description.
Читайте документацю MySQL