Интернет-магазин для MODX 3
Документация • Быстрый старт • Сообщить о баге • Релизы
- 🚀 Для MODX 3: PHP 8.2+, namespaces, PSR-4, миграции Phinx
- 🔌 REST API для headless-интеграций
- 🎨 Админка на Vue 3 и PrimeVue
- ⚡ Фронтенд без jQuery, на нативном JavaScript
- 🔄 Сниппеты, чанки и параметры совместимы с miniShop2
| Компонент | Версия |
|---|---|
| MODX Revolution | 3.0.0+ (CI live-тесты: 3.1.2-pl, 3.2.3-pl, 3.2.4-pl) |
| PHP | 8.2+ |
| MySQL | 5.7+ / MariaDB 10.3+ |
| Пакет | Обязательный | Описание |
|---|---|---|
| pdoTools 3.x | ✅ | Сниппеты и шаблонизатор Fenom |
| VueTools | ✅ | Vue 3 и PrimeVue для админки |
| Scheduler | ❌ | Фоновые задачи (импорт, уведомления) |
Extras → Installer → Download Extras → MiniShop3 → Install
⚠️ VueTools нужно поставить до MiniShop3.
# Клонирование
git clone https://github.com/modx-pro/MiniShop3.git
cd MiniShop3
# PHP зависимости
cd core/components/minishop3 && composer install && cd ../../..
# Vue-админка (Node.js 18+ локально, в GitHub Actions 24)
cd vueManager && npm ci && npm run build && cd ..
# Сборка пакета
php _build/build.phpСправочник: docs.modx.pro/components/minishop3
- Быстрый старт: первоначальная настройка
- Сниппеты: msProducts, msCart, msOrder и др.
- REST API: интеграция с внешними системами
- События: расширение функциональности
Публичные endpoints без токена. В выборку попадают только товары с published=1, deleted=0, hidemenu=0 в указанном (или текущем) context.
GET /assets/components/minishop3/api.php?route=/api/v1/product/get/{id}
GET /assets/components/minishop3/api.php?route=/api/v1/product/list
Параметры: parent / category (только primary parent, без msCategoryMember), limit (max 100), offset / page, sort + dir, query, context, include_options, include_content.
Ответ list: { items, total, limit, offset }. Цена и вес считаются в msOnGetProductPrice / msOnGetProductWeight. Поля ответа проходят allowlist после msOnGetProductFields.
Полный справочник REST: docs.modx.pro. Раздел каталога на сайте документации стоит синхронизировать с этим релизом.
Ссылка в письме ведёт на api.php с путём верификации и параметром html=1. Сервер отвечает HTTP-редиректом 302 на сайт с ms3_email_verified=1 или ms3_email_verified=0. URL после успешной проверки берётся из ms3_email_verification_success_url. Если настройка пустая, используется site_url.
Тот же URL без html=1 или с format=json возвращает JSON. Так удобнее API-клиентам. В браузере будет сырое тело ответа.
MiniShop3/
├── _build/ # Сборка транспортного пакета
├── changelogs/ # Помесячные записи (сводка в CHANGELOG.md)
├── phpstan.neon # PHPStan level 5
├── phpstan-baseline.neon # Известные замечания PHPStan
├── assets/components/minishop3/
│ ├── api.php # Вход публичного Web API
│ ├── connector.php # Вход менеджерского API
│ ├── js/web/ # Frontend JavaScript
│ ├── js/mgr/ # ExtJS и собранный Vue (vue-dist)
│ └── css/
├── core/components/minishop3/
│ ├── controllers/ # Контроллеры менеджера MODX (не src/Controllers)
│ ├── elements/ # Сниппеты, чанки, плагины
│ ├── config/
│ │ ├── routes/ # web.php и manager.php (FastRoute)
│ │ ├── ms3.services.example.php # Пример оверрайда сервисов
│ │ ├── ms3.services.d/ # Доп. сервисы аддонов
│ │ └── ms3.routes.d/ # Доп. маршруты аддонов
│ ├── custom/ # custom/filters, сейчас .gitkeep
│ ├── schema/ # xPDO-схема
│ ├── scripts/ # ci-php.sh, phpstan-prepare-deps.sh
│ ├── src/ # PHP-классы (PSR-4)
│ │ ├── Controllers/ # HTTP API и domain facade
│ │ ├── Middleware/
│ │ ├── Notifications/
│ │ ├── Processors/ # Процессоры MODX (вызов через connector.php)
│ │ ├── Router/
│ │ ├── Services/
│ │ └── ServiceRegistry.php
│ ├── migrations/ # Phinx
│ ├── lexicon/ # Переводы (ru, en)
│ └── tests/ # Smoke и PHPUnit
└── vueManager/ # Исходники Vue 3 админки (Vite)
Каталог MiniShop3\Controllers\… совмещает HTTP и domain facade. Это разные роли. HTTP-разбор не кладите в facade, а логику корзины и заказа не кладите в API-класс. Рядом, в core/components/minishop3/controllers/, лежат контроллеры страниц менеджера MODX. Регистр каталога другой, это не тот же слой.
| Слой | Путь | Роль |
|---|---|---|
| HTTP API | Controllers/Api/Manager/*, Controllers/Api/Web/* (+ соседние Controllers/Api/* на manager routes) |
Маршруты FastRoute: request → Response / HttpStatus |
| Domain facade (MS2-style) | Controllers/Cart, Order, Customer |
Публичный фасад для $ms3->cart / $ms3->order / $ms3->customer и DI; делегирует в Services/ |
| Provider plugins | Controllers/Delivery, Payment |
Abstract base для методов доставки/оплаты (не DI-фасады ms3_*) |
| Services | Services/* |
Каноническая бизнес-логика |
DI-ключи фасадов (см. также ServiceRegistry):
| DI key | Класс | Роль |
|---|---|---|
ms3_cart |
MiniShop3\Controllers\Cart\Cart |
Domain facade корзины (не HTTP) |
ms3_order |
MiniShop3\Controllers\Order\Order |
Domain facade заказа (не HTTP) |
ms3_customer |
MiniShop3\Controllers\Customer\Customer |
Domain facade покупателя (не HTTP) |
Переименование namespace (Domain\ / Facades\) остаётся на отдельный major с bc-aliases. Сейчас граница зафиксирована документацией и PHPDoc.
- Форкните репозиторий
- Создайте ветку (
git checkout -b feature/amazing-feature) - Закоммитьте изменения (
git commit -m 'Add amazing feature') - Запушьте ветку (
git push origin feature/amazing-feature) - Откройте Pull Request
Если удаляете PHP-файл из поставляемого компонента (core/components/minishop3/ или assets/components/minishop3/), добавьте путь в config/obsolete_package_files.php. При апгрейде MODX копирует новое дерево и не удаляет файлы, которых больше нет в пакете. Оставшийся processor по-прежнему вызывается через connector.php. Подробности: .github/CONTRIBUTING.md.
Из core/components/minishop3 после composer install:
| Команда | Что проверяет |
|---|---|
composer test:smoke |
Скрипты tests/*Test.php без ядра MODX |
composer test |
PHPUnit Unit + Integration + WebApi на стабах xPDO |
composer ci:php |
php -l + smoke + composer test (job PHP lint + smoke) |
composer stan:prepare && composer stan |
PHPStan level 5, baseline в phpstan-baseline.neon |
composer test:modx |
Живое ядро MODX 3.1+ / 3.2 через modxkit/testbench |
composer test и ci:php не поднимают ядро. Для test:modx нужны MySQL и переменные MODX_TESTBENCH_DB_HOST, MODX_TESTBENCH_DB_USER, MODX_TESTBENCH_DB_PASS. Подробности: core/components/minishop3/tests/Modx/README.md.
Тесты @group mysql входят в composer test. Job PHP lint + smoke поднимает MySQL 8 и задаёт MS3_TEST_MYSQL_DSN, MS3_TEST_MYSQL_USER, MS3_TEST_MYSQL_PASSWORD. Локально без MS3_TEST_MYSQL_DSN эта группа пропускается.
CI гоняет live-сьют на MODX 3.1.2-pl, 3.2.3-pl и 3.2.4-pl. Линейка 3.0.x в этом сьюте не проверяется: ядро не поднимается в API-режиме.
Из vueManager (Node.js 18+ локально, в CI 24):
Job vueManager lint запускает:
npm ci
npm run lint:ci
npm run lint:storefront
npm test
npm run test:smokelint:storefront проверяет assets/components/minishop3/js/web. test:smoke проверяет экспорт VueTools. npm run build в этом job нет: сборка нужна локально, когда пакет собираете из исходников.
История изменений: CHANGELOG.md. Помесячные файлы лежат в changelogs/.
Распространяется под лицензией MIT — она объявлена в core/components/minishop3/composer.json.
- 🐛 GitHub Issues: баги и предложения
- 📚 Документация: руководства и справочники
- 💬 Telegram: сообщество MODX
Сделано с ❤️ для сообщества MODX
