|
19 | 19 |
|
20 | 20 | ### 🚀 Версия 1.8.0-beta1 |
21 | 21 |
|
22 | | -**Тип релиза:** MINOR (beta) — Order Tabs Registry, модульные роуты аддонов, inline-edit, миграция галереи на Vue, баг-фиксы |
| 22 | +**Тип релиза:** MINOR (beta) — Order Tabs Registry, модульные роуты аддонов, баг-фиксы |
| 23 | + |
| 24 | +--- |
| 25 | + |
| 26 | +#### ✨ Добавлено |
| 27 | + |
| 28 | +**MS3OrderTabsRegistry — кастомные вкладки в окне заказа (#166, #167):** |
| 29 | +- `window.MS3OrderTabsRegistry.register()` — регистрация Vue и ExtJS вкладок на странице заказа без правки ядра |
| 30 | +- Pre-mount очередь: плагины через `msOnManagerCustomCssJs` могут регистрировать табы до маунта Vue |
| 31 | +- Общие пропсы для плагин-табов: `orderId`, `order`, `config`, `isCreateMode` |
| 32 | +- `hideOnCreate` — скрытие вкладки в режиме создания заказа |
| 33 | +- Защита reserved keys (info, products, address, history), валидация конфига, snapshot очереди |
| 34 | +- Ленивый маунт ExtJS-панелей при первом открытии вкладки, cleanup в `onBeforeUnmount` |
| 35 | +- Утилита `orderPluginTab.js` — валидация и нормализация конфига |
| 36 | + |
| 37 | +**Модульная регистрация роутов для аддонов — `core/config/ms3.routes.d/` (#169):** |
| 38 | +- Загрузка фрагментов `*.php` из `ms3.routes.d/web/` и `ms3.routes.d/manager/` (алфавитный порядок) после системных и custom-файлов, до `build()`; переопределение по ключу `METHOD:PATTERN` |
| 39 | +- Метод `Router::loadRoutesFromDirectory()`, путь `Router::coreAddonRoutesDirectory('manager'|'web')` с проверкой аргумента; `api.php` и `Processors\Api\Index` грузят web-фрагменты; `Processors\Api\Router` (встроенная админка) — только manager-фрагменты |
| 40 | +- Resolver создаёт каталоги при установке; примеры `example-addon.php.dist` в компоненте для копирования в `core/config/` |
| 41 | + |
| 42 | +#### 🐛 Исправлено |
| 43 | + |
| 44 | +- **Пустая строка в decimal/int Extra Fields ломала сохранение товара (#170):** пустое значение кастомного поля (например `wholesale_price`) вызывало MySQL ошибку `Incorrect decimal value`, `save()` возвращал `false` и категории/опции/ссылки молча не сохранялись — хардкод каста `price`/`old_price`/`weight` заменён на универсальный цикл по `_fieldMeta` для всех `float`, `integer` и `boolean` полей |
| 45 | +- **Чекбокс «Скрыть дочерние ресурсы» не сохранялся в категориях (#161, #160):** `hide_children_in_tree` не обрабатывался в `handleCheckBoxes()` процессоров `Category/Update` и `Category/Create` — unchecked-состояние не передавалось в POST и значение сбрасывалось |
| 46 | +- **`publish_document` передавался как bool вместо int в контроллерах (#160):** `canPublish` не приводился к `(int)` в массиве JS-конфига — MODX JS использует строгое сравнение `=== 1`, из-за чего флаг мог не срабатывать. Исправлено во всех 4 контроллерах |
| 47 | +- **Кнопки «Дублировать» и «Опубликовать» не отображались в гриде товаров категории (#143, #163):** миграция обновляет конфиг колонки `actions` в `ms3_grid_fields` — добавлены действия `duplicate` и `publish` (логика уже была в Vue-компоненте) |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +### 🚀 Версия 1.7.0-beta1 |
| 52 | + |
| 53 | +**Тип релиза:** MINOR (beta) — inline-edit, форматированные плейсхолдеры, миграция галереи на Vue, баг-фиксы |
23 | 54 |
|
24 | 55 | --- |
25 | 56 |
|
|
62 | 93 | - При создании заказа кастомные поля передаются в события `msOnBeforeCreateOrder` / `msOnCreateOrder` через параметр `customFields`, после чего очищаются |
63 | 94 | - Чекбоксы на фронтенде отправляют состояние `input.checked` (`'1'`/`'0'`) вместо статического атрибута `value` |
64 | 95 |
|
65 | | -**MS3OrderTabsRegistry — кастомные вкладки в окне заказа (#166, #167):** |
66 | | -- `window.MS3OrderTabsRegistry.register()` — регистрация Vue и ExtJS вкладок на странице заказа без правки ядра |
67 | | -- Pre-mount очередь: плагины через `msOnManagerCustomCssJs` могут регистрировать табы до маунта Vue |
68 | | -- Общие пропсы для плагин-табов: `orderId`, `order`, `config`, `isCreateMode` |
69 | | -- `hideOnCreate` — скрытие вкладки в режиме создания заказа |
70 | | -- Защита reserved keys (info, products, address, history), валидация конфига, snapshot очереди |
71 | | -- Ленивый маунт ExtJS-панелей при первом открытии вкладки, cleanup в `onBeforeUnmount` |
72 | | -- Утилита `orderPluginTab.js` — валидация и нормализация конфига |
73 | | - |
74 | | -**Модульная регистрация роутов для аддонов — `core/config/ms3.routes.d/` (#169):** |
75 | | -- Загрузка фрагментов `*.php` из `ms3.routes.d/web/` и `ms3.routes.d/manager/` (алфавитный порядок) после системных и custom-файлов, до `build()`; переопределение по ключу `METHOD:PATTERN` |
76 | | -- Метод `Router::loadRoutesFromDirectory()`, путь `Router::coreAddonRoutesDirectory('manager'|'web')` с проверкой аргумента; `api.php` и `Processors\Api\Index` грузят web-фрагменты; `Processors\Api\Router` (встроенная админка) — только manager-фрагменты |
77 | | -- Resolver создаёт каталоги при установке; примеры `example-addon.php.dist` в компоненте для копирования в `core/config/` |
78 | | - |
79 | 96 | #### 🐛 Исправлено |
80 | 97 |
|
81 | 98 | - **Не удалялись опции товара в админке (#148, #149):** форма отправляла `options-color[]`, но `substr($key, 8)` давал ключ `color[]` вместо `color` — опция не матчилась и не удалялась. Парсинг вынесен в `Utils::extractOptionKey()` с `rtrim('[]')`. Также исправлена обработка пустого массива опций в `OptionSyncService` |
|
92 | 109 | - **Некорректные URL в ЛК заказов клиента (#141):** кнопка «Сбросить» фильтра и ссылки пагинации вели на корень сайта (`/?`) из-за `<base href>` в шаблоне MODX — URL формируются server-side через `makeUrl()` + `http_build_query()`, пагинация сохраняет фильтр по статусу. Добавлены недостающие SVG-иконки в спрайт (`icon-arrow-left`, `icon-truck`, `icon-credit-card`, `icon-message`), исправлен `fill` → `stroke` для Feather-иконок в деталях заказа |
93 | 110 | - **Некорректные URL и хардкод английских сообщений в ЛК адресов (#142):** кнопки «Добавить адрес», «Редактировать», «Отмена» вели на корень сайта — URL формируются server-side через `makeUrl()` + `http_build_query()`. API-контроллер `CustomerAddressController` содержал хардкод английских строк вместо лексиконов — все сообщения заменены на `$this->modx->lexicon()`, добавлено 7 ключей в ru/en лексиконы |
94 | 111 | - **Отсутствие ключа `desc` в свойствах сниппетов и источников при сборке пакета (#127):** добавлена инициализация `desc` пустой строкой если ключ отсутствует в определении свойства — устраняет warning/ошибку в `resolver_04_sources` и `resolver_08_snippet_properties` |
95 | | -- **Пустая строка в decimal/int Extra Fields ломала сохранение товара (#170):** пустое значение кастомного поля (например `wholesale_price`) вызывало MySQL ошибку `Incorrect decimal value`, `save()` возвращал `false` и категории/опции/ссылки молча не сохранялись — хардкод каста `price`/`old_price`/`weight` заменён на универсальный цикл по `_fieldMeta` для всех `float`, `integer` и `boolean` полей |
96 | | -- **Чекбокс «Скрыть дочерние ресурсы» не сохранялся в категориях (#161, #160):** `hide_children_in_tree` не обрабатывался в `handleCheckBoxes()` процессоров `Category/Update` и `Category/Create` — unchecked-состояние не передавалось в POST и значение сбрасывалось |
97 | | -- **`publish_document` передавался как bool вместо int в контроллерах (#160):** `canPublish` не приводился к `(int)` в массиве JS-конфига — MODX JS использует строгое сравнение `=== 1`, из-за чего флаг мог не срабатывать. Исправлено во всех 4 контроллерах |
98 | | -- **Кнопки «Дублировать» и «Опубликовать» не отображались в гриде товаров категории (#143, #163):** миграция обновляет конфиг колонки `actions` в `ms3_grid_fields` — добавлены действия `duplicate` и `publish` (логика уже была в Vue-компоненте) |
99 | 112 |
|
100 | 113 | #### ⚠️ Breaking changes |
101 | 114 |
|
|
0 commit comments