Skip to content

fix(product): удаление опции из товара при сохранении формы#202

Merged
biz87 merged 1 commit into
modx-pro:betafrom
Ibochkarev:fix/199-product-option-remove
Apr 18, 2026
Merged

fix(product): удаление опции из товара при сохранении формы#202
biz87 merged 1 commit into
modx-pro:betafrom
Ibochkarev:fix/199-product-option-remove

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

При сохранении товара в менеджере опции из POST (options-*) синхронизировались с removeOther=false, поэтому строки в msProductOption для ключей, которых больше нет в отправленной форме (после удаления опции пользователем, в том числе после копирования товара), не удалялись и снова появлялись после перезагрузки.

Вызовы saveOptions из процессоров Product/Create и Product/Update переведены на removeOther=true. Путь saveOptions(null) из msProductData::save() не менялся: при автосборе только JSON-полей по-прежнему принудительно removeOther=false, чтобы не повторить регрессию #153/#158 (кастомные опции категорий).

Дополнительно уточнён PHPDoc ProductDataService::saveOptions() и комментарии в процессорах.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #199

Как это было протестировано?

Локально не запускалось в этом PR; рекомендуется проверить сценарий: копирование товара → удаление опции на вкладке опций → сохранение → перезагрузка карточки — опция не должна возвращаться. Дополнительно — сохранение товара с опциями только из категории (не в JSON), без открытия полной формы опций, чтобы убедиться в отсутствии регрессии #153.

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3:
  • MODX:
  • PHP:

Скриншоты (если применимо)

До После

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок
  • ESLint проходит без ошибок (для JS/Vue изменений)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

Ревьюеру: сравнить с логикой OptionSyncService::removeUnusedOptions и принудительным removeOther=false в ProductDataService при options === null.

…#199)

Явный saveOptions из POST options-* теперь с removeOther=true, чтобы строки
msProductOption для отсутствующих в форме ключей удалялись. Путь saveOptions(null)
из msProductData::save() без изменений (removeOther=false для modx-pro#153/modx-pro#158).

Обновлены PHPDoc ProductDataService и комментарии процессоров.
@Ibochkarev Ibochkarev changed the title fix(product): удаление опции из товара при сохранении формы (#199) fix(product): удаление опции из товара при сохранении формы Apr 17, 2026
@Ibochkarev Ibochkarev requested a review from biz87 April 17, 2026 06:32

@biz87 biz87 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ревью

Точечный и правильный фикс. Изменение минимальное — 4 файла, суть в одном символе: falsetrue.

Анализ

Проблема: при сохранении товара из формы опции передаются как options-color, options-size и т.д. Если пользователь удалил опцию, её ключ отсутствует в POST. Но saveOptions($options, false) не удалял строки из msProductOption для отсутствующих ключей — опция возвращалась после перезагрузки.

Фикс: saveOptions($options, true) — POST из формы содержит полный набор опций. Отсутствующие ключи = удалённые пользователем → нужно удалить из БД.

Защита от регрессии #153/#158: при saveOptions(null) (автосбор JSON-полей из msProductData::save()) — removeOther принудительно false на строке 144 ProductDataService.php:

$removeOther = $optionsExplicit ? $removeOther : false;

Кастомные опции категорий не затрагиваются. Защита работает корректно.

Замечания

Нет. Фикс логичный, комментарии подробные, PHPDoc обновлён.

LGTM 👍

@biz87 biz87 merged commit af4bbd1 into modx-pro:beta Apr 18, 2026
@Ibochkarev Ibochkarev deleted the fix/199-product-option-remove branch April 18, 2026 16:52
@biz87 biz87 mentioned this pull request Apr 20, 2026
2 tasks
Ibochkarev added a commit to Ibochkarev/MiniShop3 that referenced this pull request May 17, 2026
…Save (modx-pro#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 modx-pro#199/modx-pro#202

Fixes modx-pro#199
Ibochkarev added a commit to Ibochkarev/MiniShop3 that referenced this pull request May 17, 2026
…Save (modx-pro#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 modx-pro#199/modx-pro#202

Fixes modx-pro#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