Skip to content

fix(policies): формат data для совместимости с апгрейдом MODX - #107

Merged
biz87 merged 1 commit into
betafrom
fix/policies-data-format
Feb 23, 2026
Merged

fix(policies): формат data для совместимости с апгрейдом MODX#107
biz87 merged 1 commit into
betafrom
fix/policies-data-format

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Поле data в политиках доступа передаётся массивом вместо json_encode(array(...)). В build.php массив кодируется в JSON один раз; устраняется двойное кодирование при сборке пакета. Рефакторинг: список разрешений вынесен в $permissions, data собирается через array_fill_keys($permissions, true) (DRY).

При апгрейде MODX (например, 3.12 → 3.20) скрипт upgrade.install.php вызывает array_diff_key($adminPolicy->get('data'), $policy->get('data')). Если в БД попадал двойной JSON или сырая строка, get('data') мог вернуть не массив → PHP 8 TypeError. Корректный формат при сборке устраняет эту причину со стороны экстры.

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

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

Связанные Issues

Closes #100

Связано с modxcms/revolution#16825 (исправление в ядре MODX для modAccessPolicy::get('data')).

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

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

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

  • MiniShop3: текущая ветка
  • MODX: —
  • PHP: —

Скриншоты (если применимо)

Не применимо.

Чеклист

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

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

Поведение для уже установленных сайтов не меняется. Новые установки и пересборки пакета получают корректный JSON в mod_access_policy.data.

- Передаём массив вместо json_encode(): build.php сам кодирует в JSON
- Устранено двойное кодирование при сборке пакета
- Совместимость с апгрейдом MODX (array_diff_key в upgrade.install.php)
- Рефакторинг: список разрешений через array_fill_keys для DRY

Связано: modxcms/revolution#16825, #100
@Ibochkarev
Ibochkarev marked this pull request as ready for review February 23, 2026 03:45
@Ibochkarev
Ibochkarev requested a review from biz87 February 23, 2026 03:45

@biz87 biz87 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM ✅

build.php:487 already calls json_encode($data['data']), so policies.php must return a plain array — the old code pre-encoded it, causing double JSON encoding in the transport package.

array_fill_keys($permissions, true) — clean DRY improvement.

Note: existing installations with corrupted data in DB won't be fixed by this (that's on the MODX core side, modxcms/revolution#16825), but new installs/rebuilds will get correct data.

@biz87
biz87 merged commit 846e167 into beta Feb 23, 2026
@Ibochkarev
Ibochkarev deleted the fix/policies-data-format branch February 23, 2026 10:43
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.

[Bug] обновление modx 3.12 до 3.20

2 participants