fix(options): clear orphan msOption.modcategory_id on modCategory removal#228
Merged
fix(options): clear orphan msOption.modcategory_id on modCategory removal#228
Conversation
…oval Subscribes the MiniShop3 plugin to OnCategoryRemove and resets msOption.modcategory_id to 0 for any options that referenced the removed modCategory. Without this, deleting a modCategory (e.g. on uninstall of a third- party component) leaves dangling FK references on msOption. modcategory_id. The product options UI groups options by the raw id, so two different orphan ids both render as separate "Без группы" tabs even though category_name is empty for both. Mirrors the built-in MODX behaviour: modCategory::remove() already resets the `category` field to 0 on modChunk / modPlugin / modSnippet / modTemplate / modTemplateVar — we extend the same pattern to msOption. Existing dirty rows (orphan modcategory_id from past removals) are not touched here. Operators can clean them up manually with one of: UPDATE modx_ms3_options o LEFT JOIN modx_categories c ON c.id = o.modcategory_id SET o.modcategory_id = 0 WHERE o.modcategory_id > 0 AND c.id IS NULL; or the equivalent xPDO loop. Architectural follow-up (whether msOption should be tied to modCategory at all) is tracked separately in #227.
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблема
В карточке товара на вкладке «Опции товара» появляются два таба с одинаковой подписью «Без группы» (плюс реальный таб именованной группы). Скриншот:
Причина — у опций, относящихся к этим двум табам, в БД лежат разные
modcategory_id, ссылающиеся на уже удалённыеmodCategory(типичный сценарий — деинсталляция стороннего компонента, который при установке создавал свою категорию для опций MS3).В
OptionLoaderService::getFieldsForProduct()группировка делается черезLEFT JOIN modCategory. Для удалённых категорийcategory_nameприходитNULL, ноmodcategory_idсохраняется. Vue-компонентProductOptionsTab.vueгруппирует строго по сыромуmodcategory_id:→ две группы с разными мёртвыми
modcategory_id→ два отдельных таба с одинаковым фолбэк-заголовком «Без группы».Что сделано
Подписал плагин
MiniShop3на событиеOnCategoryRemoveи в обработчике обнуляюmsOption.modcategory_idдля всех записей, ссылавшихся на удалённую категорию.Это зеркалит штатный MODX-паттерн — внутри
modCategory::remove()уже происходит сброс поляcategoryк 0 дляmodChunk,modPlugin,modSnippet,modTemplate,modTemplateVar. Просто расширяем его наmsOption.Плюс зарегистрировал
OnCategoryRemoveв_build/elements/plugins.php— чтобы привязка плагин↔событие применилась при сборке/апгрейде пакета.Что НЕ делаем
Миграцию для одноразовой чистки уже грязных данных не добавляю — встретить такой кейс в текущем темпе распространения MS3 редко, и тащить отдельную миграцию ради единичных инсталляций избыточно. Операторы, наткнувшиеся на проблему, могут вычистить руками одной из команд:
SQL (стандартный префикс
modx_):xPDO (если префикс нестандартный):
После применения PR новые висячие связи появляться не будут.
Что не закрывает этот PR
Архитектурный вопрос — нужно ли вообще привязывать
msOptionкmodCategory(стандартной таблице категорий элементов MODX), или собрать собственную таблицуms3_option_groups— вынесен в отдельный issue #227 для обсуждения с комьюнити.Test plan
modCategoryчерез Элементы → Категории → Новая.modCategory.[MiniShop3] Cleared modcategory_id for N option(s) after removing modCategory #ID.Связанные
msOption ↔ modCategory