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
5 472
+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