Skip to content

[Bug] у пользователя без права resourcegroup_resource_list карточка товара открывается пустой #652

Description

@Ivan345com

Компонент: miniShop3 1.13.0-beta1
Элемент: assets/components/minishop3/js/mgr/product/update.js
Версия окружения: MODX Revolution 3.2.4, PHP 8.2


Карточка товара не открывается у менеджера без права resourcegroup_resource_list

Симптом

Пользователь, у которого в политике доступа к контексту mgr не выдано право
resourcegroup_resource_list, при открытии товара на редактирование видит пустую
страницу: шапка админки и дерево ресурсов на месте, область формы пустая.

Категория (msCategory) у того же пользователя открывается и редактируется нормально.
Под администратором с полными правами товар тоже открывается — баг не проявляется.

В консоли браузера:

Uncaught TypeError: Cannot read properties of undefined (reading 'items')
    at ms3.panel.UpdateProduct.addChangeEvent (modx.jsgrps-min.js:26:49283)
    at ms3.panel.UpdateProduct.addChangeEvent (modx.jsgrps-min.js:26:49294)
    at MODx.FormPanel [as constructor] (modx.jsgrps-min.js:26:46780)
    at MODx.panel.Resource [as constructor] (modx.panel.resource.js:34:48)
    at ms3.panel.Product [as constructor] (product.common.js:3:44)
    at new ms3.panel.UpdateProduct (update.js:96:52)
    at Object.create (ext-all.js:21:125217)
    at MODx.load (modx.js:125:38)
    at ms3.page.UpdateProduct._loadComponents (modx.jsgrps-min.js:26:32887)

В журнале MODX и в логе PHP при этом чисто — падение чисто клиентское.

Как воспроизвести

  1. Завести политику доступа на шаблоне AdministratorTemplate, выдать в ней права
    уровня контент-менеджера (edit_document, save_document, view_document,
    resource_tree, save, list, load, frames, menu_site и т. п.),
    resourcegroup_resource_list оставить невыданным.
  2. Привязать политику к группе пользователей на контекст mgr, положить туда
    тестового пользователя.
  3. Войти этим пользователем и открыть на редактирование любой товар.

Результат: пустая страница и ошибка выше в консоли.
Категория при тех же правах открывается нормально.

Причина

Ядро MODX добавляет вкладку «Права доступа» только при наличии права
resourcegroup_resource_listmanager/assets/modext/widgets/resource/modx.panel.resource.js:

if (MODx.perm.resourcegroup_resource_list) {
    it.push(this.getAccessPermissionsTab(config));
}

ms3.panel.UpdateProduct.getFields() разбирает вкладки, полученные от родителя,
и в конце возвращает их обратно без проверки на существование
js/mgr/product/update.js, строки 136-137:

let accessPermissionsTab;
let pageSettingsTab;

item.items.forEach(tabItem => {
    switch (tabItem.id) {
        case 'modx-page-settings':
            pageSettingsTab = tabItem;
            break;
        case 'modx-resource-access-permissions':
            accessPermissionsTab = tabItem;
            break;
        default:
            tabs.push(tabItem);
    }
});

tabs.push(pageSettingsTab);
tabs.push(accessPermissionsTab);   // <-- undefined, если вкладки не было

item.items = tabs;

Права нет → вкладку ядро не создало → accessPermissionsTab остаётся undefined
в массив items попадает undefinedMODx.FormPanel.addChangeEvent() рекурсивно
обходит items каждого элемента и падает на undefined.items. Конструктор панели
не отрабатывает, поэтому форма не строится вовсе.

Почему у категории этой проблемы нет

В js/mgr/category/update.js (строки 137-138) тот же код написан с проверкой:

pageSettingsTab && tabs.push(pageSettingsTab);
accessPermissionsTab && tabs.push(accessPermissionsTab);

То есть защита в компоненте уже есть — её просто не продублировали в карточке товара.

Предлагаемая правка

assets/components/minishop3/js/mgr/product/update.js, строки 136-137 — привести
к тому же виду, что в категории:

-            tabs.push(pageSettingsTab);
-            tabs.push(accessPermissionsTab);
+            pageSettingsTab && tabs.push(pageSettingsTab);
+            accessPermissionsTab && tabs.push(accessPermissionsTab);

modx-page-settings ядро добавляет всегда, так что практически страхует вторая
строка, но проверять стоит обе: набор вкладок меняют и Form Customization,
и сторонние плагины на OnDocFormRender.

Обходной путь для тех, кто столкнётся

Выдать пользователю право resourcegroup_resource_list — вкладка появится, и
undefined в массив не попадёт. Право только показывает вкладку «Права доступа»;
чтобы менять привязку ресурса к группам, нужно ещё resourcegroup_resource_edit.

Activity

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingpriority: highВажно исправить в ближайшее время

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions