Exchange1c for Shopaholic
Внимание! В связи с санкциями плагин не доступен в маркетплейсе October CMS. Вы можете связаться с нами для получения лицензионной копии плагина. Поможем в установке бесплатно!
Краткое описание
Плагин для реализации типового обмена 1с с возможностью расширения парсеров через события. Поддерживает прямой обмен и обмен через файлы (zip архивы). Может использоваться как для частичного, так и для полного обмена.
В комплекте присутствуют сервисные, консольные утилиты. (подробнее в документации).
Стандартные парсеры из коробки обрабатывают: Категории, Свойства, Картинки, Товары, Предложения, Цены, Типы цен. Есть возможность назначить любую доступную цену в качестве основной.
Для работы необходим October CMS с установленным Shopaholic.
Можно адаптировать под другие платформы. Для этого нужно только переписать парсеры и консольные утилиты. Классы окружения написаны с использованием нативных функций php.
Вводная для разработчиков
Важно: Плагин работает нормально из коробки. Однако я считаю, что разработчику важно знать, некоторые нюансы. Ниже я приведу объемную информацию по процессу импорта.
В плагине есть два шлюза.
1. Веб-шлюз - используется для прямого http обмена. Основная его задача состоит в том, что-бы получить все файлы, которые отдаст 1с, упаковать их в нужную директорию и по окончанию работы запустить файловый шлюз.
Я не пошел по пути садомии и не стал реализовывать импорт по указке 1с. Вместо этого я только получаю от нее файлы и посылаю success. Остальное дело файлового шлюза.
2. Файловый шлюз - используется непосредственно для обработки выгрузки, парсинга товаров и тд.
В плагине есть простая проверка на активный импорт, которая не позволяет запустить 1с параллельно еще один импорт. Реализовано просто.
Веб-шлюз перед тем как начать импорт проверяет наличие файлов в рабочей директории. Если они есть то 1с получает в ответ process Импорт уже запущен. После импорта рабочая директория очищается. И можно накатывать обмен еще раз.
Обратите внимание, что в настройках плагина во вкладке Для разработчиков есть настройка - Не удалять файлы после импорта.
Если она активна, то удалить файлы придется вручную. Используйте эту настройку только для тестирования и отладки. Это полезно если вы захотите расширить парсеры.
Я не садист, поэтому специально для вас есть команда для автоматической очистки файлов обмена:
php artisan exchange1c:clear
По умолчанию прямой импорт работает синхронно. То есть я заставляю 1с ожидать полного завершения импорта. Такая работа более понятна для администраторов 1с.
Но на некоторых конфигурациях хостингов, особенно дешевых это может не работать, так как хостер может запретить менять таймаут для php скриптов программно.
На таких хостингах 1с может получить ошибку импорта, однако это будет не совсем верно. Импорт все равно будет выполнен. Такое волшебное поведение работает за счет:
ignore_user_abort(true);
Однако даже для таких хостингов я нашел решение как подавить ошибку.
Вы можете во вкладке Для разработчиков на странице настройки плагина активировать настройку - Работать в фоновом режиме.
В таком случае 1с после передачи всех файлов получит success и закончит импорт, а плагин через exec() запустит artisan команду для импорта.
Важно!!! Для работы в фоновом режиме у artisan файла должны быть права 755
Всегда смотрите системный лог October CMS. Вот так выглядит системный лог от начала до конца выгрузки:
В строке Запись системного лога находится лог выгрузки. Он содержит только предупреждения и ошибки. Это связано с тем, что в October CMS не влазит полный лог. Поэтому посмотреть полные логи в файле по пути: /storage/temp/public/import/import.log
Внимание! В связи с санкциями плагин не доступен в маркетплейсе October CMS. Вы можете связаться с нами для получения лицензионной копии плагина. Поможем в установке бесплатно!
Как настроить импорт через прямой обмен?
1. Для запуска прямого обмена в разделе Настройки - Настройки обмена 1с необходимо указать логин и пароль.
2. Далее необходимо в 1с в разделе CRM - Интернет-магазин добавить новую интеграцию. Во вкладке авторизация вы должны указать логин и пароль со страницы настроек. В качестве url указать:
http://example.ru/api/1c-exchange где example.ru это домен вашего сайта.
Нажимаем кнопку проверить соединение. Если соединение успешно, то можете настраивать выгрузку дальше по своим потребностям.
3. После настройки нажимаем Синхронизация данных - Выполнить полный обмен.
Сердечно поздравляю, вы наладили прямой обмен.
Как настроить обмен через файловый шлюз
Примечание: Файловый шлюз намного быстрее чем веб-шлюз. Это связано с тем что 1с передает каждый файл (картинки) отдельным запросом. Поэтому для тяжелых выгрузок будет предпочтительнее настроить его.
1. Сделайте выгрузку в файлы в 1с. Запакуйте файлы в zip архив с любым именем. Убедитесь что после распаковки архива у вас появляется каталог с любым именем, внутри него должны быть файлы выгрузки.
2. Передайте архив на сервер в каталог /storage/temp/public/import. Если такого каталога нет, то создайте его.
3. Подключитесь через ssh терминал к своему серверу и в корне хоста выполните команду:
php artisan exchange1c:import
Если вам нужно автоматизировать процесс то я рекомендую использовать bash или powershell скрипты в зависимости от ОС сервера.
Все эти действия реализуем с скрипте и ставим в cron на выполнение. Благо человечество придумало для нас такие команды как:
Запаковать в zip
zip -r webdata.zip webdata
Передать файл webdata.zip на сервер в каталог /storage/temp/public/import
scp webdata.zip user@server:/storage/temp/public/import
Открыть ssh соединение с сервером и запустить команду php artisan exchange1c:import
ssh user@server /usr/bin/php artisan exchange1c:import
В общем проблем быть не должно. Прошу извинить за очевидные вещи, но меня реально часто спрашивают как это сделать.
Консольные утилиты
Запуск импорта:
php artisan exchange1c:import
Очистка рабочего каталога с выгрузкой:
php artisan exchange1c:clear
Удаляет файлы выгрузки. Удобно использовать вместе с настройкой не удалять файлы после импорта. Пригодиться для разработки.
Очистка изображений сирот:
php artisan exchange1c:orphans
У October CMS есть стандартная команда php artisan october:utl purge orphans и отдельно php artisan october:utl purge uploads. По сути моя команда делает то же самое, но после ввода одной команды и не спрашивает подтверждения yes и не упирается в memory_limit на слабых хостах.
Очистка данных каталога:
php artisan exchange1c:wipe
Данная команда используется только для разработки и тестирования. Удаляет категории, товары, свойства и др. модели согласно настройкам на странице плагина. В некоторых случаях полезно для импорта с нуля.
Расширение парсеров:
В плагине всего 2 парсера. Import и Offers, соответственно один парсит import.xml, а другой offers.xml. Еще есть общий парсер Common. Он содержит общие методы, например импорт картинок. Общий парсер не расширяется, но вы можете использовать его методы в своих расширениях.
Пример использования событий
1. Событие импорт категорий.
Event::listen('catdesign.exchange1c.import.categories', function($category) {
// $category - данные категории из файла import.xml
$categoryModel = $commonParser->getCategoryByExternalId($category->Ид);
});
2. Событие импорт товаров:
Event::listen('catdesign.exchange1c.import.products', function($product) {
// $product - данные товара из файла import.xml
// Пример использования вспомогательного парсера
$commonParser = new \CatDesign\Exchange1C\Classes\Parsers\Common()
$productModel = $commonParser->getProductByExternalId($product->Ид);
// Общие методы для моделей Product и Offer
$commonParser->importImages($productModel, $product);
$commonParser->importPropertyValue($productModel, $product);
});
3. Событие импорт предложений:
Event::listen('catdesign.exchange1c.import.offers', function($offer) {
// $offer - данные предложения из файла offers.xml
// Пример использования вспомогательного парсера
$commonParser = new \CatDesign\Exchange1C\Classes\Parsers\Common()
$offerModel = $commonParser->getOfferByExternalId($offer->Ид);
// Общие методы для моделей Product и Offer
$commonParser->importImages($offerModel, $offer);
$commonParser->importPropertyValue($offerModel, $offer);
});
4. Событие импорт типов цен:
Event::listen('catdesign.exchange1c.import.price_types', function($priceType) {
// $priceType - данные типа цен из файла offers.xml
$priceTypeModel = $commonParser->getPriceTypeByExternalId($priceType->Ид);
});
5. Событие импорт свойств:
Event::listen('catdesign.exchange1c.import.properties', function($property) {
// $property - данные совйства из файла import.xml или offers.xml
$propertyModel = $commonParser->getPropertyByExternalId($property->Ид);
});
Данные события в качестве аргументов получают данные 1 сущности из текущей итерации цикла. Если вы подпишитесь на событие вам придется написать полностью всю реализацию импорта для этого события.
При разработке своих реализаций смотрите эталонные. Они находяться в 3 парсерах в каталоге /plugins/catdesign/exchange1c/classes/parsers.
Дополнительные настройки для разработчиков.
Данные настройки находятся во вкладке Для разработчиков на странице настройки плагина.
1. Работать в фоновом режиме - при включении плагин не будет заставлять ожидать 1с завершения импорта. Вместо этого он отправит 1с success и запустит в фоновом режиме парсер. Используйте в том случае если в 1с получаете ошибку.
Важно!!! Для работы в фоновом режиме у artisan файла должны быть права 755
2. Закрыть веб-шлюз - отключает работу веб-шлюза. Используйте если произошла ошибка и 1с ddosит ваш сервер запросами. Или что бы прервать импорт, полезно при разработке.
3. Не удалять файлы выгрузки после обработки - если активировать, то рабочая директория с выгрузкой не будет очищаться. Используйте только для разработки (проверки файлов).
Версии
История версий и анонс дополнений. Оставьте свои отзыв во вкладке поддержка. Все интересные идеи будут рассмотрены и по возможности реализованы.
Версия 1.1.0
Импорт номенклатуры. Возможность расширения.
Версия 1.1.3
Реализовать дополнительные консольные утилиты.
Версия 1.2.0
Экспорт заказов. В планах на ближайшее время.
Отправить запрос
Принимаем баг-репорты. Вы можете отправить нам запрос на получение помощи или предложение по улучшению функционала. Все сообщения обрабатываются в течении 24 часов.