Импорт/экcпорт ресурсов MODXRevo / MODX3 и товаров miniShop2 / miniShop3.
Основные свойства
- Работа с файлами XLS/XLSX/CSV.
- Поддержка PHP 7.4, 8.*
- Конфигурирование через файлы.
- Поддержка полей товаров miniShop2/miniShop3, включая опции категорий, производителя, галерею товара и т. д.
- Работа с MIGX-полями (настраиваемое форматирование).
- Поддержка контейнеров Collections.
- Возможность пакетной загрузки.
- Возможность предварительного тестирования перед импортом.
- Сохранение резервной копии базы перед импортом и восстановление данных при необходимости.
- Системные события для плагинов.
- Запуск импорта по CRON (посредством CronManager или Scheduler)
Установка
Пакет устанавливается стандартным образом через установщик из репозитория:
После установки в меню появится компонент «Impex» / «Impex3».
Экспорт ресурсов
Для экспорта достаточно выбрать родительский ресурс в дереве, конфигурацию (нажав кнопку рядом, можно открыть файл конфигурации и отредактировать его), тип файла и нажать "Экспорт". Ссылка на созданный файл будет выведена тут же.
Импорт ресурсов
Для импорта необходимо выбрать родительский ресурс, конфигурацию (также можно отредактировать), загрузить и/или выбрать файл для импорта из списка (можно удалить файлы при необходимости) а также выбрать режим обработки галереи miniShop3, предварительно загрузив изображения в указанную в $impex_config['content_row'] директорию-источник:
- Не обрабатывать — скрипт не будет учитывать изображения в файле.
- Загружать только новые — для новых товаров будут загружены новые изображения, для существующих товаров оставлены старые и добавлены новые, если они есть в файле и директории-источнике.
- Обновить всё — для новых товаров будут загружены новые изображения, у существующих галерея сперва будет очищена, а потом загружены новые, указанные в файле, изображения.
Все операции производятся стандартными процессорами miniShop3 gallery/upload и gallery/removeall. Данные процессы достаточно ресурсоёмки, поэтому используйте обработку галереи в соответствии с мощностью вашего сервера.
После успешной обработки галереи все указанные в файле импорта исходники из директории-источника удаляются.
Дополнительно можно отметить опции:
| Тестирование | Если выбрано, после импорта откроется окно со ссылкой на системный журнал, где данные будут представлены в виде массива. Новые товары, данные, изменённые плагинами, а также новые категории будут помечены. |
| Очищать директорию перед импортом | Если отмечено, перед импортом все ресурсы в категории будут помечены как удаленные (можно восcтановить из корзины) и зальются позиции из файла. Если в файле присутствует удаленная позиция, она будет восстановлена из корзины автоматически. |
| Обновлять поисковый индекс mSearch | Обновлять поисковый индекс mSearch. Если отмечено, после импорта ресурс будет проиндексирован стандартным процессором mSearch (при его наличии). |
| Сохранять резервную копию |
Если создание бэкапа включено, скрипт, прежде чем отправить данные на импорт, сохранит дамп контентных таблиц в директорию
Если установлен miniShop3, добавляются:
|
Восстановление из резервной копии
На вкладке можно выбрать нужную резервную копию и восстановить данные из неё. Данный процесс необратим, так что будьте внимательны.
Конфигурации импорта/экспорта представляют собой php-файлы в директории {core_url}components/impex/config/ (примеры идут в комплекте) такого вида:
<?php
$impex_config['content_row'] = [
['Категории', 5, 'categories'],
['Наименование', 'pagetitle', 'resource'],
['Артикул', 'article', 'ms'],
['Расширенный заголовок', 'longtitle', 'resource'],
['Краткое описание', 'introtext', 'resource'],
['Содержимое', 'content', 'resource'],
['Цена', 'price', 'ms'],
['Производитель', 'vendor', 'ms'],
['Новинка', 'new', 'ms'],
['Теги', 'tags', 'ms'],
['Цвет', 'color', 'ms'],
['Материал', 'material', 'msoption'],
['На складе', 1, 'tv'],
['Галерея', 'images/import/', 'msgallery'],
['Дополнительные категории', '', 'mscats'],
];
//значения по умолчанию при импорте или проверка при экспорте
$impex_config['content_default'] = [
['template', 2],
];
// класс товаров (msProduct / modResource)
$impex_config['resource_class'] = 'msProduct';
// класс категорий (msCategory / modResource / CollectionContainer)
$impex_config['category_class'] = 'msCategory';
// поле идентификации категории (если указывается напрямую, а не цепочкой)
$impex_config['category_id_field'] = '';
// по какому полю проверять соответствие товара при обновлении.
$impex_config['chk_field'] = array('pagetitle','resource');
// пропускать несуществующие ресурсы (только обновление, без создания).
$impex_config['skip_new'] = false;
// первая строка - названия полей
$impex_config['include_captions'] = true;
// разделители для MIGX-полей в файле array('между элементами', 'между полями внутри элемента')
$impex_config['migx_separators'] = array('||','--');
// количество ресурсов, импортируемых за один проход. 0 - не ограничивать.
$impex_config['batch_import'] = 100;
// на основании какого поля генерировать псевдоним (alias) при импорте (оставьте пустым, если alias указан в файле)
$impex_config['alias_field'] = 'pagetitle';
В файле должен присутствовать массив $impex_config со следующими ключами и значениями:
$impex_config['content_row']
Настройка колонок в файле и их связь с полями и типом, где данные указываются в виде:
array('Название колонки', 'ID или имя поля в базе', 'Тип данных', array('поля MIGX')),
Поддерживаемые типы данных
categories
|
Категории ресурса. Обязательно должна идти первой колонкой. Вторым элементом массива указывается ID шаблона категории (5 в примере выше). В файле категории должны быть представлены в виде цепочки Если в файле первой категорией указан "Каталог", а при импорте выбрать родителем иную категорию, система выдаст сообщение с предложением проверить файл. При импорте скрипт проверит наличие на сайте категорий в соответствии с указанной цепочкой и создаст недостающие при их отсутствии с указанным шаблоном и классом ресурса (см. параметр |
resource
|
Стандартные поля ресурса MODX - pagetitle, longtitle, published и т. д. |
tv
|
TV-поле. Вторым элементом массива указывается имя поля или его ID (второе предпочтительнее — меньше запросов). |
migx
|
TV-параметры типа MIGX. Второй элемент как и в случае с tv — имя поля или его ID. Третий — массив названий полей из конфигурации MIGX. Например, у ресурса есть MIGX-TV с характеристиками под названием В этом случае запись конфига будет выглядеть так:
Если у ресурса в данном поле прописано, к примеру:..
...при экспорте данные по умолчанию будут записаны в файл в следующем виде: При импорте эта строка будет сконвертирована обратно в JSON и записана в базу:
Настройка разделителей между полями и значениями производится в параметре |
ms
|
Поля продукта miniShop3 (таблица Для множественных значений (теги, цвета, размеры) в импортируемом файле используйте разделитель ||: Для производителя товаров miniShop3 vendor указывайте его название. Если такого производителя на сайте нет, он будет автоматически создан при импорте. |
msoption
|
Опция товара (опции категорий). Для множественных значений в импортируемом файле используйте разделитель ||
|
msgallery
|
Галерея товара miniShop3. В импортируемом файле пути к изображениям прописывайте через разделитель ||:
Изображения должны быть предварительно загружены в директорию-источник, которая указана (относительно корня сайта) вторым элементом массива:
Если директорию не указывать:..
...скрипт будет искать изображения в директории-источнике по умолчанию: При экспорте данные берутся из таблицы То есть, если для товара с ID=25 структура папок такая:
То в файл запишется: При замене изображений товара (режим "Обновить всё", см. далее) можно, не меняя сам XLS/CSV-файл, просто создать необходимую структуру в любом месте, загрузить туда новые файлы:..
...и указать в настройках данную директорию в качестве источника:
|
mscats
|
Дополнительные категории товаров miniShop3 (вкладка "Категории" редактора товара в админке). Указывается в виде ID категорий. Вторым элементом массива можно указать разделитель между значениями (если пусто, используется К примеру, если у товара указаны доп. категории 43, 48 и 56, то для такой настройки:..
...в файле будет так: |
Другие настройки
$impex_config['content_default']
Значения по умолчанию при импорте и экспорте:
$impex_config['content_default'] = [
[ 'template',6 ], // ID шаблона ресурса
[ 'published',1 ], // Опубликован
[ 'show_in_tree',1 ], // Виден в дереве
];
Если значения не указаны ни тут, ни в основной разбивке колонок (а их, естественно, можно добавить в $impex_config['content_row'] напрямую: array('Публиковать','published','resource'), скрипт проверит наличие системных настроек и настроек miniShop3 для товаров (шаблон товара, публикацию, видимость в дереве).
$impex_config['resource_class']
Класс ресурса. Для товаров miniShop3 используйте msProduct, для стандартных ресурсов MODX — modResource.
$impex_config['category_class']
Класс категории. Для категорий miniShop3 используйте msCategory, для стандартных ресурсов MODX — modResource и CollectionContainer для коллекций, если установлен компонент Collections.
$impex_config['category_id_field']
Поле, по которому ищется родитель (категория) при импорте.
Используется, если категории указываются не цепочкой, а напрямую.
$impex_config['chk_field']
Поле, по которому ищется ресурс при импорте. Указывается в формате:
array('название поля', 'тип поля');
Если тип ms или tv, поиск идёт просто по значению (соответственно, они должны быть уникальными). Если используете resource (например, pagetitle), то ещё учитывается родитель.
Например, для товаров miniShop3 можно использовать артикул:
$impex_config['chk_field'] = array('article','ms');
$impex_config['skip_new']
Пропускать ли несуществующие ресурсы. Если true скрипт не будет создавать новые ресурсы, а только обновлять существующие.
$impex_config['include_captions']
Идут ли первой строкой в файле названия полей true/false.
$impex_config['migx_separators']
Разделители для MIGX-полей.
Первый элемент массива — разделитель между элементами, второй — между полями внутри элемента:
$impex_config['migx_separators'] = array('||','--');
Тут MIGX-TV, содержащее элементы, состоящие из полей image, title, text и link:..
array('Преимущества','benefits','migx',array('image','title','text','link')),
...запишется в файл в виде:
icons/icon01.svg--Низкие цены--Мы держим низкие цены--[[~5]]||icons/icon02.svg--Богатый опыт--У нас большой опыт--[[~6]]
$impex_config['batch_import']
Количество товаров, обрабатываемых при импорте за один проход (0 — без ограничений).
Уменьшите, если сервер не успевает обрабатывать указанное кол-во товаров за раз (актуально при включенной обработке галереи miniShop3).
$impex_config['alias_field']
Какое поле использовать для генерации псевдонима при создании нового ресурса.
Если оставить пустым, псевдоним не генерируется (например, если в $impex_config['content_row'] прямо указываете alias:
array('Псевдоним','alias','resource'),
При установке пакета создаются следующие системные события:
|
Вызывается перед экспортом ресурса. Доступные переменные:
Пример использования (присоединяет к заголовку страницы ее ID):
|
|
Вызывается перед импортом ресурса. Доступные переменные:
Пример использования (пропишем конкретному товару значение TV, которого нет в конфиге и файле):
|
|
Вызывается перед получением родительской категории. Доступны:
Плагин должен вернуть цепочку категорий через разделитель ||:
|
|
Вызывается перед импортом поля ресурса. Доступные переменные такие же как при экспорте:
|
|
Вызывается после импорта всех ресурсов. Доступны:
Пример использования:
|
Запуск удобнее осуществлять посредством CronManager или Scheduler.
CronManager
Для работы через CronManager на сервере нужно добавить CRON-задание для запуска скрипта {assets_url}components/cronmanager/cron.php (подробности в документации).
При создании новой задачи в CronManager, выберите сниппет ImpexCRON, который идёт в комплекте с Impex, настройте расписание и укажите параметры запуска:
parent: 25
config: resource
file: import.xlsx
gallery: new
В данном случае в качестве родителя будет выбран ресурс с ID = 25, конфигурация resource.php, файл import.xlsx, который нужно предварительно загрузить в директорию {assets_url}/components/impex3/files/ и режим обработки галереи miniShop3 (new - только новые, refresh - перезапись, если параметр не указывать, галерея не обрабатывается).
Scheduler
Для запуска через Scheduler также нужно на сервере создать CRON-задание на запуск скрипта {assets_url}components/scheduler/run.php и далее настроить задания в приложении: