MiniShop3

Современный компонент интернет-магазина для MODX3
Бесплатно
Загрузите дополнение из админки вашего сайта.
Как загрузить?
Автор дополнения
Николай Савин
Пакетов
20
Закачек
33 301
Автор дополнения
Пакетов
20
Закачек
33 301
Версия 1.14.1-beta2
Дата выпуска 25.09.2026
Загрузки 664
Просмотры 4 233
Внимание, этот компонент требует PHP 8.2 или выше!
Внимание, этот компонент требует MODX 3 или выше.
MiniShop3 разработан специально для MODX Revolution 3.x и использует все преимущества новой версии:

  • PHP 8.2+ — современный синтаксис, типизация, атрибуты
  • Namespaces — все классы организованы в пространстве имён MiniShop3\
  • PSR-4 автозагрузка — через Composer
  • Миграции Phinx — версионирование структуры БД

Улучшенная архитектура

  • REST API — полноценный API для headless-интеграций
  • Service Container — зависимости через DI-контейнер MODX
  • Vue 3 + PrimeVue — современный интерфейс админки через VueTools
  • Современный фронтенд — без jQuery, нативный JavaScript

Совместимость

MiniShop3 сохраняет обратную совместимость с miniShop2 на уровне:

  • Имена сниппетов (msProducts, msCart, msOrder и др.)
  • Структура чанков и плейсхолдеров
  • Параметры сниппетов

Системные требования
  • MODX Revolution | 3.0.0+
  • PHP | 8.1+
  • MySQL | 5.7+ / MariaDB 10.3+

Зависимости MODX

  • pdoTools 3.x — для работы сниппетов и шаблонизатора Fenom
  • VueTools — Vue 3 и PrimeVue для административного интерфейса
  • Scheduler (опционально) — для фоновых задач (импорт, уведомления, очистка)

MiniShop3 использует Vue 3 для современного интерфейса админки. Пакет VueTools должен быть установлен до или вместе с MiniShop3. При отсутствии пакета будет показано сообщение с инструкцией по установке.

Composer библиотеки
MiniShop3 использует следующие PHP библиотеки (включены в пакет):
nikic | ^1.3 | Маршрутизация REST API
rakit/validation | ^1.4 | Валидация данных форм и API
intervention/image | ^3.0 | Обработка изображений (ресайз, водяные знаки)
robmorgan/phinx | ^0.16 | Миграции базы данных
ramsey/uuid | ^4.7 | Генерация UUID для токенов

Сентябрь 2026

[2026-09-24] Версия 1.14.1-beta1

Тип релиза: PATCH (beta) — экстренный фикс: 1.14.0-beta1 не устанавливался поверх предыдущих версий.

Исправлено

Обновление падало с Class "ComposerAutoloaderInit…" not found (#779). bootstrap.php подключает vendor/autoload.php на каждом запросе MODX, поэтому при обновлении в памяти уже лежит composer/autoload_real.php предыдущей версии. Транспорт распаковывает новый vendor/ поверх, резолвер миграций делает require vendor/autoload.php, но его require_once на неизменившийся путь composer/autoload_real.php — no-op, и вызов уходит в необъявленный класс. Composer выводит имя этого класса из состава пакетов, а в 1.14.0-beta1 состав изменился (в require-dev добавился modxkit/testbench), поэтому старое имя перестало совпадать с новым. Теперь ms3PhinxEnsureAutoloaderInit() вычитывает имя класса из нового autoload.php и, если оно не объявлено, требует composer/autoload_real.php напрямую, в обход кэша require_once. Обновление проходит с любой прошлой версии.

Имя класса автолоадера закреплено (#779). В composer.json добавлен config.autoloader-suffix: "MiniShop3" — суффикс больше не зависит от состава пакетов, поэтому такой рассинхрон не повторится на будущих обновлениях.

Сборка больше не пакует dev-зависимости (#779). _build/vendor_guard.php проверяет vendor/composer/installed.json и отказывается собирать транспортный пакет, пока в vendor/ лежат пакеты из require-dev. В 1.14.0-beta1 в пакет уехали PHPUnit, PHPStan и testbench — 45 МБ вместо примерно семи.

[2026-09-23] Версия 1.14.0-beta1

Тип релиза: MINOR (beta) — коммерческий жизненный цикл заказа: складской учёт, попытки оплаты и отгрузки, доменные события с исходящими вебхуками; ACL групп ресурсов на всей витрине; закалка сортировки в msProducts.

Добавлено

Складской учёт, выключенный по умолчанию (#589, #603, #763). При включённой настройке ms3_inventory_enabled остаток резервируется на статусе «Новый», фиксируется на «Оплачен» и освобождается на «Отменён», если заказ ещё не был оплачен. Журнал резервов лежит в ms3_inventory_reservations, переходы состояния атомарны (условный UPDATE ... WHERE state = ...), так что параллельные запросы не спишут остаток дважды. Доступность проверяется до выдачи номера заказа. Шесть событий msOnBeforeInventoryReserve / msOnInventoryReserve / Commit / Release позволяют подключить внешнюю систему; события выпускаются только после фиксации транзакции, поэтому подписчик не получит уведомление о резерве, которого нет в базе. NULL в stock считается нулём — перед включением заполните остатки. Внешний склад подключается подменой сервиса ms3_inventory.

Жизненный цикл оплаты (#590, #604, #626). Появились таблицы ms3_payment_attempts и ms3_payment_attempt_events, публичный эндпойнт POST /api/v1/payment/webhook/{payment_method_id} и защита от повторной обработки: уникальный provider_event_id не даст применить один и тот же вебхук дважды. Платёжный шлюз подключается через PaymentWebhookHandlerInterface — проверка подписи и разбор тела остаются на стороне дополнения.

Жизненный цикл отгрузки (#591, #605, #606, #607). Таблицы ms3_shipments и ms3_shipment_events, вебхук службы доставки, трек-номера и синхронизация со статусом заказа. В менеджере — GET|PUT /orders/{id}/shipment, в витрине — плейсхолдер {$shipments} у msGetOrder. Выключено по умолчанию (ms3_shipment_enabled).

Управляемая смена статуса заказа (#592, #596). Переходы проверяются по правилам final / fixed и необязательному списку ms3_order_status_transitions. Доменные шаги, которые могут запретить переход, выполняются внутри одной транзакции со сменой status_id; после фиксации компенсирующих записей нет. ensure() идемпотентен и безопасен при гонке двух параллельных вызовов. Ошибка плагина на msOnChangeOrderStatus возвращается вызывающему, но статус не откатывает.

Доменные события и контракт исходящих вебхуков (#593, #764, #772, #774). Ядро собирает событие order.status_changed, в полезной нагрузке только идентификаторы и суммы — персональные данные покупателя наружу не уходят. Подпись — HMAC-SHA256 по строке {timestamp}.{rawBody}, заголовки X-MS3-Signature и X-MS3-Timestamp, окно 300 секунд. По умолчанию стоит NullWebhookDispatcher, то есть без дополнения наружу ничего не отправляется. Дополнение подключает HTTP-доставку подменой ms3_webhook_dispatcher, а внутренних слушателей регистрирует через $modx->services->get('ms3_domain_events')->addListener(...).

ACL групп ресурсов на всей витрине (#659, #666, #677, #681, #757). Публичный каталог, Fenom-сниппеты и корзина учитывают группы ресурсов MODX. Залогиненный покупатель, чья группа клиентов привязана к группе пользователей MODX, видит member-каталог — для этого появилась модель msCustomerGroup и CRUD в менеджере. Для member-запросов текущему ресурсу проставляется cacheable = 0, поэтому на кэшируемых страницах вызывайте сниппеты некэшированно: [[!msProducts]].

Публичный Web API (#578, #580, #586, #597, #598, #644). Category API (list / get / tree), расширенные фильтры product/list, фасеты product/filters, публичные delivery/list и payment/list, галерея товара product/{id}/images, резолв каталога по alias или uri.

SEO-блок публичного каталога (#599, #715). title, description, canonical, robots и Open Graph; карта TV через ms3_public_seo_tv_map; robots выводится из поля searchable; правки через событие msOnGetPublicSeo.

Текстовый водяной знак в превью Media Source (#731, #769) рядом с уже существующим наложением картинки. Путь к шрифту ограничен корнем сайта, ошибки пишутся в журнал, превью создаётся в любом случае.

Индивидуальный порядок товаров в дополнительных категориях (#625, #627) — и в гриде менеджера, и при сортировке по menuindex в msProducts.

Живые тесты на настоящем MODX (#687, #698, #699, #712) через modxkit/testbench на версиях 3.1.2-pl, 3.2.3-pl и 3.2.4-pl: схема поднимается из Phinx-миграций, проверяются права процессоров.

Изменено

Vue-менеджер выглядит как MODX 3 (#621, #702, #738, #760, #761, #765, #768). Тема берётся из VueTools через getActiveTheme(): по умолчанию Aura, vuetools.theme=modx переключает на вид менеджера. Высоты кнопок, полей и списков в тулбарах выровнены, размеры кнопок приведены к единому виду по всем экранам; кнопки действий внутри строк таблиц остались компактными, чтобы гриды не раздувались.

msProducts проверяет строковый sortby по белому списку (#741, #742, #757). Поля ресурса и товара получают префикс таблицы, объявленные TV, поля производителя и ключи sortbyOptions проходят как есть, функции RAND(), FIELD(), IFNULL(), COALESCE() и CAST() разрешены с проверенными аргументами. Остальное отбрасывается и пишется в журнал. Это закрывает передачу произвольного SQL в ORDER BY через параметр сниппета.

Неуспешная оплата больше не отменяет заказ по умолчанию (#754, #756). Настройка ms3_payment_on_failed_status теперь по умолчанию 0, поэтому покупатель может повторить оплату без ошибки 409. При включённом складском учёте резерв остаётся за заказом до отмены — чтобы остаток освобождался автоматически, укажите в настройке статус отмены.

Уведомления отправляются даже при ошибке плагина на msOnChangeOrderStatus (#754, #756) — статус уже зафиксирован, и покупатель не должен оставаться без письма из-за сбоя интеграции.

Обновление пакета убирает устаревшие файлы (#690, #709, #726, #728) из core и assets, не трогая то, что перечислено в ms3_frontend_assets; миграции всегда выполняются на собственном Phinx MiniShop3, а не на копии из другого дополнения.

CORS-preflight обрабатывается до стека middleware (#637, #708, #725, #727) — без обращения к сессии MODX и без порчи кэша.

Исправлено

  • Блокировки покупателей (#734, #747, #748). Временная блокировка по числу неудачных попыток больше не мешает восстановить пароль, перманентная отзывает токены, счётчик сбрасывается после истечения блокировки.
  • Молчаливые ошибки записи попыток оплаты (#752, #753). На соединении MODX (ERRMODE_SILENT) неудачные запросы возвращали false и терялись; теперь дубли распознаются честно, а сбой поднимает исключение.
  • Расхождение статуса заказа с отгрузкой (#754, #756). Повторный вебхук долечивает статус, не переэмитируя события.
  • Пустые подсказки значений опций в менеджере (#745, #746).
  • Битый UTF-8 в ответах коннектора (#618, #662, #676, #691) — больше не отдаётся ни повреждённый JSON, ни пустое тело.
  • Права на сортировку галереи и товаров (#614, #661, #675) проверяются по msproductfile_save и msproduct_save, ACL полей заказа следует miniShopManagerPolicy.
  • Кэш фасетов и страниц (#735) сбрасывается при изменении ACL групп ресурсов, членства и привязки группы клиентов.
  • Опции в корзине (#633, #638) принимаются в виде JSON-строки в cart/add и cart/change-option.
  • Английские вкладки товара при русском менеджере (#758, #759, #767, #771). Отравленный кэш лексикона лечится один раз после установки или обновления.
  • Сортировка по опциям и полям производителя (#776). Ключ sortbyOptions, совпадающий с именем колонки (weight, color, size), больше не ломает запрос; sortby=vendor_name работает при дефолтных параметрах вызова.

Примечание

Документация по складскому учёту, отгрузкам и попыткам оплаты в docs.modx.pro пока отсутствует — выйдет отдельным обновлением.

Последние обсуждения в сообществе MODX.pro