fix(manager): опции — дерево категорий при вложенном каталоге#239
fix(manager): опции — дерево категорий при вложенном каталоге#239Ibochkarev wants to merge 4 commits into
Conversation
cb0af6c to
b8b4a8e
Compare
b8b4a8e to
31a4c7c
Compare
|
Сделал ребейз на актуальный Содержание фикса не менялось — авторство в коммите сохранено. При разрешении CHANGELOG: подпункт «Дерево категорий в UI привязки опций при отсутствии Проверки:
Готов к мержу. |
Ревью PR #239Спасибо, баг #237 описан точно — на сайтах, где
Но при разборе подхода всплыла проблема, которую хочется решить до мержа. Что не покрываетсяСистемная настройка ``` Все три магазина — обычные контейнеры под `parent=0`, и `msCategory` лежат под каждым из них. Опции в MS3 при этом глобальные (одна `Цвет` может быть привязана к категориям из всех трёх магазинов), но настройка позволит выбрать только один корень. В двух магазинах из трёх UI привязки опций останется неработоспособным. Похожие конфигурации: маркетплейс с несколькими витринами, мультибренд с раздельными каталогами, мультирегиональный сайт без `context_key`-разделения. Что предлагаю взаменУбрать настройку и фильтровать дерево по семантике, без зависимости от структуры сайта. На каждом уровне отдавать:
Отсекаются:
На фронте в `OptionCategoryTree.vue` достаточно одной проверки на класс узла, чтобы решать — рисовать чекбокс или нет. Преимущества подхода
Точки переработки
Альтернатива (более точная, но дороже)Если простой фильтр по `isfolder=1` смущает тем, что покажет «лишние» контейнеры типа «Блог» или «Документация», можно отдавать только те контейнеры, которые ведут к `msCategory` где-то в потомках. Это один дополнительный запрос при первой загрузке (собрать ID-предков всех msCategory). Для типовых проектов на 3–5 контейнеров под корнем — overkill, простой фильтр работает не хуже. Но если хочется идеальной чистоты дерева — рассмотреть. Технически фикс правильный для одного частного сценария. Архитектурно — лучше сделать универсальное решение один раз, чем потом добавлять второй параметр под мульти-магазин. Поэтому прошу переработать и отправить v2. Если по подходу остались сомнения или хочется обсудить детали — давайте в этом треде. |
e39e052 to
89ab64c
Compare
biz87
left a comment
There was a problem hiding this comment.
Спасибо, что переработали. К сожалению, после анализа кода — описание PR расходится с реализацией, и проблема issue #237 в полной мере не решена.
Что обещано в описании
msCategoryотображаются как выбираемые узлы с чекбоксом.- Контейнеры MODX (
modResource/modDocument/modWebLinkсisfolder = 1) отображаются только для навигации, без чекбокса.msProductи обычные страницы безisfolderисключаются из дерева.Такой подход поддерживает вложенные каталоги, несколько витрин/магазинов под разными контейнерами и смешанные структуры без дополнительных системных настроек.
Что есть в коде
OptionsController::getTree()жёстко фильтрует толькоmsCategory:
$q->where([
'modResource.parent' => $parent,
'modResource.deleted' => 0,
'modResource.class_key' => msCategory::class,
]);Никакой логики isfolder = 1 для контейнеров нет. Контейнеры из выдачи просто выпадают, до вложенных msCategory пройти невозможно.
- Системная настройка
ms3_option_category_tree_parentне удалена:_build/elements/settings.php— настройка по-прежнему регистрируется;- лексиконы
setting_ms3_option_category_tree_parentоставлены на ru/en; OptionsController::resolveOptionsTreeParentId()использует её как fallback приparent = 0:
$configured = (int)$this->modx->getOption('ms3_option_category_tree_parent', null, 0);
return $configured > 0 ? $configured : 0;- Vue-компонент
OptionCategoryTree.vueпоменял только PHPDoc-комментарий к proprootParent. Никакой клиентской логики для различения «навигационный контейнер vs выбираемая категория» нет.
Что это значит на практике
Issue #237 (несколько витрин / вложенные каталоги под контейнерами) по-прежнему не закрывается:
- Если
msCategoryлежат не подparent = 0, а под/shop/catalog(isfolder = 1) — без явного указанияms3_option_category_tree_parent = <id /shop/catalog>дерево останется пустым. То же поведение, что в v1. - Если несколько магазинов в разных контейнерах (
/shop1/catalog,/shop2/catalog) — настройка одна, поддержать оба сценария нельзя.
Это та же проблема, что v1, только переименована.
Что ожидаем в v3
-
Удалить
ms3_option_category_tree_parentцеликом:_build/elements/settings.php, лексиконы (setting_ms3_option_category_tree_parent+area_ms3_optionsесли не используется в других настройках),OptionsController::resolveOptionsTreeParentId()и его вызовы,controllers/category/update.class.php,controllers/mgr/settings.class.php,OptionCategoryTree.vueproprootParent(если он больше не используется). -
OptionsController::getTreeдолжен на уровнеparentотдавать:- все
msCategory— выбираемые узлы, с чекбоксом (как сейчас); - все
modResource isfolder = 1(modResource/modDocument/modWebLink), которые содержатmsCategoryв поддереве — как навигационные, без чекбокса. Узлы безmsCategoryв поддереве в дерево не попадают (фильтруем мусор).
Один из способов реализации проверки «есть ли
msCategoryв поддереве» — рекурсивный CTE, либо два запроса (сначала собрать кандидатов-контейнеров, потом для каждого проверить наличие потомков). Конкретный механизм на ваше усмотрение. - все
-
В ответе
getTreeдля каждого узла добавить флагselectable(trueдляmsCategory,falseдля контейнеров) или просто отдаватьclass_key— фронт уже решит. -
Vue-компонент
OptionCategoryTree.vue: рендерить чекбокс только для узлов сselectable = true/class_key = msCategory; для остальных оставить только стрелку раскрытия. Клик по навигационному узлу не должен добавлять его вmodelValue.
CHANGELOG
Запись в текущем PR описывает архитектуру через системную настройку — нужно переписать под реальную семантику v3 (без настройки) и убрать из 🐛 Исправлено неверные пункты.
Понимаю, что задача нетривиальная — особенно «isfolder с проверкой msCategory в поддереве». Если хочется упростить — можно отдавать все isfolder = 1 контейнеры без проверки поддерева; тогда в дереве будет шум (пустые навигационные ветки), но менеджер сможет пройти к категориям. Это запасной вариант, обсудим если упрётесь в производительность.
Ждём v3.
1ad67f7 to
0ec6863
Compare
Add ms3_option_category_tree_parent setting and resolve parent=0 in OptionsController::getTree. Expose optionCategoryTreeParent in ms3.config; Vue passes rootParent. CHANGELOG + ru/en lexicons.
…237) Treat missing `selectable` as true (old tree payload). Document category class_key variants in OptionsController.
a7b593f to
77ac826
Compare
Описание
Исправлено пустое дерево категорий в UI привязки опций при
GET /api/mgr/options/tree?parent=0, когда категории магазина (msCategory) не являются прямыми потомками корня сайта.Дерево теперь строится по семантике ресурсов без дополнительных системных настроек:
msCategoryотображаются как выбираемые узлы с чекбоксом.modResource/modDocument/modWebLinkсisfolder = 1) отображаются только для навигации, без чекбокса.msProductи обычные страницы безisfolderисключаются из дерева.Backend (
OptionsController::getTree) фильтрует узлы поclass_keyиisfolder, добавляет флагselectableдля каждого узла. Vue-компонентOptionCategoryTreeрендерит чекбокс только для узлов сselectable = true, навигационные контейнеры визуально отличаются (opacity, italic).Такой подход поддерживает вложенные каталоги, несколько витрин/магазинов под разными контейнерами и смешанные структуры без дополнительной настройки.
OptionCategoryTreeвсегда начинает загрузку сparent = 0, а backend сам отдаёт только релевантные узлы дерева.Тип изменений
Связанные Issues
Closes #237
Как это было протестировано?
msCategoryпод контейнером, несколько контейнеров-магазинов подparent = 0, регрессия сmsCategoryпод корнем.php -lпо изменённым PHP-файлам, targeted ESLint по изменённым Vue-компонентам,npm run build,git diff --check.Конфигурация тестирования:
Команды:
php -l core/components/minishop3/src/Controllers/Api/Manager/OptionsController.phpnpx eslint src/components/OptionCategoryTree.vue src/components/OptionsGrid.vue src/components/CategoryOptionsTab.vue --fixвvueManagernpm run buildвvueManagergit diff --checkЧеклист
Дополнительные заметки
Системная настройка
ms3_option_category_tree_parentне используется и не требуется: дерево категорий работает для простой структуры, вложенного каталога и мульти-магазинных конфигураций из коробки.Навигационные контейнеры нужны только для прохода к вложенным
msCategory; выбрать их как категорию для опций нельзя.