Проблемы импорта CSV

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

Александр Б M
Александр Б M
Репутация: 4
Сообщения: 30
Зарегистрирован: 21.07.2016
С нами: 7 лет 8 месяцев

Сообщение #1 Александр Б » 10.09.2016, 22:42

Здравствуйте, недавно перешел на вашу CMS, все отлично кроме работы импорта.

1. Начиная с версии 1.2.0 импорт стал требовать ввода ВСЕХ полей. При первичном наполнении это не проблема. Но поставщик присылает свой прайс-лист, в котором единственное общее с текущим - это колонки артикулов и цен. И теперь нужно еще и формулы каждый раз подставлять (в Open Office!) чтобы заполнить недостающие поля. Разве это логично? Я заметил такую связь только при обновлении характеристик, так как там требовалась категория для их присвоения. Но зачем все поля требовать? Ведь достаточно артикула и поля, которое изменяется.

2. Встречаются проблемы при импорте изображений. Не из-за CMS, а чаще из-за отсутствия файлов на сервере. До этого я использовал Joomla+Joomshopping, эта рухлядь значительно уступает вашей CMS во всем кроме функции очистки отсутствующих изображений.
После того, как мне удалось найти товары с отсутствующими изображениями, оказалось что массово их удалить невозможно! Возможно ли добавить в импорт удаление фото товара если в ячейке указано к примеру "0"?
Еще проблему решила бы возможность включения замены фото товара при импорте вместо добавления. Вы подскажите где подкрутить, а чекбокс я сам добавлю.
Вложения
11-09-2016 1-19-44.jpg

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #2 korshunov » 11.09.2016, 06:35

1. Налицо явное усложнение функционала в сторону неудобства конечного пользователя.

По реализации: в самом файле стоит дополнительный код
if (count($diff)) {
...
$result->error = 1;
....
return $result;
}
а после него - стандартный фрагмент из Simpla
// Если нет названия товара - не будем импортировать
if(!in_array('name', $this->columns) && !in_array('sku', $this->columns)) {
return false;
}
Если в первом фрагменте поставлена проверка на наличие ВСЕХ полей, то второй фрагмент для проверки ДВУХ полей уже и ни к чему. Мелочь, конечно, но говорит о неаккуратности разработчиков...

Практически, если Вас беспокоит проверка всех полей, надо начать с того, что первый фрагмент удалить. Но это, скорее всего, полностью вопрос не решит, так как импорт будет заполнять отсутствующие поля по-своему, затирая, например, существующие вручную сделанные описания или меты...

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


2. "замены фото товара при импорте вместо добавления" - совсем не так просто, как может показаться.
Пробуйте в backend/ajax/import.php

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #3 Vitaly » 11.09.2016, 07:39

поставщик присылает свой прайс-лист, в котором единственное общее с текущим - это колонки артикулов и цен

Самое простое, что можно попробовать сделать в вашем случае - в файле \backend\ajax\import.php в начале есть такие строки:
Спойлер

Код: Выделить всё

    // Соответствие полей в базе и имён колонок в файле
    private $columns_names = array(
        'name'=>             array('product', 'name', 'товар', 'название', 'наименование'),
        'url'=>              array('url', 'адрес'),
        'visible'=>          array('visible', 'published', 'видим'),
        'featured'=>         array('featured', 'hit', 'хит', 'рекомендуемый'),
        'category'=>         array('category', 'категория'),
        'brand'=>            array('brand', 'бренд'),
        'variant'=>          array('variant', 'вариант'),
        'price'=>            array('price', 'цена'),
        'currency'=>         array('currency_id', 'currency', 'ID валюты'),
        'compare_price'=>    array('compare price', 'старая цена'),
        'sku'=>              array('sku', 'артикул'),
        'stock'=>            array('stock', 'склад', 'на складе'),
        'meta_title'=>       array('meta title', 'заголовок страницы'),
        'meta_keywords'=>    array('meta keywords', 'ключевые слова'),
        'meta_description'=> array('meta description', 'описание страницы'),
        'annotation'=>       array('annotation', 'аннотация', 'краткое описание'),
        'description'=>      array('description', 'описание'),
        'images'=>           array('images', 'изображения')
       
    );

Попробуйте изменить, убрать лишнее, в итоге будет так:
Спойлер

Код: Выделить всё

    // Соответствие полей в базе и имён колонок в файле
    private $columns_names = array(
        'price'=>            array('price', 'цена'),
        'compare_price'=>    array('compare price', 'старая цена'),
        'sku'=>              array('sku', 'артикул'),

       
    );
После этого должно обновлять только цены по артикулу, остальную информацию затронуть не должно.

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

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 4 месяца
Сайт Skype

Сообщение #4 OkayCMS » 11.09.2016, 09:01

Мы согласны, на данный момент импорт в OkayCMS одно из слабых мест. Ранее были более слабы места, например система комментирования. В ближайшее время мы займемся вопросом оптимизации импорта/экспорта.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #5 korshunov » 11.09.2016, 11:42

Vitaly писал(а):Самое простое, что можно попробовать сделать в вашем случае
....
Попробуйте изменить, убрать лишнее, в итоге будет так:
...
После этого должно обновлять только цены по артикулу, остальную информацию затронуть не должно.

1. Этот метод требует присутствия в файле колонки "Старая цена" - вряд ли поставщики такие цены присылают. Поправить это несложно, но есть и более серьезные проблемы.
2. "остальную информацию затронуть не должно" - может, и не должно. Однако оно об этом, видимо, не знает и на практике убивает меты товаров в таблице s_products. Правда, на сайте это не проявляется, так как значения берутся из s_lang_products. Мимоходом отметим - дополнительная путаница с этими полями - вроде бы им нечего делать в двух таблицах. А если они все же нужны в обоих таблицах, то предложенный метод в одной из таблиц их здорово запортит.
3. Если захотите сделать импорт новых товаров с обычным набором полей, то результат Вас, мягко говоря, разочарует.

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

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #6 Vitaly » 11.09.2016, 15:30

OkayCMS писал(а):В ближайшее время мы займемся вопросом оптимизации импорта/экспорта.
Благодарю заранее! Порадовали)

2 korshunov
1) Ну я не вижу проблем с новой ценой. С 12-го года занимаюсь продажами, всё время мои поставщики присылают мне в прайсах новую цену выделяя ее красным, и я при синхронизации на сайте использую три поля. Но в любом случае, это поле не обязательное, и его можно просто не заполнять. Почему вас это напрягает - не понимаю.
Вообще ваша манера общения очень напоминает общепринятую манеру поведения на симпла-форуме. Там принято не столько помогать, столько толкаться локтями. В чём прелесть такого общения я до сих пор не понял, до этого общался на форумах с более дружественным сообществом.

2) Если режет метатеги, которые почему-то на сайте всё равно остаются (и по этому я не заметил проблемы), можно удалить еще несколько строк - начинаются они где-то на 148 строке. На самом деле удалять там можно много чего, я пишу о минимуме который необходим для обновления цены.
Спойлер

Код: Выделить всё

 if(isset($item['meta_title'])) {
            $product['meta_title'] = trim($item['meta_title']);
        } else {
            $product['meta_title'] = $product['name'];
        }
       
        if(isset($item['meta_keywords'])) {
            $product['meta_keywords'] = trim($item['meta_keywords']);
        } else {
            $product['meta_keywords'] = $product['name'];
        }
       
        if(isset($item['meta_description'])) {
            $product['meta_description'] = trim($item['meta_description']);
        } else {
            $product['meta_description'] = $product['name'];
        }

3) Я думаю всем понятно, что нужно сохранить оригинальный файл, чтобы можно было вернуть всё в зад. Плюсы и недостатки метода тоже понятны, не зря я написал - это самое простое, что можно сделать. Себе я уже давно запилил отдельную страницу в админке и синхронизирую по кнопке, даже не качая прайсы. А тем кто не может сам и нет 50-100$ на ваши услуги, я считаю эта информация будет полезной.
Последний раз редактировалось Vitaly 11.09.2016, 17:01, всего редактировалось 2 раза.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #7 korshunov » 11.09.2016, 16:22

1. Почему Вы сделали вывод "вас это напрягает" - не понимаю. Я ведь четко написал "Поправить это несложно".
3. Симпатичное выражение
Vitaly писал(а):чтобы можно было вернуть всё в зад

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #8 Vitaly » 11.09.2016, 16:57

1. Почему Вы сделали вывод "вас это напрягает" - не понимаю. Я ведь четко написал "Поправить это несложно".
Потому, что вы охарактеризовали это как проблему, хотя проблемы нет и исправлять там нечего. Нет новой цены - оставляем поле пустым.
Но вы это понимаете, просто пишете обратное.
Симпатичное выражение
Знал, что вам понравится.

Больше спориться желания нет. Peace to all.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #9 korshunov » 12.09.2016, 06:17

1.
Vitaly писал(а):Нет новой цены - оставляем поле пустым.
При таком старая цена, если такая была ранее, исчезнет. Вот и получается плохо. Возможно, Вас это устроит, но не всем такое понравится...
Кроме того, маленькое неудобство в том, что надо это поле все же создавать в файле импорта. А если это делается частенько, то уже становится утомительным. А если админ один раз про это действие забудет, то старые цены затрутся.
Восстанавливать - это уже поработать надо. И маленькое неудобство может стать уже некоторой проблемой, которая на пустом месте будет непроизводительно съедать рабочее время...

Добавлено спустя 15 минут:
Возникла, как ни странно, м-мысль.

Сейчас при проверке обязательности полей стоит
$required_fields = array_keys($this->columns_names);
Это определяет ВСЕ поля как обязательные.
А вот если эту строку заменить, например, на
$required_fields = array('name','sku','price');
то обязательными станут только три поля.
И список обязательных полей можно менять. Или даже вынести в настройки - общие или в переменные класса импорта или еще как-то.

И надо поменять обработку мет.

Возможно, разработчикам понравится такой прием...
Последний раз редактировалось korshunov 12.09.2016, 09:28, всего редактировалось 1 раз.

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #10 Vitaly » 12.09.2016, 07:00

Возможно, Вас это устроит, но не всем такое понравится...
Да пожалуйста, кому не нужно, удалят вместе с остальным и строку старой цены из файла импорта. По моему опыту, это поле нужное, но мне не принципиально и я удалять его не запрещал.
У меня уже ощущение, что вы меня тролите :)) Суть метода не меняется, удаляем лишнее - оставляем нужное. У каждого могут быть свои поля.

А ваш прием с $required_fields мне понравился.

Александр Б M
Александр Б M
Репутация: 4
Сообщения: 30
Зарегистрирован: 21.07.2016
С нами: 7 лет 8 месяцев

Сообщение #11 Александр Б » 12.09.2016, 10:32

Спасибо всем за участие, проблему импорта пока просто отложил и сижу на Okay 1.1.12 с несколькими патчами от 1.2.
Очень актуально научить импорт не добавлять фото к товару, а заменять их. Так очень быстро удастся избавиться от пустых изображений. У меня сейчас треть товаров с битыми фото, что очень не комильфо. Кто-нибудь знает что подкрутить?

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 4 месяца
Сайт Skype

Сообщение #12 OkayCMS » 12.09.2016, 11:04

Александр Б писал(а):Очень актуально научить импорт не добавлять фото к товару, а заменять их.
Если постоянно заменять все фото, то это будет не нужная большая нагрузка. Нужно дополнительно делать какие-то проверки, чтобы заменять только битые фото.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #13 korshunov » 12.09.2016, 11:12

Александр Б писал(а):Очень актуально научить импорт не добавлять фото к товару, а заменять их. Так очень быстро удастся избавиться от пустых изображений. У меня сейчас треть товаров с битыми фото, что очень не комильфо. Кто-нибудь знает что подкрутить?

Возможно, это заинтересует:
http://simpla-tuning.com/izobrazheniya-kontrolkartinok

Александр Б M
Александр Б M
Репутация: 4
Сообщения: 30
Зарегистрирован: 21.07.2016
С нами: 7 лет 8 месяцев

Сообщение #14 Александр Б » 12.09.2016, 11:29

OkayCMS писал(а):Если постоянно заменять все фото
Я же написал что тумблер сделаю. Подключу радиокнопку с переключением вариантов если часто нужно будет. Да или просто назад верну потом.
Кстати такое еще иногда и для категорий нужно, чтобы товару не добавлялась категория, а заменялась. У меня 12000+ товаров, постоянно ошибки нахожу и правлю с помощью импорта. Попал воблер к блеснам - подправил. А он в итоге и в блеснах и в воблерах. Приходится категории удалять и заново запускать импорт, чтобы добавились. Да только все метаданные категории и описания приходится заново вводить.
На скриншоте панель из старой CMS Joomla+Joomshopping. Галочки, включающие обновление и добавление нужны были постоянно. Также удаление изображений при указании "-1" очень выручало. И больше никаких скриптов и магии ))

korshunov писал(а):Возможно, это заинтересует:
http://simpla-tuning.com/izobrazheniya-kontrolkartinok
Битые я уже нашел, мне бы их массово удалить хотя бы. Я думаю что замена фото вместо добавления подойдет лучше всего - битые сразу нормальными заменятся.
Вложения
12-09-2016 14-21-23.jpg

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #15 Vitaly » 12.09.2016, 21:09

Александр Б писал(а):Битые я уже нашел, мне бы их массово удалить хотя бы. Я думаю что замена фото вместо добавления подойдет лучше всего - битые сразу нормальными заменятся.
Если подшаманить импорт, оставить два поля - изображения и артикул, (по принципу обновления цены) можно массово заменить фото. Неудобство в том, что нужен список артикулов с битыми фотками.
Я вижу такой выход, после строки if(isset($item['images'])) { вставляем

Код: Выделить всё

$current_images = $this->products->get_images(array('product_id'=>$product_id));
   foreach($current_images as $image) {
      $this->products->delete_image($image->id);
   }

Должно сработать. Если это разовая акция, то это может быть выходом из положения. Но не спеши сразу проверять на паблике, попробуй как сработает на локалхосте))
А еще тебе стоит выслушать мнение товарища korshunova, а то сейчас окажется, что этот приём нельзя применять ни в коем случае.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #16 korshunov » 13.09.2016, 07:22

Мнение:
1. Прежде чем делать, надо представлять ТОЧНО, чего хотим добиться. Много зависит от того, какой смысл вкладывается в "не добавлять фото к товару, а заменять их".
2. Метод товарища Vitaly приводит к тому, что сначала удаляются у товара ВСЕ фото, а потом стандартный импорт запишет новые фото из файла импорта.
3. Недостаток метода указанного товарища:
3.1 если у товара есть фото, а в файле импорта колонка изображений пуста, то все фото пропадут. Возможно, тот товарищ не сочтет это за недостаток, может, ему так и надо. Тут уже, повторю сказанное в п.1: надо сначала определиться с целями и задачами, а потом кидаться писать код...
3.2 Если импорт вести регулярно, то выходит лишняя нагрузка как по удалению записей в базу, так и по удалению файлов изображений. Обычно файлы импорта через небольшой промежуток отличаются мало. А тут будут регулярно удаляться все фото товара и тут же записываться те же самые.
4. Стандартный метод импорта работает так: рассматривает очередное фото из файла, если такого у товара нет, то добавляет, или никаких действий не делает. В результате, например, сохраняются фото, которых нет в файле импорта, то есть тупого глобального удаления не происходит. Легко понять, что стандартный импорт работает с каждой картинкой индивидуально, то есть намного тоньше, чем грубый метод товарища Vitaly.
5. По хорошему, если хочется "не добавлять, а заменять", то надо учитывать опыт стандартного импорта, и изменять, не ломая то полезное, что в нем есть.

Как говорится, семь раз отмерь - один отрежь...

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #17 Vitaly » 13.09.2016, 08:28

Ну что и ожидалось)))
korshunov писал(а):3.1 если у товара есть фото, а в файле импорта колонка изображений пуста, то все фото пропадут.
Ну так и хочется сказать избитую фразу - "Спасибо кэп". Но не буду. Если предполагается заменить битые фото, то я проблемы не вижу.
korshunov писал(а):3.2 Если импорт вести регулярно, то выходит лишняя нагрузка как по удалению записей в базу, так и по удалению файлов изображений.
А разве я не писал, что это подойдет только для разовой акции, по замене битых фоток?))
korshunov писал(а):4. Стандартный метод импорта работает так: рассматривает очередное фото из файла, если такого у товара нет, то добавляет, или никаких действий не делает.
Все верно, но он не удаляет битые фото. И чего можно ждать от решения в 3 строки? Может оно и грубое, но если бы у меня стояла задача один раз снести битые фотки, то я им бы воспользовался и не городил огород. Я понимаю, что вам нравится упражняться в программировании, но мне и думаю многим время дороже, и такую задачу я бы решил быстро вот таким грубым способом, в три счёта. А потом вернул на место оригинальный файл импорта.
Ну и это решение я предлагаю как один из вариантов, которым бы воспользовался сам. Он бесплатный, грубый, простой но рабочий. Никого ни к чему не принуждая и не требуя в замен ничего.
Кому нужно платное решение, с различными условиями и настройками, они знают куда обращаться.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #18 korshunov » 13.09.2016, 10:01

3.1
Vitaly писал(а):Если предполагается заменить битые фото, то я проблемы не вижу.
А надо бы видеть, что предложенный метод удаляет не только битые фото, но и небитые тоже удаляет. Он удаляет ВСЕ фото товара...

Vitaly писал(а):И чего можно ждать от решения в 3 строки?
Качество программного решения обычно не определяется количеством строк...
Целью моего поста было намекнуть Вам на то, что Вы могли бы легко написать чуть иное решение в почти такие же три строки, но лишенное указанных недостатков...

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #19 Vitaly » 13.09.2016, 12:15

korshunov писал(а):Он удаляет ВСЕ фото товара...
Ага, и я это понимаю. Если в товаре есть битые и нормальные фото, и нужно сделать выборку по битым и удалить только их - то это в платный раздел.
Если нужно сделать удобное в использовании решение, которым можно пользоваться на постоянной основе - это в платный раздел.

Во первых я не видел, чтобы кто-то ставил именно такую задачу, во вторых я не увидел альтруистов которые бы бесплатно предложили свой вариант реализации этой задачи, без недостатков.
Какой был вопрос, такой я дал и ответ. Пища для размышлений есть, дальше можно усложнять сколько угодно.
Я не обещал сделать универсальное решение, просто эту проблему я решил бы так, и на следующий день забыл бы о ней.

Александр Б M
Александр Б M
Репутация: 4
Сообщения: 30
Зарегистрирован: 21.07.2016
С нами: 7 лет 8 месяцев

Сообщение #20 Александр Б » 18.09.2016, 20:52

Забыл отписаться

Vitaly, спасибо за помощь быстрый ответ, ваш вариант - это то, что я искал. Он хорошо подходит когда у товара только 1 фото и некоторые битые из-за кривого CSV или значений в нем. Поправил CSV, еще раз запустил - и готово. Можно потом закомментировать часть вашего кода, но я не буду - у товаров по 1 фото.

korshunov, ваш вариант более грамотный, он ищет и удаляет фото, но непонятно насколько он совместим с Okay. Штука хорошая, пригодится. Вы это использовали или как-то связаны с разработчиком? Или это ваше детище? )


Название раздела: Предложения по улучшению OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Предложения по улучшению OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 11 гостей