Как исправить ошибку проверки email в MIGX при сохранении ресурса
Разработчики MODx нередко сталкиваются с багом MIGX: если в поле с типом email допущена опечатка и нажата кнопка «Сохранить», ресурс блокируется даже после исправления или удаления строки. Единственный выход - отменить редактирование с потерей данных. Разберём, почему это происходит и как решить проблему.
Причина блокировки сохранения в MIGX
Баг воспроизводится на MODx Revolution 2.8.3-pl / MIGX 2.13.0-pl и MODx 3.0.4-pl / MIGX 3.0.2-beta1. Когда пользователь вводит некорректный email, MIGX запоминает статус валидации на уровне сессии. Даже после исправления данных в гриде, внутренний флаг ошибки не сбрасывается, и система продолжает блокировать сохранение ресурса.
Эффективные способы исправить проверку ввода
1. Замена типа поля на text (простой вариант)
Самый быстрый способ - убрать inputTVtype: email и использовать обычный текст:
{
&qout;caption&qout;: &qout;Филиалы&qout;,
&qout;fields&qout;: [{
&qout;field&qout;: &qout;email&qout;,
&qout;caption&qout;: &qout;email&qout;,
&qout;inputTVtype&qout;: &qout;text&qout;
}]
}Недостаток: теряется клиентская проверка email. Рекомендуется добавлять серверную валидацию в сниппетах или плагинах.
2. Использование inputTV с кастомной TV (продвинутый вариант)
Если вы пробовали inputTV: test_email (где test_email - TV типа email), но баг сохранялся, попробуйте создать TV с типом text и применить её в MIGX. Затем добавьте собственный JavaScript-валидатор на событие beforeSubmit формы ресурса:
MODx.onBeforeSubmitForm = function() {
var emails = document.querySelectorAll(&qout;.migx-grid input[data-index=&qout;email&qout;]&qout;);
for (var i = 0; i < emails.length; i++) {
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emails[i].value)) {
alert(&qout;Некорректный email в строке &qout; + (i+1));
return false;
}
}
return true;
};Этот код проверяет email перед отправкой формы и предотвращает ложные блокировки.
3. Очистка статуса валидации через плагин (для разработчиков)
Напишите плагин на событие OnBeforeDocFormSave, который принудительно сбрасывает флаг ошибки MIGX:
if ($modx->getOption(&qout;migx.error&qout;)) {
$modx->setOption(&qout;migx.error&qout;, false);
}Этот метод требует доступа к ядру MODx и тестирования на версиях 2.x и 3.x.
Выводы и рекомендации
Баг MIGX с email-полями - известная проблема, не исправленная в актуальных версиях. Для быстрого решения используйте замену типа поля на text с серверной валидацией. Если важна клиентская проверка, добавьте собственный скрипт или плагин. Избегайте использования inputTVtype: email в конфигурации MIGX, чтобы не терять данные при случайной опечатке.