Компонент modImporter. Настройка импорта на сайт.
Месяц назад мы обсуждали какие компоненты кому нужны. Тогда самым популярным запросом оказался импорт/экспорт минишоп-эксель. Задача эта конечно же не простая, тем не менее я готов сегодня представить первую версию компонента modImporter.
Компонент еще очень далек от конечной версии (хочется добавить в процессе гораздо больше ридеров (CSX, XLS (XLSX уже есть), просто файлы (для импорта статических сайтов) и прочее)). Но сам по себе общий механизм все-таки уже готов и пара кейсов у меня уже имеется. А всем прикупившим пакет я гарантирую свою личную помощь в первичной настройке.
Итак, что же на сегодня имеется? Изначально я ставил перед собой несколько задач, которые обязательно должны были быть выполнены:
1. Пошаговость. Чтобы не было ограничения по таймлимиту 30 секунд, а можно было импортировать этапами.
2. Экономность в потреблении оперативки. Здесь от части зависело от решения первой задачи, но и правильная подборка ридеров тоже имеет значение (к примеру, поточный XMLReader вместо обычного SimpleXML).
3. Расширяемость. Абсолютно универсальными такие вещи маловероятно сделать, потому важно было предусмотреть такой вариант расширяемости, чтобы и базовый функционал не приходилось трогать (чтобы можно было обновления пакета накатывать), и при этом индивидуальный функционал без особых сложностей допиливать.
В целом, как мне кажется, все эти задачи у меня получилось решить.
Для решения первой задачи я взял и допилил Ajax-импортер, о котором рассказывал уже давно. Во многом интерфейс modImporter остался таким же. Но JS я чуть-чуть допилил и полностью переписал основной процессор, который и обеспечивает пошаговость и базовый функционал.
Ну а теперь лучше сразу рассмотреть готовые кейсы с примерами кода, чтобы примерно оценить что это такое и для чего он годится.
Кейс 1. Выгрузка из YML.
Вот здесь обсуждение, картинки, пример полученного кода.
Там просто была базовая обкатка, потому я не писал само создание и обновление товаров в магазине, но как я и писал, это уже меньшая задача, так как когда данные получены, нет проблем проверить наличие товаров в базе и выполнить процессоры resource/create || resource/update.
Кейс 2. Выгрузка из Excel/XLSX.
А вот это уже более полный вариант, созданием/обновлением категорий, товаров, остатков и цен (да-да, здесь не только товары-цены один-к-одному, но и остатки-цены (по несколько на товар)).

На выходе получился вот такой код: gist.github.com/Fi1osof/3ded17bd770303500f3a
Читайте сами код и решайте на сколько там все сложно или не сложно.
В итоге у клиента результат импорта выглядит вот так:


С компонентом импорт ему был записан за 1 день, вот только вот этот файл. Все остальное необходимое идет с самим modImporter.
Плюшки.
А теперь о том, какие, на мой взгляд, интересные плюшки имеются в компоненте.
1. Удаление/создание таблиц для временных данных в момент инициализации импорта.
На мой взгляд нет смысла пытаться продумать универсальную и конечную структуру таблицы под временные данные. Гораздо логичней на лету создавать таблицу с такой структурой, которая максимально вам подойдет (это особенно актуально при импорте десятков тысяч товаров и более). От того, на сколько правильно выбраны типы данных в колонках таблиц, будет зависеть существенно скорость выполнения импорта. А кому-то может и несколько таблиц понадобится. Это все можно. А еще можно легко изменить структуру базовой таблицы способом, предложенным Василием, так что можно добавить в таблицу свои поля (или изменить имеющиеся), не залезая в код компонента.
2. Изменение типов данных некоторых колонок через системные настройки.
Да, я ведь тоже всяко экспериментирую с xPDO, и вот тут сидел такой и думал, а какую же длину задать ключевым колонкам в таблице и какую длину? Ну как тут угадать? У кого-то ключ будет 32 символа MD5-строка, у кого-то 64, у кого-то 255, а у кого-то вообще int(10). И вот тут я подумал, а почему не вынести это в настройки? Вынес. А в map-файл прописал их. Вот что получилось:
3. Дополнительное поле modResource::externalKey.
Так как курс на универсальность (нет четкой направленности на минишоп, шопмодикс или что-то другое), решил сразу застолбить колонку под артикул в самом документе. На это есть ряд причин против идеи создавать дополнительную таблицу для артикулов или ТВ-поля использовать. Но без проблем под эти цели использовать родные актикул-поля выбранных eCommerce-модулей.
По цене: сейчас выставил за 1490 рублей, но скорее всего цена будет поднята уже через недельку, при чем значительно, так что закупайтесь сразу, если есть хоть какой-то интерес. Всем прикупившим гарантируется информационная поддержка и помощь в первичной настройке, особенно на новых типах источников (включая МойСклад и т.п.).
UPD: Есть еще серьезный момент в данном компоненте: большое внимание было уделено средствам отладки. Компонент пошаговый, но каждый шаг можно вызвать в консоли и видеть результат.




Есть еще режим debug с записью обращений в MODX-логи (это чтобы дебажить запросы со сторонних сервисов).
Купить в modstore.pro
Компонент еще очень далек от конечной версии (хочется добавить в процессе гораздо больше ридеров (CSX, XLS (XLSX уже есть), просто файлы (для импорта статических сайтов) и прочее)). Но сам по себе общий механизм все-таки уже готов и пара кейсов у меня уже имеется. А всем прикупившим пакет я гарантирую свою личную помощь в первичной настройке.
Итак, что же на сегодня имеется? Изначально я ставил перед собой несколько задач, которые обязательно должны были быть выполнены:
1. Пошаговость. Чтобы не было ограничения по таймлимиту 30 секунд, а можно было импортировать этапами.
2. Экономность в потреблении оперативки. Здесь от части зависело от решения первой задачи, но и правильная подборка ридеров тоже имеет значение (к примеру, поточный XMLReader вместо обычного SimpleXML).
3. Расширяемость. Абсолютно универсальными такие вещи маловероятно сделать, потому важно было предусмотреть такой вариант расширяемости, чтобы и базовый функционал не приходилось трогать (чтобы можно было обновления пакета накатывать), и при этом индивидуальный функционал без особых сложностей допиливать.
В целом, как мне кажется, все эти задачи у меня получилось решить.
Для решения первой задачи я взял и допилил Ajax-импортер, о котором рассказывал уже давно. Во многом интерфейс modImporter остался таким же. Но JS я чуть-чуть допилил и полностью переписал основной процессор, который и обеспечивает пошаговость и базовый функционал.
Ну а теперь лучше сразу рассмотреть готовые кейсы с примерами кода, чтобы примерно оценить что это такое и для чего он годится.
Кейс 1. Выгрузка из YML.
Вот здесь обсуждение, картинки, пример полученного кода.
Там просто была базовая обкатка, потому я не писал само создание и обновление товаров в магазине, но как я и писал, это уже меньшая задача, так как когда данные получены, нет проблем проверить наличие товаров в базе и выполнить процессоры resource/create || resource/update.
Кейс 2. Выгрузка из Excel/XLSX.
А вот это уже более полный вариант, созданием/обновлением категорий, товаров, остатков и цен (да-да, здесь не только товары-цены один-к-одному, но и остатки-цены (по несколько на товар)).
На выходе получился вот такой код: gist.github.com/Fi1osof/3ded17bd770303500f3a
Читайте сами код и решайте на сколько там все сложно или не сложно.
В итоге у клиента результат импорта выглядит вот так:
С компонентом импорт ему был записан за 1 день, вот только вот этот файл. Все остальное необходимое идет с самим modImporter.
Плюшки.
А теперь о том, какие, на мой взгляд, интересные плюшки имеются в компоненте.
1. Удаление/создание таблиц для временных данных в момент инициализации импорта.
На мой взгляд нет смысла пытаться продумать универсальную и конечную структуру таблицы под временные данные. Гораздо логичней на лету создавать таблицу с такой структурой, которая максимально вам подойдет (это особенно актуально при импорте десятков тысяч товаров и более). От того, на сколько правильно выбраны типы данных в колонках таблиц, будет зависеть существенно скорость выполнения импорта. А кому-то может и несколько таблиц понадобится. Это все можно. А еще можно легко изменить структуру базовой таблицы способом, предложенным Василием, так что можно добавить в таблицу свои поля (или изменить имеющиеся), не залезая в код компонента.
2. Изменение типов данных некоторых колонок через системные настройки.
Да, я ведь тоже всяко экспериментирую с xPDO, и вот тут сидел такой и думал, а какую же длину задать ключевым колонкам в таблице и какую длину? Ну как тут угадать? У кого-то ключ будет 32 символа MD5-строка, у кого-то 64, у кого-то 255, а у кого-то вообще int(10). И вот тут я подумал, а почему не вынести это в настройки? Вынес. А в map-файл прописал их. Вот что получилось:
<?php
$externalKeyLength = $this->getOption("modimporter.external_key_length", null, 32);
$externalKeyType = $this->getOption("modimporter.external_key_type", null, 'varchar');
$externalKeyPhpType = $externalKeyType == "int" ? "integer" : "string";
$xpdo_meta_map['modImporterObject']= array (
'package' => 'modImporter',
'version' => '1.1',
'table' => 'modimporter_objects',
'extends' => 'xPDOSimpleObject',
'fields' =>
array (
'tmp_object_type' => NULL,
'tmp_external_key' => '',
'tmp_resource_id' => NULL,
'tmp_parent' => NULL,
............
),
'fieldMeta' =>
array (
'tmp_object_type' =>
array (
'dbtype' => 'varchar',
'precision' => '50',
'phptype' => 'string',
'null' => false,
),
'tmp_external_key' =>
array (
'dbtype' => $externalKeyType,
'precision' => $externalKeyLength,
'phptype' => $externalKeyPhpType,
'null' => true,
'index' => 'index',
),
'tmp_resource_id' =>
array (
'dbtype' => 'int',
'attributes' => 'unsigned',
'phptype' => 'integer',
'null' => true,
'default' => null,
'index' => 'index',
),
'tmp_parent' =>
array (
'dbtype' => $externalKeyType,
'precision' => $externalKeyLength,
'phptype' => $externalKeyPhpType,
'null' => false,
'index' => 'index',
),...........
),
);И работает :) То есть изменил системные настройки, запустил импортер, таблицы дропнулась и создалась новая с нужным типом и длиной полей. Основные варианты: varchar|int.3. Дополнительное поле modResource::externalKey.
Так как курс на универсальность (нет четкой направленности на минишоп, шопмодикс или что-то другое), решил сразу застолбить колонку под артикул в самом документе. На это есть ряд причин против идеи создавать дополнительную таблицу для артикулов или ТВ-поля использовать. Но без проблем под эти цели использовать родные актикул-поля выбранных eCommerce-модулей.
По цене: сейчас выставил за 1490 рублей, но скорее всего цена будет поднята уже через недельку, при чем значительно, так что закупайтесь сразу, если есть хоть какой-то интерес. Всем прикупившим гарантируется информационная поддержка и помощь в первичной настройке, особенно на новых типах источников (включая МойСклад и т.п.).
UPD: Есть еще серьезный момент в данном компоненте: большое внимание было уделено средствам отладки. Компонент пошаговый, но каждый шаг можно вызвать в консоли и видеть результат.
Есть еще режим debug с записью обращений в MODX-логи (это чтобы дебажить запросы со сторонних сервисов).
Купить в modstore.pro
Комментарии: 82
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Это какой-то странный баг в Tickets, который я в своё время так и не отловил.
Fi1osofЯ уверен, у нас любые подобные вопросы будут решаемы.
Я не нашел свежих тикетов в «Тех. поддержке» mSync. Пришлите, пожалуйста, ссылку на вопрос, где автор отказался вам помочь — если это так — примем меры.
Писал тикет «Пишет „нет авторизации на сайте“» — мне сказали «присылать тз на почту» и «Я с 1С не знаком.», то есть банальные отписки…
и 7 сентября я написал «Здравствуйте!
Не могу настроить правильную синхронизацию с сервером, картинки не загружаются. Можете помочь?
С уважением, Святослав!
Святослав, 07 сентября 2015, 21:33 » — ответа не поступило, можете проверить modstore.pro/cabinet/tickets/616/1872/…
Думаю, если опросить всех покупателей msklad, то 9 из 10 скажут, что им пришлось все дорабатывать, а при обновлении 1с, снова переделывать и т.п.
Спасибо за реакцию!
Нет, это не так. Большинство вопросов в тех. поддержке по данному компоненту разрешаются.
Я пока просто попрошу автора повнимательней смотреть за вашими тикетами.
В любом случае — если обнаружите проблемы и будут разногласия с авторами компонентов — пишите, пожалуйста — будем разбираться!
Fi1osofFi1osofТак или иначе, если у вас проект в связке 1С еще актуален, могу предложить помощь в переводе его на modImporter бесплатно. С вас только приобретение самого пакета. Для меня просто интерес на одном проекте увидеть разницу в сравнении.
Fi1osofПредложили помощь за сумму в 2 раз большую, чем компонент.
Fi1osofИ там вы писали просто «большую», а тут пишите про «в два раза больше». Это вы когда его покупали? Он уже как месяца два не стоит 990 рублей, а недели две как стоит 1990 (в марте до 2990 подорожает).
Если вы купите тот же mSearch и сами не сможете его установить, будете искать бесплатную помощь?
Fi1osofВасилиса (или Александр), когда я посылаю, это видно четко. Я написал подробные статьи, а вам дал ссылки на них. И это вы называет вас послали? Еще раз: запросите в modstore денежки обратно и больше не отвлекайте, пожалуйста.
Fi1osofFi1osofНачали работать через импорт через csv, и тут 1сник не смог ничего сделать))
Так что купил и не знаю, что с ним делать))))
Николай, когда ожидается публикация продукта?
хочу с yml, наконец-то, что придумать.
Хожу около этого файла уже полтора года)))
Fi1osofFi1osofЭто принесет больше пользы, так как есть толковые люди.
Fi1osofПри переходе в меню компонента Из CSV, ошибка:
Похожие ошибки при переходе в меню ZIp (.../import/zip/unzip.php ), XLSX (.../xlsx/index.php).
XML и 1C предлагают загрузить файл, но я планировал опробовать на CSV.
Fi1osofНет, с установкой все ОК. Просто как я и писал в топике, пока выгрузка только из XLSX и XML. Те пункты меню пока пустышки. А контроллеры-заглушки я пока не сделал, чтобы эти ошибки торопили меня написать и эти контроллеры :) Очень скоро они появятся. Сегодня я не успеваю уже написать «быстрый старт», но завтра точно опубликую. Будет описан четкий сценарий добавления собственного импортера.
В магазине пакет отключили? Там опять 404-я.
Fi1osofCSV на этой неделе выложу, у меня есть наработки. Вообще обновленный пакет будет интересные плюшки иметь, пока не буду раскрывать какие, но они очень полезные будут :) Сразу еще на 500 рэ подорожает))
Т.е., скорее, вопрос в том, будет ли компонент удовлетворять потребности простых менеджеров сайта? Что бы настроить им его раз под какой то формат ввода ( обновления\удаления) и не переживать вплоть до какого то изменения их задач.
Fi1osofВроде просто нет директорий csv и т.п.
Переустановил. Все так же.
Fi1osofFi1osofКак только что будет, обязательно отпишусь.
Замечательно, что многие расширения, платные или бесплатные активно развиваются. Но бывает, что в топике, анонсирующем выход расширения, по комментариям вылавливать актуальные изменения не всегда удобно.
Понятно, все время занимает, которого всем и всегда не хватает))
Fi1osofFi1osofFi1osofFi1osofПо 1С и остальному. не все сразу. Все, что бесплатно (не считая стоимости пакета), все это будет появляться постепенно по мере того, как будет у кого-то разрабатываться. Если кому-то срочно нужен какой-то определенный функционал или тип выгрузки, то уже будет выполняться за деньги. Из этого массовый функционал будет попадать в компонент.
Так как у нас довольно много запросов на подобные услуги, то функционал будет довольно активно прокачиваться.
P.S. Интеграцию с 1С мы уже не раз выполняли, так что 1С довольно скоро появится довольно полная версия.
Fi1osofТак вот — в таком виде этот модуль просто нельзя продавать. Нужно или включить в цену стоимость допила от разработчика, или выкладывать ясные и проверенные инструкции для различных кейсов. Лучше всего было бы дать возможность поиграться с модулем на модхосте.
Господа, если прочитаете этот комментарий, сто раз подумайте, сумеете ли вы самостоятельно настроить этот модуль.
P.S. Было интересно, кто «минусит» комментарии Николая, теперь ясно — это такие же разочарованные покупатели модуля как и я.
Fi1osofВключить эту сумму в стоимость не могу. Во-первых, кому-то знаний хватит чтобы настроить, а я с него должен брать денег как с незнающего. Не справедливо. Во-вторых, у кого-то очень хитрая настройка может потребоваться, там и 10 000 за настройку может не хватить.
2. Прежде чем покупать, вы могли написать запрос с описанием ваших задач и мы бы ответили подходит вам компонент в таком виде или нет (или с какими оговорками).
3. 3.1 Скорее всего правильней было бы писать отзывом именно к компоненту на модсторе? Там бы виднее было бы. Или может вы и не покупали его вовсе?
3.2 Вы не первый с такого рода отзывом, и могли прочитать этот отзыв и ничего не покупать (если покупали), а пройти дальше. Чем вам не предупреждение.
4. Вы вообще хоть какой-то запрос в саппорт нам делали? На сколько я понимаю, совершенно нет.
2. Для моей задачи этот модуль то что нужно — если верить первому скриншоту.
3. Покупал, чесслово. Причем на модуль бюджет выделялся с учетом платной настройки, но куплен модуль был в марте, со всеми вытекающими :)
4. До саппорта ещё не добрался, пока пытаюсь сам разобраться — желание есть. Если разберусь — похвалю вас и обязательно сделаю инструкцию по своей конкретной задаче и поделюсь с другими пользователями, чего и вам желаю.
Fi1osofНу ОК, антиреклама тоже реклама)) Ждем продолжения.
Fi1osofFi1osofЯ так понимаю, вы справились с этим методом сноса и установки пакета с нуля?
И сразу информация на счет поддержки минишопа:
По умолчанию этот экспорт пока не выгружает и не обновляет допполя минишопа (тот хранит данные товаров в отдельных таблицах). Вам надо расширить экспорт-импорт процессоры export/pair/xlsx и import/pair/xlsx и прописать в них эти допполя, или подождите когда вернусь из отпуска и выпущу обновленную версию, она будет поддерживать минишоп из коробки (числу к 5-10-ому выпущу).
Fi1osofВообще надо будет добавить возможность в настройках перечислять выгружаемые колонки, но пока не нарыли функцию получения наименования колонки в Экселе по порядковому номеру, но или нароем все-таки, или сами напишем. Пока же наглядный кейс как не сложно добавить в выгрузку дополнительные колонки, включая дополнительные опции товаров:
Добавляем кастомный процессор экспорта: joxi.ru/brRDO4pfQXDZN2
Там переопределяем метод и добавляем несколько строчек:
joxi.ru/KAgK9pXIglDBPA
joxi.ru/LmGVQx0uR6GX0r
Fi1osofprntscr.com/cgpae0
Подскажите, где поправить эту штуку?))
Fi1osofFi1osofFi1osofИнтересует исправлен ли в modImporter этот баг:
github.com/modxcms/revolution/issues/5965
Fi1osofВообще мне эта особенность данного процессора тоже никогда не нравилась, но вряд ли это будут фиксить, как видно тикет просто закрыт. Я в импортере на апдейт обычно в процессор отправляю только ресурс, без TVs=>1 и самих ТВшек, а потом после обновления процессором беру уже объект ресурса и на нем выполняю апдейт нужных ТВшек через $resource->setTVValue(). Вообще там очень много тонкостей, где-то вполне может понадобиться индивидуальный подход.
Меня попросили сюда писать вопросы, пишу ))
Стоит задача для связки с платформой 1С с конфигурацией ШтрихМ, что требуется:
1) Обмне с остатками по товарам, что бы с 1С выливались остатки товаров.
2) Синхронизация с заказами, когда сделан заказ, что бы при импорте с сайта в 1С она понимала что заказали и сформировала счет у себя для дальнейшей работы и желательно обратно что бы на сайте не отмечать что оплатили и не требует внимания.
Сам сайт не имеет модулей платежных, он просто собирает заказы а вся работа происходит по безналичному расчету. И напоминаю что конфигурация ШрихМ
Вроде получилось коротко расписать :) и попробую щас предложением написать, если что не так написал:
Нам нужно что бы сайт брал данные по количеству товаров с 1С и отдовал данные по заказам, после обработки 1С готова будет выплевывать оплаченые и неоплаченые заказми. Модуль должен понимать что если он уже оплачен больше к нему не возращаться и не брать в обмен с собой.
Думаю ответы на этот комент решит очень много вопрос от заказчиков :)))
Спасбио за понимаю и благодарю за помощь.
Ответ не получил было сказано что пока не до этого и много работы нужно будет проделать. Подскажите кто с таким сталкивался, если поставить вместо ШрихМ что то типо склад, УТ, бух получиться ето все запустить?
Я думаю этот вопрос очень актуален, так как это нужно большей части магазинов.
Fi1osofПРошу прощения если отвлек.
Читайте раздел — Импорт для msOptionsPrice2.
Спасибо за ответы