Почему 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 в корректном формате.

    Часто задаваемые вопросы