=====================================
  CSV IMPORT — Импорт товаров из CSV / YML
=====================================
Версия: 2.1.0
Зависимости: xfields (опционально, для доп. полей)
─────────────────────────────────────────────────────────────────────────────
ОПИСАНИЕ
─────────────────────────────────────────────────────────────────────────────
Плагин позволяет импортировать товары (новости NGCMS) из CSV-файлов с гибким
маппингом колонок. Поддерживает заполнение доп. полей xfields, обновление
существующих записей, кодировки UTF-8 и Windows-1251.
─────────────────────────────────────────────────────────────────────────────
УСТАНОВКА
─────────────────────────────────────────────────────────────────────────────
1. Установите плагин через панель администратора.
   Дополнительные таблицы не создаются.
2. Убедитесь, что папка engine/plugins/csv_import/upload/ существует
   и доступна для записи (создаётся автоматически).
3. Перейдите: Плагины → csv_import → Настройки.
─────────────────────────────────────────────────────────────────────────────
РАБОЧИЙ ПРОЦЕСС ИМПОРТА
─────────────────────────────────────────────────────────────────────────────
1. ЗАГРУЗКА: загрузите CSV-файл через форму.
2. МАППИНГ:  нажмите «Настроить импорт», выберите разделитель,
             укажите есть ли строка заголовков, настройте маппинг колонок.
3. ЗАПУСК:   нажмите «Запустить импорт».
             Результат: «Создано: N, обновлено: M, ошибок: K»
─────────────────────────────────────────────────────────────────────────────
ФОРМАТ CSV-ФАЙЛА
─────────────────────────────────────────────────────────────────────────────
  - Кодировка: UTF-8 или Windows-1251 (определяется автоматически)
  - Разделитель: ; (точка с запятой), , (запятая) или Tab
  - Первая строка: опционально — названия колонок (используются для авто-маппинга)
  - Максимальный размер: ограничен настройками PHP (upload_max_filesize)
  Пример (разделитель ;):
    title;price;weight;color;short_story
    Кроссовки Nike;3500;0.8;белый;Лёгкие беговые кроссовки
    Кеды Vans;2100;0.6;чёрный;Классические кеды
─────────────────────────────────────────────────────────────────────────────
МАППИНГ КОЛОНОК
─────────────────────────────────────────────────────────────────────────────
Для каждой колонки CSV выбирается поле назначения:
  Стандартные поля новостей:
    title         — Заголовок (обязательно)
    short_story   — Краткое описание
    full_story    — Полное описание
    alt_name      — URL (alt_name). Если пусто — генерируется из заголовка
    category      — ID категории (переопределяет «Категорию по умолчанию»)
    tags          — Теги / ключевые слова
  Поля xfields (отображаются как «xfields: имя — Название»):
    xf_price      — поле xfields с именем «price»
    xf_weight     — поле xfields с именем «weight»
    xf_color      — и т.д. для любых полей xfields
  skip            — пропустить колонку
Авто-маппинг: если первая строка — заголовки, совпадающие с именами полей
(или xfields), маппинг применяется автоматически.
─────────────────────────────────────────────────────────────────────────────
ПАРАМЕТРЫ ИМПОРТА
─────────────────────────────────────────────────────────────────────────────
  Категория по умолчанию  — категория для записей без указания category в CSV
  Статус                  — «Опубликована» (approve=1) или «Скрыта» (approve=0)
  Главная страница        — показывать на главной (mainpage=1) или нет
  Обновлять существующие  — если включено: при совпадении alt_name запись
                            обновляется (title, описания, теги, xfields)
                            Если выключено: создаётся всегда новая запись
─────────────────────────────────────────────────────────────────────────────
УПРАВЛЕНИЕ ФАЙЛАМИ
─────────────────────────────────────────────────────────────────────────────
  - Загруженные файлы хранятся в engine/plugins/csv_import/upload/
  - Разрешены файлы с расширением .csv, .yml, .xml
  - Файлы можно удалять из панели управления
  - Старые файлы не удаляются автоматически
─────────────────────────────────────────────────────────────────────────────
ОГРАНИЧЕНИЯ (CSV)
─────────────────────────────────────────────────────────────────────────────
  - Изображения не импортируются (добавьте вручную или через YML)
  - Для корректной работы xfields поля должны быть предварительно созданы
    в настройках плагина xfields
  - Функция xf_saveNewsData() должна быть доступна (xfields установлен)
─────────────────────────────────────────────────────────────────────────────
YML ПРАЙС-ЛИСТЫ (Яндекс.Маркет)
─────────────────────────────────────────────────────────────────────────────
Поддерживается стандартный формат yml_catalog (Яндекс.Маркет).
  Рабочий процесс:
    1. Загрузите .yml или .xml файл через форму
    2. Нажмите «Настроить YML импорт»
    3. Настройте маппинг полей и категорий
    4. Запустите импорт
  Поддерживаемые элементы YML → возможные цели в NGCMS:
    <name>           → Заголовок (title)
    <price>          → xfields (например xf_price)
    <oldprice>       → xfields (xf_oldprice)
    <description>    → Краткое или полное описание
    <vendor>         → xfields (xf_brand, xf_vendor)
    <model>          → xfields (xf_model)
    <barcode>        → xfields (xf_barcode)
    <vendorCode>     → xfields (xf_articul, xf_vendorCode)
    <count>          → xfields (xf_count)
    <weight>         → xfields (xf_weight)
    <param name="X"> → xfields (автосопоставление по имени)
    <categoryId>     → категория NGCMS (через маппинг)
    <picture>        → загрузка изображений (см. ниже)
  Маппинг автоматически предлагает соответствие на основе названий полей xfields.
─────────────────────────────────────────────────────────────────────────────
ЗАГРУЗКА ИЗОБРАЖЕНИЙ ИЗ YML
─────────────────────────────────────────────────────────────────────────────
  Изображения из <picture> в YML скачиваются на сервер и привязываются
  к товару через систему xfields типа «images».
  Требования:
    - В настройках xfields должно существовать поле с типом «images»
      (например, «gallery» или «photos»)
    - PHP должен иметь доступ к интернету (file_get_contents или cURL)
    - Папка uploads/dsn/ должна быть доступна для записи
  Настройки в форме YML импорта:
    «Загружать изображения» — включить/выключить загрузку
    «XField для изображений» — выбрать поле типа images
    «Макс. изображений на товар» — от 1 до 10 (по умолчанию: 3)
  Поведение:
    - Файл сохраняется в uploads/dsn/{dsnPath}/{имя_newsId_hash.ext}
    - Запись добавляется в таблицу {prefix}_images (plugin='xfields')
    - При повторном импорте уже существующие файлы не дублируются
    - Изображения сразу доступны в шаблонах через механизм xfields images
  Пример структуры YML с изображениями:
    <offer id="1" available="true">
      <name>Куртка зимняя</name>
      <price>4500</price>
      <picture>https://example.com/img/jacket_1.jpg</picture>
      <picture>https://example.com/img/jacket_2.jpg</picture>
      <param name="Цвет">Чёрный</param>
      <param name="Размер">M, L, XL</param>
    </offer>
─────────────────────────────────────────────────────────────────────────────
МАППИНГ КАТЕГОРИЙ YML
─────────────────────────────────────────────────────────────────────────────
  В форме настройки YML импорта показываются все категории из файла.
  Для каждой категории YML нужно выбрать соответствующую категорию NGCMS.
  Если название категории YML совпадает с названием категории NGCMS
  (без учёта регистра), соответствие определяется автоматически.
─────────────────────────────────────────────────────────────────────────────
ПРИМЕР: ПОДГОТОВКА CSV ДЛЯ ИМПОРТА КАТАЛОГА
─────────────────────────────────────────────────────────────────────────────
Допустим, в xfields настроены поля: price, brand, material, size
  title;alt_name;short_story;price;brand;material;size;tags
  Куртка зимняя;kurtka-zimnyaya;Тёплая куртка на синтепоне;4500;Nike;полиэстер;M,L,XL;куртка зима одежда
  Джинсы прямые;dzhinsy-pryamye;Классические прямые джинсы;2300;Levi's;деним;28,30,32;джинсы брюки
Маппинг:
  Колонка 0 → title
  Колонка 1 → alt_name
  Колонка 2 → short_story
  Колонка 3 → xfields: price
  Колонка 4 → xfields: brand
  Колонка 5 → xfields: material
  Колонка 6 → xfields: size
  Колонка 7 → tags
