
- MODX 3
- PHP 8.2
- miniShop3
- Vue 3


Пункт Яндекс Маркет открывает три раздела: Прайс-листы, Логи, Диагностика. Что делает каждая кнопка: действия.

Поиск фильтрует по названию. Пустой список предлагает Создать.
| Колонка | Что показывает |
|---|---|
| Название | Ссылка в карточку. Под ней #id · площадка · режим. Флаги только если прайс выключен, нужна генерация или последний статус error |
| Файл | Ссылка, если file_url заполнен. Иначе текст «YML-файл не найден». Под ним дата generated_on |
| Действия | Иконки правки и удаления без подписи на кнопке |
Отдельных колонок источника предложений, источника остатков, типа оффера и полного статуса нет. Статусы warning, success и running в списке не видны. Дата ставится на любой завершённый проход с файлом, не только на success.
Удалить спрашивает подтверждение и убирает прайс. Файл на диске остаётся.

До Создать видны название, описание, активность, режим, тип оффера, площадка и назначение (для Яндекса). Путь, дерево тегов и предпросмотр появляются после сохранения. Категории можно отметить сразу. Без названия форма не сохраняется.
Вкладки Предложения и Генерация есть только у уже созданного прайса. При назначении placement вкладки Категории нет.

| Поле | Куда пишется |
|---|---|
| Название, описание | Карточка прайса. Описание в XML не попадает |
| Активен | Планировщик и cron.php пропускают выключенный прайс |
| Режим генерации | manual, scheduler, after_save |
| Тип оффера | simple или vendor.model. Для YML из дерева полей атрибут type из этого поля не ставится |
| Площадка | yandex.market или google.rss20 |
| Назначение фида | Только у Яндекса. В списке «Каталог» (catalog) и «Размещение (replace)» (placement). Значения items в списке нет. Если оно уже лежит в базе, генерация его понимает |
| Путь и URL файла | После записи стоят pricelist-{id}.xml в каталоге ms3yandexmarket_files_path и URL этого файла. До генерации в полях можно хранить свой текст. Место записи этот текст не задаёт |
| Управляемые поля | Только при placement. Пустой список сохранить нельзя: форма подставляет все девять ключей. Непустой список оставляет в offer имена из списка. Имя available пишется атрибутом. Атрибут id пишется всегда |
Сохранить в шапке пишет эти поля. Теги дерева шапка не пишет. У тега своя кнопка Сохранить тег.
Слева дерево Поля магазина. Справа имя тега, источник текста и переключатель Выводить в файл. Выключенный тег в списке бледнее и в файл не пишется.
Добавить атрибут создаёт атрибут (по умолчанию имя id). Кнопок «добавить тег» и «удалить тег» в дереве нет. Набор тегов заполняется при создании прайса по площадке и назначению.
Под деревом условия с target = resource. Справа XML магазина: фрагмент, файл на диске не заменяется.

Дерево разделов MiniShop3 развёрнуто целиком. У строки флажок выбора. У выбранной строки появляются флажок Исключена и поле Своё название. Справа предпросмотр блока категорий. Какие товары попадают в прайс: категории и фильтры.

Источник предложений задаёт, сколько offer будет у товара. Источник остатков задаёт, откуда берётся число остатка. В остатках есть пункт «Свой источник». Значения: варианты и остатки.
Дерево Поля предложения устроено так же, как поля магазина. Условия под ним пишутся с target = offer.
ID товара и ID варианта выбирают строку для панели XML одного предложения. Таблица ищет товары выборки: ID, название, цена и старая цена, остаток и его источник, URL, артикул. Страницы по 20 строк.

Сохранить настройки пишет режим, интервал, площадку, путь и URL. Те же режим и площадка есть на Магазине.
Над кнопками: статус, дата, число выгруженных, число ошибок, ссылка на файл, отметка «нужно сгенерировать».
| Кнопка | Что делает |
|---|---|
| Сгенерировать | Пишет файл. Пока идёт запись, второй запуск того же прайса отвечает generation_locked |
| Предпросмотр YML | Собирает XML в памяти. Показывает число предложений, валидных и пропущенных. Файл на диске не меняет |
| Показать сгенерированный YML | Читает уже записанный файл |
| Скачать YML | Отдаёт тот же файл как загрузку |
Под кнопками журнал текущего запуска. До Сгенерировать он пустой.