Как вывести ошибку с HTML-разметкой при обновлении сделки в Битрикс24
При работе со сделками в Битрикс24 иногда возникает необходимость прервать операцию обновления и показать пользователю кастомное сообщение об ошибке. Стандартный механизм валидации позволяет выводить простой текст, но что делать, если в сообщении требуется разместить ссылку или другую HTML-разметку?
Стандартный подход и его ограничения
Обычно для проверки условий при обновлении элемента используется обработчик события, подключенный в init.php. Например, чтобы запретить изменение сделок с ID больше 100, можно использовать следующий код:
public static function handleElementChange(&$arFields): bool
{
if ($arFields['ID'] > 100) {
global $APPLICATION;
$APPLICATION->ThrowException('Текст ошибки!');
return false;
}
return true;
}Основное ограничение этого метода - невозможность вывода форматированного сообщения. Метод ThrowException принимает только строку, которая будет отображена как обычный текст. HTML-теги экранируются и не интерпретируются.
Решение: вывод ошибки с HTML-вёрсткой
Чтобы обойти это ограничение и вывести сообщение со ссылкой или другим форматированием, можно использовать следующий алгоритм:
- Отключить стандартное отображение ошибки. Не вызывайте
$APPLICATION->ThrowException()для основного сообщения. - Записать HTML-сообщение в отдельное поле результата. Используйте поле
RESULT_MESSAGEмассива$arFields, чтобы передать готовую HTML-разметку. - Инициировать ошибку пустым исключением. Вызовите
ThrowException()с пустой строкой, чтобы триггернуть статус ошибки, но не перезаписать ваше форматированное сообщение.
Пример реализации
Вот как будет выглядеть модифицированный обработчик для вывода ошибки с кликабельной ссылкой:
public static function handleElementChange(&$arFields): bool
{
if ($arFields['ID'] > 100) {
global $APPLICATION;
// Формируем HTML-сообщение со ссылкой
$errorHtml = 'Операция запрещена. <a href="/custom/page.php" target="_blank">Перейти к инструкции</a>';
// Передаём HTML в поле RESULT_MESSAGE
$arFields['RESULT_MESSAGE'] = $errorHtml;
// Инициируем ошибку (пустое сообщение не перезапишет RESULT_MESSAGE)
$APPLICATION->ThrowException('');
return false;
}
return true;
}Ключевые моменты
- Поле
RESULT_MESSAGEимеет приоритет при отображении. Если оно заполнено, система покажет его содержимое вместо строки изThrowException. - Вызов
ThrowException('')обязателен для перевода операции в состояние «ошибка». - Убедитесь, что ваша HTML-разметка безопасна и корректно экранирована, чтобы избежать уязвимостей.
Данный подход позволяет гибко кастомизировать сообщения об ошибках, делая их более информативными и удобными для пользователя.