Импорт Товаров

Здравствуйте, сейчас делаю модуля импорта товаров по аналогии с exim_1c.

Подскажите, пожалуйста:

1. В родном модуле при импорте товаров идет пересчет их количества в категории вручную через sql запрос, учитывая только непосредственных потомков:

$product_count = db_get_field("SELECT COUNT(*) FROM ?:products_categories WHERE category_id = ?i", $category_id);

(app/addons/rus_exim_1c/func.php:195)

Как быть для родительских групп? Есть ли уже что-то штатное или надо писать что-то свое?

2. Не понятно как быть со свойствами товаров:

В модуле идет импорт в таблицы features*.

А где это отображается редактируется в карточке товара? Опции?

3. Подскажите куда копать в поисках количества товара на разных складах?

Наткнулся на этот топик, но не совсем понятно как быть в случае импорта....

1. Родной модуль, это проверенный на тысячах клиентов магический набор функций, заточенный под 1С. Он слишком сложен, чтобы использовать его в качестве примера. Например, есть стандартная функция для создания и обновления товаров, но она нам показалась медленной и мы сделали свой велосипед (вам оно может быть не надо и сложно)

2. Вы определитесь, что вы хотите добавлять товарам. Не совсем понимаю, как вы пишите импорт, если не знаете, что и куда пихать.

У товаров есть характеристики и опции, это разные сущности.

3. У нас нет количества товаров на разных складах в стандартной функциональности, поэтому копать в любом направлении, которое подойдёт конкретно вам. Собираем требования и внедряем.

Спасибо за ответ.

1. И все же вопрос открытый - как мне обновить счетчики товаров родительских категорий? ([attachment=10224:Снимок экрана 2015-09-29 в 0.11.02.png])

2. Уточняю. Есть характеристики товаров (количество кнопок на мыши, тип процессора, размер экрана и прочие) Я их импортирую в таблицу features. В админке они появляются,но на основном сайте их нет. В чем может быть причина?

[attachment=10225:Снимок экрана 2015-09-29 в 0.38.51.png][attachment=10226:Снимок экрана 2015-09-29 в 0.38.41.png]

Снимок экрана 2015-09-29 в 0.11.02.png

Снимок экрана 2015-09-29 в 0.38.51.png

Снимок экрана 2015-09-29 в 0.38.41.png

Модуль который пишем должен импортировать примерно 100-150 тысяч товаров, или обновлять такое количество товаров хотя бы раз в день, поэтому скорость критична.

1. https://yadi.sk/i/jlKzQSGrjP4Xc

То есть товары импортировались во все подгруппы, в а в главных индексы не обновились

2. Характеристики импортировались https://yadi.sk/i/_VzYo2pAjP4uY, а в карточке товара их нет https://yadi.sk/i/1H6NK4mNjP4yG

1. Никак, это счётчики товаров которым задана конкретная категория. Родительская должна быть основной у товара.

2. Зайдите в настройки характеристик на странице Товары - Характеристики и посмотрите галки с настройками отображения "Отображать *"

Модуль который пишем должен импортировать примерно 100-150 тысяч товаров, или обновлять такое количество товаров хотя бы раз в день, поэтому скорость критична.

1. https://yadi.sk/i/jlKzQSGrjP4Xc

То есть товары импортировались во все подгруппы, в а в главных индексы не обновились

2. Характеристики импортировались https://yadi.sk/i/_VzYo2pAjP4uY, а в карточке товара их нет https://yadi.sk/i/1H6NK4mNjP4yG

1. Это не индексы главной, а количество товаров конкретной категории, у вас есть товары в это категории? Не в подкатегориях, а именно в этой?

2. Настройки характеристик смотрите, при импорте проставляйте нужные флаги.

P.S. 150 тыс. это не много для обновления раз в сутки. Вот если раз в 5 минут то да, была бы переживалочка.

Подскажите какие флаги должны стоять? Не вижу ни в документации, ни в комментариях к коду, нигде нет хотя бы констант... Хотя может я плохо ищу? Единственный способ смотреть сейчас, насколько вижу - вручную добавлять через админку, а потом смотреть записи в табличках :/

Подскажите какие флаги должны стоять? Не вижу ни в документации, ни в комментариях к коду, нигде нет хотя бы констант... Хотя может я плохо ищу? Единственный способ смотреть сейчас, насколько вижу - вручную добавлять через админку, а потом смотреть записи в табличках :/

Совершенно верно, поставьте в админке и посмотрите в базе, это самая лучшая документация.

Таблица

cscart_product_features
Колонки
display_on_product
display_on_catalog
display_on_header
P.S. Ни разу не видел, чтобы документировались такие вещи.

Подскажите, еще, пожалуйста, по изображениям?

Можно сделать, чтобы хранились только ссылки на нужные изображения, без их фактической загрузки? Насколько вижу по табличкам в базе, такого нет, верно?

Как прикрепить нужную картинку (по адресу) к товару?

----

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

Подскажите, еще, пожалуйста, по изображениям?

Можно сделать, чтобы хранились только ссылки на нужные изображения, без их фактической загрузки? Насколько вижу по табличкам в базе, такого нет, верно?

Как прикрепить нужную картинку (по адресу) к товару?

----

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

1. Нет, только загрузка, система нарезает миниатюры разных размеров из основного изображения.

2. Тоесть вы реально считаете, что если задокументировать что то до такой глубокой степени, то эту документацию кто то будет читать и кто то сможет там что то найти? :) Я вас умоляю.

Разработчики которым нужна эта информация - читают её в коде. Невозможно задокументировать все таблицы, колонки, функции, классы, методы, библиотеки и комбинации использования.

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

Подскажите, еще, пожалуйста, по изображениям?

Можно сделать, чтобы хранились только ссылки на нужные изображения, без их фактической загрузки? Насколько вижу по табличкам в базе, такого нет, верно?

Как прикрепить нужную картинку (по адресу) к товару?

Посмотрите функцию fn_import_images , которая используется в стандартном импорте.

Честно говоря, я не понимаю вашу логику подхода к разработке. В CS-Cart есть готовые функции для импорта данных (импорт из CSV), достаточно их использовать.

Есть API у которого также есть готовые методы для создания и редактирования товаров, их тоже можно использовать.

Зачем с нуля то всё писать? :)

Хорошо, как мне сделать импорт каталога, доступ к api которого осуществляется через Soap?

Хорошо, как мне сделать импорт каталога, доступ к api которого осуществляется через Soap?

Любой импорт, это конвертация данных:

1. Взяли (поставщик предоставляет информацию в формате SOAP).

2. Обработали и сохранили (в базу данных CS-Cart)

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

Вот п.2 имеет несколько решений, есть три способа сохранить данные в CS-Cart

1. RESTful API . Ваш удалённый сервер готовит данные отправляет запросы в CS-Cart API для создания и изменения товаров.

2. Использование стандартных функций. Вы на стороне CS-Cart делаете контроллер, который будет подключаться к вашему SOAP источнику, подготавливает данные и сохраняет их в базу используя стандартные функции (например, fn_update_product и fn_import_images).

3. Велосипед. Пишем какой то скрипт, который как то получает данные и пишет их напрямую в MySQL базу, без использования стандартных функций.

Я считаю, что самый быстрый и надёжный вариант - п. 2 . В CS-Cart есть импорт в формате CSV . Который читает CSV данные - строки, обрабатывает их и сохраняет в базу. Все функции уже готовы (создание товара, добавление изображений, создание категории и т.д.)

Посмотрите как работает импорт в формате CSV, посмотрите как он добавляет изображения товарам, например.

Я считаю, что если кто то уже сделал импорт изображений, то зачем проходить этот путь ещё раз? Зачем пытаться понять куда писать в базу, куда сохранять картинки, будет ли это работать на двух витринах, не отвалится ли после обновления. КОгда можно просто использовать функцию:
function fn_import_images($prefix, $image_file, $detailed_file, $position, $type, $object_id, $object)

Тоже самое и с характеристиками, в CS-Cart уже есть импорт характеристик, зачем изобретать свой, если можно посмотреть как работает стандартный и подсунуть в него свои данные.

В принципе и пытаемся идти по второму пути, только наткнулись сначала на exim_1c, ибо он единственный упоминается в документации (еще раз специально посмотрел ее и что увидел на скриншоте внизу)

И тут возникают вопросы связанные с документацией: где увидеть описание параметров методов?

fn_import_images():

Какие значения может принимать $type и $object? Почему $position - строка в phpDoc, когда в базе это integer?

При этом для типа в единственном применении этого метода во всем коде используется нигде не описанная константа 'V'...

fn_update_product():

Что можно положить в $product_data - можно ли положить цену и количество или там есть какие-то хитрости? Почему я могу это узнать лишь прошерстив код метода, а не прочитав документацию или хотя бы phpDoc? Или может я явно что-то пропускаю?

Потому и приходится лезть в очищенную базу и смотреть что изменилось и, соответсвенно, писать почти голый sql как в exim_1с, поскольку хотя бы становится понятно что и откуда берется

Снимок экрана 2015-10-03 в 15.56.15.png

Прикрепил неверный скриншот с раздела документации.

Снимок экрана 2015-10-03 в 16.04.50.png

Или еще момент: тот же метод fn_import_images - он находится в файле с контроллером. Как его нужно подключать?!

В принципе и пытаемся идти по второму пути, только наткнулись сначала на exim_1c, ибо он единственный упоминается в документации (еще раз специально посмотрел ее и что увидел на скриншоте внизу)

И тут возникают вопросы связанные с документацией: где увидеть описание параметров методов?

fn_import_images():

Какие значения может принимать $type и $object? Почему $position - строка в phpDoc, когда в базе это integer?

При этом для типа в единственном применении этого метода во всем коде используется нигде не описанная константа 'V'...

fn_update_product():

Что можно положить в $product_data - можно ли положить цену и количество или там есть какие-то хитрости? Почему я могу это узнать лишь прошерстив код метода, а не прочитав документацию или хотя бы phpDoc? Или может я явно что-то пропускаю?

Потому и приходится лезть в очищенную базу и смотреть что изменилось и, соответсвенно, писать почти голый sql как в exim_1с, поскольку хотя бы становится понятно что и откуда берется

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

Самый просто способ, это посмотреть код функции. Я ещё не встречал функций, которые непонятно написаны, они все небольшие и написаны по единым стандартам.

fn_import_images() - Нет ничего проще, чем запустить импорт из CSV и посмотреть, что делает функция с помощью остановки скрипта (fn_print_die()) . Это быстрее чем кажется.

fn_update_product() - аналогично, функция небольшая и записывает в базу всё для чего есть колонки в базе данных.

Если функция находится в контроллере (это устаревшая практика), то вам ничего не остаётся кроме как задублировать функцию в своём модуле.

Зачем читать документацию, если код читаемый?

Как и зачем документировать это (отрывок из функции fn_update_product?

           fn_update_product_categories($product_id, $product_data);
        // Update product features value
        fn_update_product_features_value($product_id, $product_data['product_features'], $product_data['add_new_variant'], $lang_code);

        // Update product prices
        $product_data = fn_update_product_prices($product_id, $product_data);

        if (!empty($product_data['popularity'])) {
            $_data = array (
                'product_id' => $product_id,
                'total' => intval($product_data['popularity'])
            );

            db_query("INSERT INTO ?:product_popularity ?e ON DUPLICATE KEY UPDATE total = ?i", $_data, $product_data['popularity']);
        }

        // Update main images pair
        fn_attach_image_pairs('product_main', 'product', $product_id, $lang_code);

        // Update additional images
        fn_attach_image_pairs('product_additional', 'product', $product_id, $lang_code);

        // Adding new additional images
        fn_attach_image_pairs('product_add_additional', 'product', $product_id, $lang_code);</pre>

Поиск и понимание процесса занимает очень мало времени.

1. Определили контроллер (1 минута)

2. Пробежали по коду до нужного места (2-4 минуты)

3. Изучили процесс (5 минут)

4. Внедрили.

Вы смотрели видео по разработке? Я делал видео о том как работает CS-Cart, как делать модули, как работает экспорт/импорт и как его модифицировать, там же я делал небольшой модуль импорта из YML?

Столкнулись с тем, что скрипт импорта падает где-то в процессе. Однозначно не из-за таймаута или db-запроса.. В логах сервера пусто. В собственных логах обрывается на загрузке разных товаров (нет однозначности). В журнале событий в панели администратора тоже. Логов в файл от самой системе я не могу найти. Вопрос в том есть ли они? Есть только debug режим (переменная в запросе), который выводит информацию на страницу? Как настроить логгирование ошибок в файлы, чтобы посмотреть ошибки?

И снова, здравствуйте.

Импорт свойств товаров, берем добавляем группу через fn_update_product_feature. Она появляется в списке, но ее нельзя ни отредактировать, ни даже посмотреть параметры - отображается пустая форма.

В базе в таблицах cscart_product_features, cscart_product_features_descriptions - поля идентичные тем, если бы запись добавляли вручную. Через xdebug доходил до самого запроса из базы они одинаковы что для ручной записи , что для добавленной через скрипт. Разница только в feature_id. Но на мою запись ваш движок возвращает пустой результат, когда sql выполненный вручную - дает полный ответ с идентичными данными.

Делал даже так: отслеживал запрос отправленный через форму до вызова функции, смотрел значения аргументов, и уже просто вставлял их в свой скрипт. Тот же самый результат.

http://imgur.com/a/ve8Ta- скриншоты