Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Модуль импорта товаров 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

Надіслати
Поділитися на інших сайтах


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

Надіслати
Поділитися на інших сайтах

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

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

Надіслати
Поділитися на інших сайтах

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

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

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

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

 

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

Надіслати
Поділитися на інших сайтах

после выбора и закачки тестового файла 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. Логика интересна, но довести до ума и будет спрос.

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

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

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

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

Надіслати
Поділитися на інших сайтах


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

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

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

Надіслати
Поділитися на інших сайтах


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

https://yadi.sk/d/lYnhFnT5jaDsr

 

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

Змінено користувачем a13x3y
  • +1 1
Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах

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

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

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

 

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

 

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

 

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

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

Змінено користувачем a13x3y
Надіслати
Поділитися на інших сайтах


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

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

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

Надіслати
Поділитися на інших сайтах

да, по поводу скобок согласен, привычка просто если одно действие у цикла или условия то пишу без скобок, виноват, каюсь :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

Надіслати
Поділитися на інших сайтах


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

Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах

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

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

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

Надіслати
Поділитися на інших сайтах


Внимание!!!

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

Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах


1.

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

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

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

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

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

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

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

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

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

- - -

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

Надіслати
Поділитися на інших сайтах

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

Надіслати
Поділитися на інших сайтах


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

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

Надіслати
Поділитися на інших сайтах

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

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

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

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

Змінено користувачем a13x3y
Надіслати
Поділитися на інших сайтах


  • 5 weeks later...
  • 3 months later...

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.