Skip to content

[Bug] Форма заказа: пустые блоки полей при кириллических label в combo model-fields #618

Description

@Ibochkarev

Описание проблемы

На странице заказа в менеджере (mgr/order) вкладки «Информация о заказе» и «Адрес» показывают:

Для этой вкладки не настроены поля формы заказа.

При этом в БД видимые msModelField и секции есть. Проблема не в ACL mssetting_save (это #613 / #614): GET /api/mgr/model-fields/visible/msOrder под пользователем без mssetting_save успешно отдаёт поля.

Корневая причина: в ComboConfigManager::buildLabel() вызывается preg_replace('/\s+/', ' ', $label) без Unicode-флага /u. В PCRE без /u символ \s совпадает с байтом 0xA0, а это второй байт UTF-8 для кириллической «Р» (U+0420 = D0 A0). Лейблы вроде «Руслан …» портятся → json_encode payload visible/* падает или Vue получает пустые results/sections → форма рисует empty-state.

Шаги воспроизведения

  1. Иметь покупателей/опции combo с кириллическими именами, начинающимися на «Р» (или другой символ с 0xA0 во втором байте UTF-8).
  2. Открыть менеджер → MiniShop3 → Заказы → любой заказ (например id=560).
  3. Вкладка «Информация о заказе» / «Адрес».

Ожидаемое поведение

Секции «Основная информация», «Дополнительно», адресные блоки и кнопка «Сохранить» отображаются; GET /api/mgr/model-fields/visible/msOrder стабильно отдаёт results + sections + валидный UTF-8 comboOptions.

Фактическое поведение

Сводка заказа видна, ниже текст «поля формы не настроены». Иногда повторный запрос visible/msOrder через браузер отдаёт полный envelope (~30KB, 5 results), иногда — пустой объект {"results":[],"sections":[],"comboOptions":{}} без нормального наполнения combo.

Скриншоты

На project.test при заказе #2605/1 (id=560): сводка есть, блоки полей пустые.

Окружение

  • MiniShop3: 1.13.0-beta1
  • MODX: 3.2.3 / 3.2.0-pl
  • PHP: 8.3+ / 8.5.6 (project.test)
  • Браузер: Cursor IDE browser / Chrome

Логи ошибок

Диагностика
Файл: core/components/minishop3/src/Services/ComboConfigManager.php
Метод: buildLabel()
Строка: preg_replace('/\s+/', ' ', $label);  // нужен /u

CLI getVisibleFields(msOrder) после фикса /u: results=5, sections=2, json_encode OK, bad_utf8=0
ACL (#613) не виноват: read visible = 200, write settings = 403 mssetting_save

Дополнительный контекст

  • Связано с проверкой #613 на project.test, но это отдельный баг.
  • Предлагаемый фикс: preg_replace('/\s+/u', ' ', $label) + regression-тест на лейбл с «Р» / invalid-UTF-8 hardening при необходимости.
  • Не путать с отсутствием политики miniShopManagerPolicy.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions