fix(product): удаление опции из товара при сохранении формы#202
Conversation
…#199) Явный saveOptions из POST options-* теперь с removeOther=true, чтобы строки msProductOption для отсутствующих в форме ключей удалялись. Путь saveOptions(null) из msProductData::save() без изменений (removeOther=false для modx-pro#153/modx-pro#158). Обновлены PHPDoc ProductDataService и комментарии процессоров.
biz87
left a comment
There was a problem hiding this comment.
Ревью
Точечный и правильный фикс. Изменение минимальное — 4 файла, суть в одном символе: false → true.
Анализ
Проблема: при сохранении товара из формы опции передаются как 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 👍
…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
…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
Описание
При сохранении товара в менеджере опции из POST (
options-*) синхронизировались сremoveOther=false, поэтому строки вmsProductOptionдля ключей, которых больше нет в отправленной форме (после удаления опции пользователем, в том числе после копирования товара), не удалялись и снова появлялись после перезагрузки.Вызовы
saveOptionsиз процессоровProduct/CreateиProduct/Updateпереведены наremoveOther=true. ПутьsaveOptions(null)изmsProductData::save()не менялся: при автосборе только JSON-полей по-прежнему принудительноremoveOther=false, чтобы не повторить регрессию #153/#158 (кастомные опции категорий).Дополнительно уточнён PHPDoc
ProductDataService::saveOptions()и комментарии в процессорах.Тип изменений
Связанные Issues
Closes #199
Как это было протестировано?
Локально не запускалось в этом PR; рекомендуется проверить сценарий: копирование товара → удаление опции на вкладке опций → сохранение → перезагрузка карточки — опция не должна возвращаться. Дополнительно — сохранение товара с опциями только из категории (не в JSON), без открытия полной формы опций, чтобы убедиться в отсутствии регрессии #153.
Конфигурация тестирования:
Скриншоты (если применимо)
Чеклист
Дополнительные заметки
Ревьюеру: сравнить с логикой
OptionSyncService::removeUnusedOptionsи принудительнымremoveOther=falseвProductDataServiceприoptions === null.