Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,54 @@

## Апрель 2026

### [2026-04-27] 🚀 Версия 1.10.1-beta1

**Тип релиза:** PATCH (beta) — точечные исправления и восстановление контракта событий

---

#### 🐛 Исправлено

**Manager API — события жизненного цикла позиции заказа (#208, closes #207):**
- Vue-админка дёргает `msOnBefore/Create/Update/Remove OrderProduct` через `Utils::invokeEvent` при добавлении/изменении/удалении позиций заказа — раньше события были зарегистрированы в `events.php`, но `OrdersController` их не вызывал, и сторонние подписчики (ms3PromoCode и т.п.) не срабатывали.
- Before-hooks могут заблокировать операцию через `Response::error(400)`. After-hooks логируются на WARN-уровне с маркером `(persistence already done)` — ошибка плагина после `save()`/`remove()` не возвращается клиенту как 4xx, потому что persistence уже произошёл.

**Опции товара — переключение групп больше не сбрасывает значения (#230):**
- `ProductOptionsTab.vue` рендерит все группы сразу с `v-show` вместо `v-if`-style монтирования только активной — локальные `value = ref(...)` и hidden inputs сохраняются между переключениями вкладок.
- Раньше значения, введённые в неактивной группе, терялись и не доезжали на бэкенд (MODX/ExtJS `BasicForm.getValues()` собирает только инпуты, физически присутствующие в DOM на момент сабмита).

**Опции товара — висячие `modcategory_id` после удаления категории (#228):**
- Плагин `MiniShop3` подписан на `OnCategoryRemove` — обнуляет `msOption.modcategory_id` для всех опций, ссылавшихся на удалённую `modCategory`. Зеркалит штатный паттерн MODX, где `modCategory::remove()` сбрасывает `category` у `modChunk`/`modPlugin`/`modSnippet`/`modTemplate`/`modTemplateVar`.
- Без фикса в карточке товара мог появиться второй таб «Без группы» с разными мёртвыми `modcategory_id`.

**OrderFinalizeService вызывал несуществующие события (#217):**
- `msOnBeforeFinalizeOrder` / `msOnFinalizeOrder` нигде не были зарегистрированы как `modEvent`, подписать плагин через UI было нельзя. Заменены на `msOnBeforeMgrCreateOrder` / `msOnMgrCreateOrder` — уже существовали в билдере, но никем не вызывались.

**Импорт товаров — неправильный ключ system setting для дефолтного шаблона (#210):**
- `Processors\Utilities\Import\Fields::getTvFields()` использовал несуществующий ключ `ms3_product_default_template`. Корректный ключ — `ms3_template_product_default` (используется в `controllers/product/create.class.php`). Из-за опечатки на экране импорта блок «TV-поля» перечислял все TV вместо только привязанных к шаблону-дефолту.

**Cart API — отсутствующий лексикон (#223, closes #222):**
- Добавлен ключ `ms3_cart_get_success` в `lexicon/{ru,en}/cart.inc.php` — ключ использовался в `Cart::get()`, но без перевода MODX писал в лог `Language string not found`.

**ServiceRegistry — лишний debug-шум в логах (#225, closes #224):**
- На штатной установке без кастомизации сервисов `loadMainConfig()` / `loadAddonConfigs()` писали DEBUG про отсутствие дефолтных override-путей. Теперь логирование срабатывает только если оператор явно задал `ms3_services_config` / `ms3_services_addons_dir` через system settings, а файла/папки по этому пути нет.

#### 📁 Изменённые файлы

```
_build/elements/plugins.php
core/components/minishop3/elements/plugins/minishop3.php
core/components/minishop3/lexicon/en/cart.inc.php
core/components/minishop3/lexicon/ru/cart.inc.php
core/components/minishop3/src/Controllers/Api/Manager/OrdersController.php
core/components/minishop3/src/Processors/Utilities/Import/Fields.php
core/components/minishop3/src/ServiceRegistry.php
core/components/minishop3/src/Services/Order/OrderFinalizeService.php
vueManager/src/components/product/ProductOptionsTab.vue
```

---

### 🚀 Версия 1.10.0-beta1

**Тип релиза:** MINOR (beta) — полный перевод управления опциями с ExtJS на Vue, рефакторинг карточки заказа, self-heal миграция
Expand Down
2 changes: 1 addition & 1 deletion _build/config.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
'name' => 'MiniShop3',
'name_lower' => 'minishop3',
'name_short' => 'ms3',
'version' => '1.10.0',
'version' => '1.10.1',
'release' => 'beta1',
// Install package to site right after build
'install' => false,
Expand Down
11 changes: 11 additions & 0 deletions core/components/minishop3/docs/changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.10.1-beta1]

### Fixed
- Manager API now invokes `msOnBefore/Create/Update/Remove OrderProduct` events when adding, updating, or removing order line items via the Vue admin (#208, closes #207). Before-hooks may abort with HTTP 400; after-hooks are observe-only and their failures are logged at WARN level (`persistence already done`) without returning a 4xx — the row is already in DB. Previously third-party plugins (ms3PromoCode etc.) silently missed these events.
- Product Options tab: switching between option groups no longer wipes user-entered values (#230). All groups are kept mounted via `v-show` instead of `v-if`-style remount, so per-field local state and hidden inputs survive tab switches and reach the form on submit.
- Cleared dangling `msOption.modcategory_id` references when a `modCategory` is removed (#228). Plugin subscribes to `OnCategoryRemove` and resets the link to 0, mirroring how MODX core handles `modChunk` / `modPlugin` / `modSnippet` / `modTemplate` / `modTemplateVar` on category removal. Prevents the duplicate "no group" tab in the product options UI when a third-party component is uninstalled.
- `OrderFinalizeService` now invokes registered `msOnBeforeMgrCreateOrder` / `msOnMgrCreateOrder` instead of non-existent `msOnBeforeFinalizeOrder` / `msOnFinalizeOrder` (#217). The old names were never registered as `modEvent`, so plugins could not subscribe via the UI.
- Import → TV fields panel uses the correct setting key `ms3_template_product_default` (was: non-existent `ms3_product_default_template`), so the panel lists only TVs bound to the configured default product template instead of every TV in the system (#210).
- Added missing lexicon `ms3_cart_get_success` in `lexicon/{ru,en}/cart.inc.php` — the key was used by `Cart::get()` but missing from translations, producing `Language string not found` warnings in MODX logs (#223, closes #222).
- `ServiceRegistry` no longer logs DEBUG noise for missing default optional override paths (`core/config/ms3.services.php`, `core/config/ms3.services.d/`) on stock installations (#225, closes #224). The DEBUG log is preserved when the operator explicitly sets `ms3_services_config` / `ms3_services_addons_dir` system settings to a missing path.

## [1.10.0-beta1]

### Added
Expand Down
2 changes: 1 addition & 1 deletion core/components/minishop3/src/MiniShop3.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

class MiniShop3
{
public $version = '1.10.0-beta1';
public $version = '1.10.1-beta1';

/** @var modX $modx */
public $modx;
Expand Down