[СДЕЛАЙ САМ] Импорт товаров MiniShop2 из xml. Версия 2.0

Приветствую, коллеги. почти год назад я выложил эту заметку, но за это время пришло понимание, что скрипт мягко говоря «неидеальный»: он работает медленно, импортирует всё подряд, запуск требует ежеминутного выполнения задания по крон. В новой версии всего этого нет, а за идею для улучшения спасибо @crystaldaking.

Как это работает
  1. Клонируйте репозиторий в папку core
  2. Создайте файл конфигурации в папке core/xmlimport/configs/
  3. Если файл импорта необходимо скачать, укажите ссылку на него в параметре «feedUrl»
  4. Установите остальные параметры конфигурации
  5. Создайте задачу в планировщике с необходимым интервалом запуска, которая будет запускать скрипт из файла core/xmlimport/cron/run.php. В качестве параметра
    передайте название файла конфигурации без постфикса ".inc.php"
При запуске run.php, будет скачан файл фида, если указана ссылка на него, затем он будет прочитан и разложен на отдельные файлы категорий и офферов.
На следующем этапе эти файлы будут перебираться в цикле и по данным из них, будут созданы ресурсы.
Если это не первый импорт и вы не удаляли файлы предыдущего, то будут сопоставлены предыдущие файлы с новыми,
если какие-то файлы отсутствуют в новом импорте, ресурсы соответствующие этим файлам будут сняты с публикации, а файлы удалены.

Для корректной работы потребуется создать два поля
  • feed_id — для записи идентификатора ресурса из файла.
  • supplier — для записи поставщика файла импорта.
Поля можно создавать с помощью компонента ExtraFields.

Для первого импорта рекомендую не использовать поиск по supplier в параметре searchConditions.
А в целом можете писать любые условия для WHERE.

Параметр noUpdate нужен для предотвращения затирания стараний контент-менеджера. Бывает так, что поставщик
не передаёт в файле импорта разметку для описания, и тогда её может добавить контентщик и, если не указать поле content параметре
noUpdate, разметка опять исчезнет.

В параметре productOptions можно указывать полное описание опций, при этом создавать самостоятельно их необязательно.
Обратите внимание, что для опций типа combo-colors необходимо вручную прописать properties при этом
name, каждого элемента должно соответствовать значению в файле импорта. При этом для опций типа combo-multiple
свойство properties будет заполнено автоматически в процессе импорта.
В каждую опцию типа textfield(значение по умолчанию) можно записать данные из нескольких тегов.
При этом для каждого тега можно задать шаблон значения с ключом (значение атрибута name тега) или без него в параметре paramValueTemplates.
Например: в файле импорта есть теги «Коллекция» и «Год» и вы хотите записать их в опцию с ключом collection.
Тогда конфиг будет таким:
...
'paramValueTemplates' => [
    'Коллекция' => '{key}: {value}',
    'Год' => '{key}: {value}',
],
'productOptions' => [
    'collection' => [
        'from' => ['params_Коллекция', 'params_Год'],
        'caption' => 'Информация о коллекции',  
    ],
]
...
В админке значение опции будет записано так: «Коллекция: Шерлок; Год: 2021». Разделитель задается в параметре valueImplodeSeparator.

Параметр ignore_params нужен только для уменьшения размера файлов, так как импортированы будут только те данные,
которые указаны в productOptions и productDefaultFields.

Параметр updateCategoryStructure позволяет привести структуру каталога сайта в соответствии со структурой категорий в файле импорта.
Актуально только, если у вас уже есть категории на сайте и их названия на 100% совпадают с названиями категорий в файле.

Скрипт умеет добавлять товары в несколько категорий. Для этого в параметре productFields с ключом «categories»
нужно указать тег или параметр в котором лежит список feed_id дополнительных категорий и указать разделитель этого списка valueExplodeSeparator.
Допускаю, что дополнительные категории могу передаваться как-то ещё, но предусмотрен только такой вариант импорта. Если у вас иначе,
можно расширить класс «importfeed.php», переопределив метод «setAdditionalCategories».

Для загрузки картинок нужно указать путь для загрузки файлов imagePath. Туда нужно положить картинки вручную.
Если вручную лень, разрешите автоматическое скачивание allowDownloadImages. Как правило картинки обновляются редко,
поэтому имеет смысл загружать картинки только для новых товаров setGalleryOnlyNew. При необходимости добавить
картинки в существующим для всех импортируемых товаров используйте параметр setGallery,
если нужно установить в галерею только новые картинки, добавь ещё параметр removeOldFiles.

Импортировать можно отдельно категории importCategories и отдельно товары importProducts.
По умолчанию при импорте существующие ресурсы обновляются, новые создаются. Однако используя параметр importMode
можно только обновлять, или только создавать ресурсы.

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

При наличии установленного компонента mSearch2, для каждого нового ресурса будет автоматически обновляться поисковый индекс.

На этом всё! Все вопросы в комментарии или мой Telegram.
Артур Шевченко
18 февраля 2024, 20:16
modx.pro
1
734
+5
Поблагодарить автора Отправить деньги

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

Николай Савин
18 февраля 2024, 20:19
0
Ммм, десятки тысяч JSON файлов в каталоге, после разбора XML. Какая прелесть.
Николай Савин
19 февраля 2024, 08:41
+6
Пожалуй побуду сегодня дедом-ворчуном. Я вот постарался поставить себя на место среднего MODX сборщика сайтов. Пробежался по тексту несколько раз и у меня возник вопрос. А собственно чего делать то? Куда нажимать чтобы это все заработало?
Вот честно не очень понятно о чем вообще заметка? Это теория правильного импорта? Или это готовый к использованию компонент? Или хотя бы скрипт? Где сам код то, который нужно запустить? Ну ничего ж не понятно.
    Артур Шевченко
    19 февраля 2024, 22:29
    0
    Спасибо, добавил в список шагов необходимость клонировать репозиторий, надеюсь стало понятнее.
      Николай Савин
      20 февраля 2024, 08:51
      0
      Кстати есть мнение, что файлы конфигурации лучше хранить в специальном каталоге core/config, где основной MODX конфиг лежит.
      Это связано с тем, что можно случайно каталог с компонентом удалить, перезаписать. А также есть нюансы связанные с работой Git (каталог конфига по умолчанию добавляют в исключения и он не попадет в открытый доступ). Короче так… минутка бесполезной полезной информации
        Артур Шевченко
        20 февраля 2024, 15:15
        0
        Я никого не ограничиваю, кому есть, что скрывать путь перекладывает.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7