5 мая 2017 г., 7:04

modImporter только обновление товаров

В блоге Песочница

Добрый день.

Подскажите, пожалуйста, как при помощи компонента modImporter можно реализовать только обновление товаров из прайса? (minishop2, по артикулу).
Без какого-либо учета категорий и уровня вложенностей.
При наличии артикула, не существующего в системе, просто оповещать об этом в логе ошибок.

Спасибо.
нужно расширить базовый процессор console написать методы для загрузки товаров прайса во временные таблицы и переноса этих данных в каталог сайта. на modx.pro есть несколько примеров, как это можно сделать.
Т.е. "из коробки" обновлять цены (только цены) по артикулу компонент не умеет?
Здравствуйте.

Я так понимаю, у вас товары появились не из импорта? То есть товары уже есть на сайте, и вы решили к этому прикрутить modImporter?

Смотрите, вот файл для примера: https://gist.github.com/Fi1osof/5e8cc4fb684c474db87f#file-processor-class-php-L184

В нем два важных метода:
1. StepWriteTmpGoods (это первичная запись данных товаров в таблицу).
2. StepImportUpdateGoods (непосредственно обновление товаров).

Есть еще StepImportCreateGoods (создание товаров), вот его вы можете использовать для записи в лог каких товаров нет в БД, так как в момент вызова этого метода во временной таблице останутся только необновленные товары (то есть для которых нет товаров на сайте).

Теперь к сути: у вас в качестве ключа используется 1С-артикул, но по умолчанию modMonitor использует externalKey. Тем не менее, это совсем не проблема, externalKey ему не обязателен, связка товаров может быть реализована по любой кастомной логике. В вашем случае, для начала, надо артикул записать в качестве externalKey во временную таблицу (на уровне метода StepWriteTmpGoods). Смотрите, в StepImportUpdateGoods есть данные артикула.
$article = $raw_data['Артикул']; $pagetitle = $tmp_object->tmp_title; $alias = "{$pagetitle}"; $data = array( "class_key" => 'msProduct', "published" => 1, "isfolder" => 0, "template" => $good_template_id, "parent" => $tmp_object->parent, "externalKey" => $tmp_object->tmp_external_key, "article" => $article, "pagetitle" => $pagetitle, "alias" => $alias, "content" => !empty($raw_data['Описание']) ? $raw_data['Описание'] : '', "vendor" => $tmp_object->vendor_id, );
В методе StepWriteTmpGoods надо просто заменить строчку
$id = (string)$xml->Ид;
на
$id = (string)$xml->Артикул;
Таким образом во временной таблице у вас в качестве ключа будет на 1С-ключ системный, а Артикул.

А в методе StepWriteTmpGoods надо заменить строчку
$q->innerJoin("modResource", "resource", "resource.template = {$good_template_id} AND resource.externalKey = {$alias}.tmp_external_key");
на
/* Этот код надо перепроверить. Назначение - поиск минишоп-товара по артикулу. */ $q->innerJoin("msProductData", "ProductData", "ProductData.article = {$alias}.tmp_external_key"); $q->innerJoin("modResource", "resource", "resource.id = ProductData.id;
В итоге у вас должно происходить обновление товаров по артикулу, а не 1С-ключу. Конечно, все это вам для примера, и придется покопаться с кодом, но повторюсь, проблемы в целом нет никакой, задача вполне реализуемая.

P.S. Вопрос еще в формате импорта. У вас XML-файл или что?

Добрый день.

Да, вы правы - все товары были добавлены вручную, теперь же пытаюсь обновлять цены из прайсов. Прайсы в xlsx/csv.
В качестве ключа используется просто артикул (уникальный для каждого товара).

Пытался видоизменить под себя предоставленные вами примеры на modx.pro, но возникла проблема с отключением "создания" категорий/товаров и с отключением уровня глубины.


Спасибо большое за подсказку, постараюсь правильно ей воспользоваться.
А в чем проблема с отключением возникла? Просто пропишите
protected function StepImportCreateGoods(){ return $this->nextStep("modimporter_import_prices", "Товары успешно созданы"); }
Вот вам и переход сразу к следующему шагу.
Увы, даже с вашей подсказкой так и не получилось заставить дополнение работать. Посмотрел пример с github'a и примеры с modx.pro по импорту в минишоп, не получилось запустить их даже под полную копирку (я так понимаю, актуальная версия внесла какие-то изменения).

Сумел удалить ненужные шаги, но дальше этого не сдвинулось. Если вас не затруднит, не могли бы вы подсказать, как мне запустить дополнение под мою задачу из актуальной версии:
- есть прайс xlsx, в котором 2 колонки = артикул и цена
- нужно только обновить существующим товарам цены, по их артикулу.
Все.

Уже 2 дня мучаю функции StepWriteTmpGoods и StepImportUpdateGoods. Восстанавливал сайт из бэкапа уже раз 15. Сжальтесь :(
Пришлите доступ в админку на адрес support@modxclub.ru, посмотрим. В актуальной версии ничего такого поменяться не может, просто где-то ошибку допустили. Не забудьте сделать бэкап.
Отправили все данные (уже 3 дня как)
Добрый день. Восстановите свой код, пожалуйста. По пустому файлу трудно что-то проверить и подсказать
Александр, скажите, вы можете платно помочь решить данную задачу?
Да. напишите мне в личку master@modxclub.ru, обсудим

Добавить комментарий