modImporter. Настройка импорта в minishop2 из 1С

В прошлой статье я писал про импорт из Excel/XLSX. Вчера-сегодня мы настраивали выгрузку из 1С. Правда по этому проекту пока не настраивали прямую выгрузку на сайт непосредственно из 1С (а просто загружали сформированный одинэской файл), но проблем с этим не должно быть, modImporter изначально имел в себе механизмы работы с 1С и до этого не раз тесты проводились успешно. К слову сказать, сейчас мы взялись переносить довольно крупный магазин с битрикса на MODX, так что в ближайшем будущем 1С-импорт будет прокачен как следует, в том числе и выгрузка заказов с сайта в саму 1С и обновление статусов заказов на сайте со стороны 1С.

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

К слову о производителях: Василий, хорошо бы производителям добавить колонку Артикул, а то сейчас не за что уцепиться, чтобы завязать их с импортом по ключу. Пришлось добавить поле плагином.
$modx->loadClass('msVendor');
		$modx->map['msVendor']['fields']['externalKey'] = null;
		$modx->map['msVendor']['fieldMeta']['externalKey'] = array(
			'dbtype' => 'varchar',
			'precision' => 36, 
			'phptype' => 'string',
			'null' => true,
			'default' => null,
		);
        
        $modx->loadClass('modImporterObject');
		$modx->map['modImporterObject']['fields']['vendor'] = null;
		$modx->map['modImporterObject']['fieldMeta']['vendor'] = array(
			'dbtype' => 'varchar',
			'precision' => 36, 
			'phptype' => 'string',
			'null' => true,
			'default' => null,
		);
После создания плагина надо создать колонку в msVendor. Для этого выполняем в консоли скрипт:
$manager = $modx->getManager();
$manager->addField("msVendor", "externalKey");
Собственно, опять-таки много расписывать я ничего не буду (все самое ценное в представленном файле). Но если у кого вопросы возникнут — спрашивайте.

И еще момент: покупайте, пока цена не выросла :) Уже отправил запрос на поднятие цены до 1990 рэ. Через неделю поднимется до 2990. Дешевле уже стоить не будет. И бесплатные консультации заканчиваются.

UPD: Если вы планируете использовать именно этот приведенный файл импорта, надо создать плагин на событие OnMODXInit (код приведен выше) и в таблице ms2_vendors дописать новую колонку externalKey varchar 36.
Fi1osof
24 января 2016, 18:22
modx.pro
7
3 941
+4
Поблагодарить автора Отправить деньги

Комментарии: 20

but1head
24 января 2016, 23:50
0
Если выгрузку можно будет легко кастомизировать — беру. Ибо у большинства клиентов товары в 1с = характеристикам (размер), а сами товары — категории.

Пример:

Саморезы (папка)
— Саморез кровельный DIN777 (папка)
— — Саморез кровельный DIN777 5х100 (товар)
— — Саморез кровельный DIN777 5х150 (товар)
— — Саморез кровельный DIN777 5х200 (товар)

А по факту это все характеристики.
    Fi1osof
    25 января 2016, 00:00
    0
    У большинства, но не у всех. Хотя на счет вариация я согласен — в том же моем подопечном на битриксе товары Товар_1 5 кг, Товар_2 10 кг, Товар_3 20 кг. То есть они и в 1С заведены отдельными позициями. Там для группировки на стороне 1С в каждом товаре прописана своя группа и первый же товар, для которого нет ни одного товара по группе, создается, а все остальные к нему вариациями идут.

    По вашему случаю: берите, помогу настроить. Судя по всему у вас можно оттолкнуться от вложенности — если у этой папки нет подпапок, то это товар. А товары прогружать как вариации к товарам. Это не сложно сделать. В том же приведенном примере есть исключение первого уровня (там по сути были производители, и они не нужны были в корне каталога на сайте).
    Категории-папки пойдут во временной таблице с типом category, Категории-товары — product, Товары-вариации — variable. У каждого будет свой артикул и parent. По товару-вариации, к примеру, легко получить сам товар.
      but1head
      25 января 2016, 00:03
      0
      Под след проект приобрету, пока что с горем пополам работает на прошлой вариации импорта. Спасибо)
        Fi1osof
        25 января 2016, 00:04
        0
        Не за что.
Игорь Ткачук
25 января 2016, 10:58
0
Чтоб убрать заглушку при импорте нужно переопределить метод StepWriteTmpData? Какие еще нужно сделать изменения кроме этого файла? У меня что не получается.
    Fi1osof
    25 января 2016, 11:12
    0
    Очень подробно все расписано здесь.
    Создается только 3 новых сущности:
    1. Расширяющий процессор, реализующий тонкости именно вашего импорта.
    2. Контроллер, в котором прописан вызов этого вашего процессора.
    3. Пункт меню, ссылающийся на ваш контроллер.

    Приведите код вашего переопределяющего метода StepWriteTmpData.
      Игорь Ткачук
      25 января 2016, 11:29
      0
      Сущности я создал. все работает. Взял файл Здесь. Как вы загружаете xml файл для импорта?
        Fi1osof
        25 января 2016, 11:45
        0
        Если выгрузка из 1С идет, то там сама 1С шлет файл на сервер. Если вы вручную прогружаете, то файл надо соответственно самому загружать. Если у вас zip-архив, то в версии 1.1.1 появилась распаковка архивов joxi.ru/ZrJVWD0u1ba4Vr
        Fi1osof
        25 января 2016, 13:40
        0
        Как дела продвигаются? Вопросы решились?
          Игорь Ткачук
          25 января 2016, 13:57
          0
          С csv все понятно импорт работает. А с 1с файл import.xml с этим процесором не работает. Файл с формы не подхватывает. скрин
            Fi1osof
            25 января 2016, 14:18
            0
            В данном скрине самой ошибки не видно, есть только остановившийся процесс. Пришлите мне в личку доступ к админке, я посмотрю что там у вас.
            Fi1osof
            25 января 2016, 14:46
            0
            У вас просто не инсталлирован XMLReader для php joxi.ru/V2Vnk1gs0BdaQ2
Игорь Ткачук
25 января 2016, 15:21
0
Спасибо огромное все работает. А по yml есть какие то наработки?
Игорь Ткачук
07 февраля 2016, 12:19
0
Yml хорошо работает. Но иногда когда большой файл влетает yadi.sk/i/CyhWHpR1oRsKs. Не подскажете как настроить php и mysql на большою производительность?
    Fi1osof
    07 февраля 2016, 15:35
    0
    У вас там по 30 товаров импортируется. Просто измените параметр на 20, если на 30-ти слетает.
    P.S. скоро добавлю кнопку «Продолжить выполнение», чтобы можно было запустить дальше прервавшийся импорт.
    Fi1osof
    07 февраля 2016, 15:37
    0
    Просто у вас там скорее всего картинки тоже импортируются, а они при импорте на лету минишопом пережимаются, а это отнимает не мало времени.
    Вообще имеет смысл ввести проверку не только по указанному лимиту товаров, но и по уже затраченному времени, чтобы при близком пороге так же отправлять дальше на пошаговое выполнение. Скоро тоже сделаю это.
    Андрей
    18 ноября 2017, 21:41
    0
    Как я понял по ссылке только чтение данных — могли бы вы выложить свой файл, импорта с уже настроенным сохранением?
Игорь Ткачук
18 февраля 2016, 21:24
0
А можно настроить cron? допустим что раз в день выгружало.
    Лев Вербицкий
    18 февраля 2016, 23:01
    0
    Пока из коробки этого нету, но если вы купите пакет. то поможем настроить)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
20