Skip to content

fix(manager): correct Save button display in products and categories for MODX 3.2#118

Merged
biz87 merged 2 commits intobetafrom
fix/save-button-lock-modx-3.2
Feb 27, 2026
Merged

fix(manager): correct Save button display in products and categories for MODX 3.2#118
biz87 merged 2 commits intobetafrom
fix/save-button-lock-modx-3.2

Conversation

@Ibochkarev
Copy link
Copy Markdown
Member

Описание

После обновления MODX до 3.2.0 (Editor grids permissions refactor #16653) кнопка «Сохранить» на страницах редактирования товаров и категорий некорректно заменялась на иконку замка.

Исправление: явно задаём canSave и locked в конфиге $ready на основе проверки прав save_document, компонентной permission (msproduct_save/mscategory_save) и checkPolicy('save') для совместимости с Resource Groups.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Связано с изменениями в MODX 3.2.0 (#16653).

Как это было протестировано?

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: beta
  • MODX: 3.2.0+
  • PHP: 8.1+

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en) — не требуется
  • PHPStan проходит без новых ошибок
  • ESLint проходит без ошибок (для JS/Vue изменений) — не применимо
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

Изменения в product/update.class.php и category/update.class.php: вместо наследования значений canSave/locked от родительского контроллера явно вычисляем их с учётом всех необходимых проверок прав.

…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.
@Ibochkarev Ibochkarev marked this pull request as ready for review February 23, 2026 17:24
@Ibochkarev Ibochkarev requested a review from biz87 February 23, 2026 17:24
@Ibochkarev Ibochkarev self-assigned this Feb 23, 2026
Copy link
Copy Markdown
Member

@biz87 biz87 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ревью PR #118

Как работает родительский контроллер MODX

Порядок вычисления в ResourceUpdateManagerController::process():

  1. getResource() — если !$this->resource->checkPolicy('save')$this->canSave = false
  2. checkForLocks()$this->canSave = hasPermission('save_document') ? 1 : 0. Если ресурс заблокирован другим юзером → $this->canSave = false, $this->locked = true
  3. setPermissions() — если $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->lockedfalse (замок не показан!)
  • '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.
@Ibochkarev Ibochkarev requested a review from biz87 February 25, 2026 02:00
@biz87 biz87 merged commit 95c8a68 into beta Feb 27, 2026
@Ibochkarev Ibochkarev deleted the fix/save-button-lock-modx-3.2 branch March 16, 2026 07:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Question] Что означает "замок" и я не могу найти кнопку "сохранить".

2 participants