Jump to content
Sign in to follow this  
a13x3y

Модуль импорта товаров Iris Import 1.0

Recommended Posts

Приветствую господа. Представляю свой взгляд на импорт товаров под опенкарт. Из-за нехватки времени, на скорую руку накидал модуль импорта товаров, вероятно где-то будут ошибки, но в целом модуль проверил и всё работает. Теперь по сути, чем же мой велосипед отличается от 100 других велосипедов. Первое с чем мне пришлось столкнуться когда я создавал сайты на опенкарт для людей, особо не понимающих в опенкарт так это то, что создание карточки товара ооочень трудоёмкий процесс, надо по каждой вкладке тыкать, каждую фотку подгружать (указывать урл), прописывать seo и так далее. Ладно я, я знаю как это делается, а люди которые далеки от этого, как им быть? Вот собственно и решено было создать небольшой импорт товаров, чтобы он был понятен и прост.
Итак, подробнее:

Скрипт затрагивает такие данные товара как:
Название - название товара, тип данных: строка, обязательный параметр
Артикул - модель товара, он же артикул, тип данных: строка, обязательный параметр, для каждого товара должен быть уникальным
Цена - цена товара, тип данных: числовой
Наценка - наценка на товар в %-ах, будет добавлено к цене, тип данных: числовой
Количество - количество товара, тип данных: числовой
Бренд - производитель товара, тип данных: строка
Описание - описание для товара, тип данных: текст
Характеристики - хар-ки товара, тип данных: текст. Хар-ки разделяются переносом строки, названия двоеточием, а значения запятой
Изображения - фото для товара, тип данных: строчный. Разделяются переносом строки. Первая строка - фото в карточке товара
Атрибуты - атрибуты товара, тип данных: текст. Атрибуты разделяются переносом строки, названия и значения двоеточием
Категория - категория товара, тип данных: строка
Подкатегория - подкатегория товара, тип данных: строка
SEO урл - seo урл товара, тип данных: строка на англ., для каждого товара должен быть уникальным
Meta Keyword - метаданные для тега <meta keyword>, тип данных: строка
Meta Description - метаданные для тега <meta description>, тип данных: строка

Специфика работы скрипта:
Ячейки в демонстрационном файле помеченные звездочкой, обязательны для заполнения
Пустые ячейки с "названием" и "моделью" буду пропущены при импорте
Если бернд не найден в базе, то он будет создан автоматически
При автоматическом создании бренда формируется и SEO урл из его транслитного названия с приставкой "brand-"
Если поле для бернда пустое, то автоматически добавится бренд "NA"
Если атрибут или характеристика товара не найдена, то она будет создана автоматически
Все значения атрибутов и характеристик, при импорте, проверяются на повторы
Все импортируемые изображения товаров должны хранится в папке /tmp/images/
Максимальное кол-во изображений для одного товара = 10
Первое изображение будет в карточке товара, остальные дополнительные.
Если категория не найдена в базе, то она будет создана автоматически

Описание настроек скрипта:
Автоматически формировать поле "SEO урл"
Независимо от того заполнено у вас это поле или нет, скрипт сам создаст SEO урл из названия товара и переведет это название в транслит

Переименовать фото по артикулу
При копировании переименует оригинальные названия фото товара в вид "артикул.jpg","артикул_1.jpg", "артикул_2.jpg" и тд

Каталог для изображений
Папка, в которую скопируются фото ваших товаров. Будет находиться по адресу /image/data/imported/

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

Пишите о всех глюках и недостатках, буду стараться оперативно исправлять.

iris_import_opencart1.5_10.zip

post-701649-0-89004400-1444299591_thumb.png

Share this post


Link to post
Share on other sites

Notice: Undefined variable: exfile in ...admin\controller\module\updater.php on line 44

Notice: Undefined variable: exfile in ...\admin\controller\module\updater.php on line 45

Notice: Undefined variable: exfile in ...\admin\controller\module\updater.php on line 46

Notice: Undefined variable: exfile in ...\admin\controller\module\updater.php on line 47

Notice: Undefined index: import in ...admin\controller\module\updater.php on line 54

Share this post


Link to post
Share on other sites

после выбора и закачки тестового файла test.xlsx в поле выбора файла отображается фреймом главная страница админки, новый товар не добавился и сбросился токен сессии

e7293-clip-79kb.png?nocache=1

Share this post


Link to post
Share on other sites

В коде не увидел добавление главного рисунка + синтаксис... есть стандарты кодинга под опен, ну почему каждый новый разраб, старается по своему уставу код писать... как поддержка будет ? + если пользователь эксперементирует и у них товара не 300-800 скю, а несколько десятков К, и вы своим модулем с неотлаженными запросами что сделаете ?? правильно, грохнете нахер всю базу, и теперь у юзера - 2-ве большие проблемы:

1. Как откатить с бекапа (если хост поддерживает)

2. Как отладить...

Вы хоть напишите, что БЕКАП надо делать перед импортом, БЕКАП КАРЛ !!!

 

P.S. Логика интересна, но довести до ума и будет спрос.

Share this post


Link to post
Share on other sites

после выбора и закачки тестового файла test.xlsx в поле выбора файла отображается фреймом главная страница админки, новый товар не добавился и сбросился токен сессии

хммм..интересно, напишите версию опенкарта.

 

 

Notice: Undefined variable: exfile in ...admin\controller\module\updater.php on line 44

Notice: Undefined variable: exfile in ...\admin\controller\module\updater.php on line 45

Notice: Undefined variable: exfile in ...\admin\controller\module\updater.php on line 46

Notice: Undefined variable: exfile in ...\admin\controller\module\updater.php on line 47

Notice: Undefined index: import in ...admin\controller\module\updater.php on line 54

поправлю, просто отображение notice'ов не установлено, только варнинги.

 

 

В коде не увидел добавление главного рисунка + синтаксис... есть стандарты кодинга под опен, ну почему каждый новый разраб, старается по своему уставу код писать... как поддержка будет ? + если пользователь эксперементирует и у них товара не 300-800 скю, а несколько десятков К, и вы своим модулем с неотлаженными запросами что сделаете ?? правильно, грохнете нахер всю базу, и теперь у юзера - 2-ве большие проблемы:

1. Как откатить с бекапа (если хост поддерживает)

2. Как отладить...

Вы хоть напишите, что БЕКАП надо делать перед импортом, БЕКАП КАРЛ !!!

 

P.S. Логика интересна, но довести до ума и будет спрос.

что значит главного рисунка? если речь о фотокарточке товара, то при запросе он прописывается, так же как и доп. фотки.

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

по поводу неотлаженных запросов, что по вашему значит "неотлаженный"?  Запрос или есть и он работает, или он не работает. Да, возможно на несколько десятков тысяч товаров всё повесится на стадии формирования массива с опциями и атрибутами т.к. памяти нехватит.

И зачем делать перед импортом бекап? Нет можно и с бубном плясать, только что это изменит? Бекап должен быть настроен на автомат каждый день по крону, поэтому я даже не заморачиваюсь с этим как то.

Share this post


Link to post
Share on other sites

Подскажите, как тут свой пост можно редактировать?

2 Shkip: вероятная проблема найдена, в файле-шаблоне updater.tpl, заменить 4-ую строку

с
<script>var link = '<?=$_SERVER["REQUEST_URI"];?>';</script>
на
<script>var link = '<?php echo $_SERVER["REQUEST_URI"];?>';</script>

либо в php.ini (если проблема была в этом) включить short_open_tag = On

это значительно упрощает написание кода

Share this post


Link to post
Share on other sites

версия с исправленными ошибками и уведомлениями.

https://yadi.sk/d/lYnhFnT5jaDsr

 

p.s. модуль в первую очередь предназначен на упрощенное добавление товаров в базу т.е. когда человек заполняет EXCEL файл по стандарту, а потом просто импортирует его. О десятках тысячах товаров речи пока не идёт. В дальнейшем, если кто-то будет пользоваться модулем, добавлю экспорт (уже написан), только с категориями переиграю, сейчас немного неправильно сделано (только до 2-ого уровня вложения).

Edited by a13x3y
  • +1 1

Share this post


Link to post
Share on other sites

Вот стандарты кодирования под опен, вот тут мне немного непонятно:

for ($f=1;$f<count($prod["images"]);$f++)   //1 потому что 0 фотка идёт в карточку товара
     $this->db->query("INSERT INTO `".DB_PREFIX."product_image` SET `product_id`=".$product_id.", `image`='".$prod["images"][$f]."', `sort_order`=".$f);

тоесть уже в первом запросе, теряем одну картинку, а именно $prod["images"][1], так как $f++ в начальном запросе будет == 2, + я бы как то по стандарту уж написал...

//импорт изображений
for ($f=0;$f<count($prod["images"]);$f++) {  //1 потому что 0 фотка идёт в карточку товара
    $this->db->query("INSERT INTO `".DB_PREFIX."product_image` SET `product_id`=".$product_id.", `image`='".$prod["images"][$f]."', `sort_order`=".$f);
}

вот прикреплю файл, может подсобит с выводом категорий.

пример вызова класса и вывод параметров:

$this->load->model('catalog/category');
$this->data['categories'] = $this->model_catalog_category->getCategoryTree(); 

а вот модель:

public function getCategoryTree() {
	$query = $this->db->query("SELECT c.category_id, c.parent_id, cd.name FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE cd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY c.sort_order, cd.name ASC");
	$this->load->helper('tree');
	$tree = new Tree($query->rows, 'category_id');
	return $tree->get_plane();
} 

За проделку - однозначно +, спасибо за код, предоставленный для публики.

tree.php

Share this post


Link to post
Share on other sites

по поводу цикла с фотками: 

$f=1; означает что с 1-ого изображения в массиве начинаем работать т.к. нулевое изображение пошло в карточку товара и оно нам больше не нужно т.к. цикл идёт после запроса на импорт товара в БД

если сделать $f=0; то у нас первое изображение с карточкой товара попадет в дополнительные изображения, и получится дубликаты

 

Да, с выводом категорий согласен, иногда проще взять уже готовую модель, но не всегда это подходит, например с импортом новых атрибутов\опций это не прокатывает т.к. метод не возвращает id атрибута\опции вставленной в базу. по сути в методе можно было сделать возврат нового id, но я не понимаю почему разработчики этого не сделали, просто действия на импорт и ничего о возврате.

 

p.s. за скрипт спасибо, когда соберусь с мыслями чтобы переделать, обязательно воспользуюсь, хоть самому писать не придётся :)

 

p.p.s по поводу стандартов кодирования, то тут тоже двоякая ситуация, если можно обойтись без пробелов в условиях то зачем они? Почему нельзя включить поддержку short_open_tag  и работать вот так

<?=$var;?> нежели писать вот так <?php echo $var;?> по поводу отспутов "табами" то это отдельная песня, тут каждый пишет как ему удобнее, я стараюсь соблюдать это как в верстке так и в коде, но вероятно редактор где то косячит и когда у меня выглядит всё ОК, то у других может быть иначе.

Edited by a13x3y

Share this post


Link to post
Share on other sites

Прошу прощение, я перепутал оператор foreach с for, но все же в скобки фигурные я бы заключил.

По поводу short_open_tag  - то не у каждого пользователя есть доступ к данной настройке хоста, так что полнота кода с указанием интерпритатора - хороший тон.

По поводу нужных *_id вы напишите, дополним чем нужны, был би лишь прок.

Share this post


Link to post
Share on other sites

да, по поводу скобок согласен, привычка просто если одно действие у цикла или условия то пишу без скобок, виноват, каюсь :lol:

насколько знаю почти любую настройку из php.ini можно продублировать через .htaccess

<IfModule mod_php5.c>
php_value short_open_tag 1
</IfModule>

или

php_value short_open_tag 1

по поводу ID тут скорее вопрос в другом, либо самому написать эти 2-3 запросы в БД и получить возвращённый id, либо подключать модель и дописывать её на возврат id + дописывать это надо будет всем кто пользуется скриптом. Я пошёл по пути наименьшего сопротивления. Может в версии 2.0 этим методы возвращают id вставленной опции\атрибута, но в 1.5 этого нет.

 

ну и по поводу табов, как я и писал иногда проблема в приложении, через которое пишу

7a8d68.png

Share this post


Link to post
Share on other sites

файл обновил, была ещё одна ошибка в javascript из-за которой файл не закачивался, но и она была не той, вобщем в фаерфокс работает, а вот хром не хочет. Сейчас исправлю

Share this post


Link to post
Share on other sites

Вобщем много ошибок было исправлено, но хочется дополнить, что если вы работаете с форматом XLSX, то у вас должна быть поддержка php_zip.dll (php_zip.so) для PHP, в противном случае могут появляться ошибки после импорта. Либо вы можете включить подавление ошибок в админке: Система - Настройки - изменить - Сервер > Показывать ошибки: поставить НЕТ. Конечно от фатальных ошибок вас это не спасет, но не видеть notice и warning поможет.

Обновленная версия там же, https://yadi.sk/d/lYnhFnT5jaDsr

Share this post


Link to post
Share on other sites

ошибки не нужно прятать - их нужно исправлять

если есть какой-то нюанс или требование к модулю - сильно желательно об этом указать в описании на странице модуля

Share this post


Link to post
Share on other sites

ошибки не нужно прятать - их нужно исправлять

если есть какой-то нюанс или требование к модулю - сильно желательно об этом указать в описании на странице модуля

На самом деле я бы и рад указать, но из тестируемых был только 1 человек, у него один хостинг, ошибка была, у меня другой хостинг - ошибки не было, на домашнем сервере отключал php_zip.dll в апаче, ошибки всё равно не было, поэтому узнать что где косячит нет возможности.

Share this post


Link to post
Share on other sites

Внимание!!!

Для корректной работы необходим PHP модуль ZIP (не путать с zlib)! На разных хостингах это включается по разному, где то уже включено, где то, как например в NIC HOST, надо включать руками в панели управления (Веб сервер - Управление модулями - Настроить модуль (около PHP модуля) - Управление расширениями > Поставить галочку на ZIP и сохранить.

Share this post


Link to post
Share on other sites

Добавлена проверка на наличие ZIP модуля для PHP при открытии страницы с модулем.

Если модуль не найден то будет гласить надпись об этом, чуть ниже заголовка.

Share this post


Link to post
Share on other sites

1.

либо в php.ini (если проблема была в этом) включить short_open_tag = On

давай еще php-теги заменим на "<%" ?

а чо? может, мне так удобно.

2. shared-хостинг с 64мб оперативы? не, не слышал!

@ini_set("memory_limit","812M");
3. private/protected переменные-методы? не, не слышал.

4. экранизация данных? не, не слышал.

стандарты кодирования? не, не слышал.

обязательное приведение переменных к нужному типу? не, не слышал.

работа с БД в модели? зачем? можно ведь прямо в контроллере клепать запросы.

- - -

короче, как-то всё уныло.

Share this post


Link to post
Share on other sites

Дружище, я понимаю что ты круче меня в программирования, много всего знаешь, любишь кого то унизить на форуме, обосрать и всё такое в этом роде. Я бы мог тебе ответить на все твои придирки, но прости, это не мой уровень. Можешь дальше негодовать как всё уныло, я разместил тут скрипт, кто надо тот возьмёт, а ты, видимо, можешь сам всё накодировать своими методами и классами.

Share this post


Link to post
Share on other sites

я указал на глупости и откровенные fail`ы.

можешь искать в этом попытку унизить и обижаться, а можешь исправить код.

Share this post


Link to post
Share on other sites

я указал на глупости и откровенные fail`ы.

можешь искать в этом попытку унизить и обижаться, а можешь исправить код.

глупости и фейлы? перенести все запросы в модель? для кого? тебе нужен этот код? я думаю людям (овер 90%) главное чтобы всё работало, а то что запросы не в модели, экранизации данных нет (код писал быстро, может в каком то запросе пропустил), стандарты кодирования не те - это мало кому интересно, разве что людям вроде вас. Это всё равно что пускать незнакомых людей в свой дом: зайдут, обосрут, скажут как всё плохо и уйдут. У всех познания в программировании свои, я не знаю чем отличается класс protected от private, можешь кинуть в меня камень, также я не знаю ООП, и что дальше? Почитать и изучить не проблема, но только тогда когда мне это понадобится. Не нравится как написано, напиши лучше, более идейно и расшарь для всех. Я уверен найдётся кто-то, кто тоже будет чем то недоволен. Для меня главное чтобы всё работало, если кто-то укажет на ошибки, то я их, естессно, исправлю.

P.S. нет, я конечно могу изучить весь код, прочитать про ООП, по стандарту всё написать, запросы по моделям раскидать, английский язык подкрутить - не вопрос, но это время, а время деньги. Я даже не знаю нужно это кому то или нет, хотя уже потратил немало времени.

Edited by a13x3y

Share this post


Link to post
Share on other sites

Тема интересная - нужно развивать! :)

Share this post


Link to post
Share on other sites

Вот я тоже не понимаю: как можно наезжать и оскорблять человека, который сам написал скрипт, выложил его в бесплатный доступ для других пользователей!? Если вы больше знаете движок и видите ошибки в скриптах, так лучше направьте свои силы на то, чтобы помочь человеку или остальным пользователям, которые в этом не бум-бум, допились скрипт и довести его до ума! Ведь идея полезная и может многим пригодиться... Хватит быть хамами - учитесь общаться культурно!

Share this post


Link to post
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.

Guest
You are posting as a guest. If you have an account, please sign in.
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.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.