fix(manager): correct Save button display in products and categories for MODX 3.2#118
fix(manager): correct Save button display in products and categories for MODX 3.2#118
Conversation
…for MODX 3.2
After MODX 3.2.0 update (Editor grids permissions refactor #16653),
the Save button was incorrectly replaced with a lock icon in product
and category update pages.
Fix: explicitly set canSave and locked in $ready config based on
save_document, component-specific permission (msproduct_save/mscategory_save),
and resource checkPolicy('save') for Resource Groups compatibility.
biz87
left a comment
There was a problem hiding this comment.
Ревью PR #118
Как работает родительский контроллер MODX
Порядок вычисления в ResourceUpdateManagerController::process():
getResource()— если!$this->resource->checkPolicy('save')→$this->canSave = falsecheckForLocks()—$this->canSave = hasPermission('save_document') ? 1 : 0. Если ресурс заблокирован другим юзером →$this->canSave = false,$this->locked = truesetPermissions()— если$this->canSaveещё truthy → дополнительно проверяетcheckPolicy('save')
Итого $this->canSave из родителя включает: save_document + checkPolicy('save') + статус блокировки. А $this->locked — только о параллельном редактировании (другой юзер открыл ресурс).
Что было в старом коде
| Product | Category | |
|---|---|---|
canSave |
$this->canSave (родительское, полная проверка) |
hasPermission('mscategory_save') (только компонентный пермишн!) |
locked |
$this->locked |
$this->locked |
Старый баг категории: canSave не учитывал save_document, checkPolicy('save') и статус блокировки.
Замечания
1. Критическое: потеря блокировки ресурса (regression)
$canSaveProduct / $canSaveCategory не проверяет $this->locked. Если у пользователя есть все права, но ресурс заблокирован другим юзером:
$canSaveProduct = true(все три проверки пройдут)'locked' => true ? false : $this->locked→false(замок не показан!)'canSave' => 1(кнопка Сохранить активна!)
Результат: два юзера могут одновременно редактировать ресурс без предупреждения о блокировке.
2. Смешение концепций locked/permissions
Строка 'locked' => $canSaveProduct ? false : $this->locked смешивает два независимых понятия:
locked— параллельное редактирование (другой юзер открыл ресурс)canSave— права на сохранение
locked не должен зависеть от прав — он зависит только от того, редактирует ли кто-то другой.
Рекомендация
Самый простой и корректный фикс — дополнить родительское значение $this->canSave компонентным пермишном, а locked оставить как есть:
Product:
'locked' => $this->locked,
'canSave' => (int) ($this->canSave && $this->modx->hasPermission('msproduct_save')),Category:
'locked' => $this->locked,
'canSave' => (int) ($this->canSave && $this->modx->hasPermission('mscategory_save')),Это:
- Сохраняет всё, что проверяет родитель (
save_document,checkPolicy('save'), блокировка) - Добавляет компонентный пермишн
- Не ломает механизм блокировки ресурсов
- Минимально отличается от исходного кода
Если же $this->canSave в MODX 3.2.0 стал работать некорректно (и именно это сломало кнопку), то нужно разобраться, что именно изменилось в родительском контроллере MODX 3.2.0, и зафиксить точечно, а не переписывать всю логику.
Refactor the logic for determining the 'canSave' and 'locked' states in the product and category update controllers. The changes ensure that the component-specific permissions (msproduct_save/mscategory_save) are correctly applied, improving compatibility with MODX 3.2. This addresses issues where the Save button was incorrectly displayed due to permission checks.
Описание
После обновления MODX до 3.2.0 (Editor grids permissions refactor #16653) кнопка «Сохранить» на страницах редактирования товаров и категорий некорректно заменялась на иконку замка.
Исправление: явно задаём
canSaveиlockedв конфиге$readyна основе проверки правsave_document, компонентной permission (msproduct_save/mscategory_save) иcheckPolicy('save')для совместимости с Resource Groups.Тип изменений
Связанные Issues
Связано с изменениями в MODX 3.2.0 (#16653).
Как это было протестировано?
Конфигурация тестирования:
Чеклист
Дополнительные заметки
Изменения в
product/update.class.phpиcategory/update.class.php: вместо наследования значенийcanSave/lockedот родительского контроллера явно вычисляем их с учётом всех необходимых проверок прав.