Почему MIGX не кодирует кириллицу в MODX и как это исправить
Администраторы MODX Revolution нередко сталкиваются с ситуацией, когда MIGX (версия 3.0.2-beta1) при сохранении данных записывает в базу сырую кириллицу вместо экранированных юникод-последовательностей (например, \u043b\u0438\u0446\u0430). Это приводит к проблемам с мультиязычными плагинами вроде Polylang, а также нарушает стандарты хранения JSON. В статье разберём причины нестабильного поведения и предложим пути решения.
Причины проблемы с кодировкой в MIGX
Ошибка проявляется не на всех полях - некоторые сохраняются корректно, другие - нет. Основные факторы:
- Версия MIGX: 3.0.2-beta1 содержит экспериментальный код, где обработка
json_encodeможет срабатывать не всегда. - Настройки подключения к БД: Если в конфигурации MODX не указана кодировка соединения
utf8, PDO может передавать данные в сыром виде. - Тип данных в таблице: Поля
modx_site_tmplvar_contentvaluesиспользуютutf8_general_ci, но при вставке через MIGX не всегда срабатывает принудительное экранирование. - Конфликт с Polylang: Плагин ожидает JSON с юникод-экранированием, а сырая кириллица нарушает парсинг.
Как диагностировать неверную кодировку
Проверьте содержимое TV-поля через phpMyAdmin или SQL-запрос:
SELECT * FROM modx_site_tmplvar_contentvalues WHERE id = 123;Если вы видите русские буквы (например, «Гидропилинг») вместо \u0413\u0438\u0434\u0440\u043e\u043f\u0438\u043b\u0438\u043d\u0433 - значит, экранирование не работает. Корректный JSON должен содержать только ASCII-символы.
Пошаговое решение
1. Обновите MIGX до стабильной версии
Установите последнюю стабильную сборку MIGX (не бета). В версии 3.0.3-pl исправлены многие баги с кодировкой. После обновления пересохраните проблемные записи через менеджер.
2. Настройте кодировку соединения с БД
В файле core/config/config.inc.php добавьте или измените параметр:
$database_dsn = 'mysql:host=localhost;dbname=yourdb;charset=utf8';Убедитесь, что в modx_site_tmplvar_contentvalues используется utf8_general_ci или utf8mb4_general_ci.
3. Используйте сниппет для принудительного экранирования
Создайте простой сниппет, который обрабатывает JSON перед сохранением:
// Пример сниппета для экранирования кириллицы в MIGX
$data = json_decode($input, true);
$output = json_encode($data, JSON_UNESCAPED_UNICODE);
return $output;Вызовите его в хуке OnBeforeSave для нужного TV.
4. Проверьте права на запись
Иногда проблема связана с кешированием. Очистите системный кеш MODX (Система → Очистить кеш) и пересохраните ресурс.
Профилактика для новых проектов
- Используйте MIGX 3.0.5+ или переходите на альтернативы (pdoResources, ms2Gallery).
- Всегда задавайте
charset=utf8в DSN. - Для мультиязычных сайтов проверяйте JSON-вывод через
var_dump(json_decode($json, true)).
Если после всех действий кириллица всё ещё пишется в сыром виде - временно отключите Polylang, сохраните запись и включите снова. Это принудительно пересоздаёт JSON в корректном формате.