Skip to content

fix(product): сохранение options-* при обновлении товара, MODX 3 (#199)#256

Merged
biz87 merged 1 commit into
betafrom
fix/199-product-options-update-processor
May 17, 2026
Merged

fix(product): сохранение options-* при обновлении товара, MODX 3 (#199)#256
biz87 merged 1 commit into
betafrom
fix/199-product-options-update-processor

Conversation

@biz87
Copy link
Copy Markdown
Member

@biz87 biz87 commented May 17, 2026

Перенос (с ребейзом) PR #236 от @Ibochkarev — оригинальная ветка в форке автора отставала от `beta` и конфликтовала по `CHANGELOG.md` после мержа PR #253 / #254. Сам фикс автора оставлен один в один.

Что в этом PR

2 файла, +20/−8 поверх актуального `beta`. Один коммит, авторство @Ibochkarev сохранено.

`core/components/minishop3/src/Processors/Product/Update.php`

Закрывает баг #199 на MODX 3: при сохранении товара через стандартный процессор обновления удалённые из формы опции не вычищались из таблицы `ms3_product_options`.

Корень бага. В `beforeSet` массив `options-*` парсился и клался в свойство процессора через `setProperty('options', ...)`. В `afterSave` читался обратно: `$this->getProperty('options')`. На MODX 3 после `parent::afterSave()` это свойство часто оказывается пустым (внутренняя механика процессора пересобирает properties), и `ProductDataService::saveOptions(..., removeOther: true)` не выполнялся.

Фикс. Дополнительное защищённое поле процессора `$ms3ProductFormOptions` — заполняется в `beforeSet`, читается в `afterSave` вместо `getProperty('options')`. Свойство `options` для совместимости с внешними хуками сохранено (`setProperty` остаётся).

Тонкая деталь: различены сценарии «в запросе вообще не было полей `options-`» (поле остаётся `null`, ничего не делаем) и «были `options-`, но все пустые» (поле = `[]`, вызываем `saveOptions` с `removeOther=true` — удаляем все опции). Без этой ветви было бы невозможно удалить последнюю опцию через форму.

`CHANGELOG.md`

Подпункт «Опции товара — удаление не применялось после сохранения» добавлен в существующий блок `## Май 2026 → ### Разработка → #### 🐛 Исправлено` рядом с уже мерженными пунктами про `returnedValues` (#245) и `msCart` (#254).

Что разрешено при ребейзе

  • Git auto-merge поставил новый пункт в `CHANGELOG.md` в раздел `## Апрель 2026 / 1.10.1-beta1` (нашёл точку вставки по контексту `fix(manager): invoke msOrderProduct lifecycle events in Manager API #208`). Перенесён в правильное место — `## Май 2026 / Разработка / 🐛 Исправлено`. Содержание самого пункта не менялось.

Тип релиза

PATCH. Bug fix без breaking changes. В минор 1.11.0-beta1.

Тестирование

  • PHPStan на трогаемом файле — 0 ошибок.
  • Файл синхронизирован на dev-сайт.
  • Ручная проверка по сценарию из [Bug] Не удаляется опция из товара #199:
    • Создать товар с опцией, сохранить.
    • Скопировать товар (или вручную удалить опцию из формы).
    • Сохранить.
    • Перезагрузить карточку — удалённой опции в `ms3_product_options` быть не должно.

Связанные

…Save (#199)

- Capture options-* in beforeSet (ms3ProductFormOptions); MODX 3 may clear
  getProperty('options') after parent::afterSave(), so explicit saveOptions with
  removeOther=true was skipped and ms3_product_options rows could remain.
- CHANGELOG: note follow-up to #199/#202

Fixes #199
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Не удаляется опция из товара

2 participants