Компонент: 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 при этом чисто — падение чисто клиентское.
Как воспроизвести
- Завести политику доступа на шаблоне
AdministratorTemplate, выдать в ней права
уровня контент-менеджера (edit_document, save_document, view_document,
resource_tree, save, list, load, frames, menu_site и т. п.),
resourcegroup_resource_list оставить невыданным.
- Привязать политику к группе пользователей на контекст
mgr, положить туда
тестового пользователя.
- Войти этим пользователем и открыть на редактирование любой товар.
Результат: пустая страница и ошибка выше в консоли.
Категория при тех же правах открывается нормально.
Причина
Ядро MODX добавляет вкладку «Права доступа» только при наличии права
resourcegroup_resource_list — manager/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 попадает undefined → MODx.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.
Компонент: 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) у того же пользователя открывается и редактируется нормально.Под администратором с полными правами товар тоже открывается — баг не проявляется.
В консоли браузера:
В журнале MODX и в логе PHP при этом чисто — падение чисто клиентское.
Как воспроизвести
AdministratorTemplate, выдать в ней правауровня контент-менеджера (
edit_document,save_document,view_document,resource_tree,save,list,load,frames,menu_siteи т. п.),resourcegroup_resource_listоставить невыданным.mgr, положить тудатестового пользователя.
Результат: пустая страница и ошибка выше в консоли.
Категория при тех же правах открывается нормально.
Причина
Ядро MODX добавляет вкладку «Права доступа» только при наличии права
resourcegroup_resource_list—manager/assets/modext/widgets/resource/modx.panel.resource.js:ms3.panel.UpdateProduct.getFields()разбирает вкладки, полученные от родителя,и в конце возвращает их обратно без проверки на существование —
js/mgr/product/update.js, строки 136-137:Права нет → вкладку ядро не создало →
accessPermissionsTabостаётсяundefined→в массив
itemsпопадаетundefined→MODx.FormPanel.addChangeEvent()рекурсивнообходит
itemsкаждого элемента и падает наundefined.items. Конструктор панелине отрабатывает, поэтому форма не строится вовсе.
Почему у категории этой проблемы нет
В
js/mgr/category/update.js(строки 137-138) тот же код написан с проверкой:То есть защита в компоненте уже есть — её просто не продублировали в карточке товара.
Предлагаемая правка
assets/components/minishop3/js/mgr/product/update.js, строки 136-137 — привестик тому же виду, что в категории:
modx-page-settingsядро добавляет всегда, так что практически страхует втораястрока, но проверять стоит обе: набор вкладок меняют и Form Customization,
и сторонние плагины на
OnDocFormRender.Обходной путь для тех, кто столкнётся
Выдать пользователю право
resourcegroup_resource_list— вкладка появится, иundefinedв массив не попадёт. Право только показывает вкладку «Права доступа»;чтобы менять привязку ресурса к группам, нужно ещё
resourcegroup_resource_edit.