Найти тему
Битрикс24 изнутри

Возвращаем несколько ошибок в ajax-компонентах

Давненько я не писал заметки в блог, а заметки про новые возможности компонентов связанных с расширеним на ajax-методы не писал разве что ленивый. В этот раз мне хотелось бы рассказать о том, что разработчики особо не раскрывают в документации: можно вернуть несколько ошибок в ответе.

В ajax-методах традиционно существует два варианта ответа: успешный (success) и провальный (failed) и все традиционные запоросы оборачиваются в эти типовые структуры ответов (на самом деле не все, но об этом в другой раз). И если с простым ответом все ясно - мы можем вернуть что угодно и это будет передано на клиентскую сторону, то с ошибками все гораздо интереснее.

Каким образом можно вернуть структуру с ошибкой? Правильно! Бросить исключение. Но, постойте, в типовой структуре значится ключ errors и в ней всегда есть ошибка под ключем 0, а это значит что можно вернуть несколько ошибок? Можно!

Давайте разберемся как это сделать. Для того чтобы показать я буду использовать:

  • Установленный Битрикс.

В примере я буду использовать версию 20.0.450, но она у вас может быть и старше. Мы проверяли работу механизма на 19 версии, хотя он в целом и с 18.5 должен работать.

  • Тестовый компонент example:blank описанный через класс компонента (class.php)
Пример метода возвращающего одну ошибку
Пример метода возвращающего одну ошибку

Напомню: не обязательно его вообще где-нибудь размещать, достаточно чтобы он просто существовал.

Стандартный себе класс с стандартным вызовом и его результатом

Результат выполнение ajax-метода с одной ошибкой
Результат выполнение ajax-метода с одной ошибкой

Лирическое отступление: на самом деле, для большинства задач возвращение одной ошибки будет более чем достаточно, но бывают случаи (например валидация формы), когда хотелось бы отделить одно от другого.

Для подобной реализации в пространстве имен битрикса \Bitrix\Main существует интерфейс Errorable и объект ошибки Error.

Небольшое отступление: ошибка не наследник Exception, но имеет ряд схожих смысловых параметров:

  • $message (сообщение, текстовое)
  • $code = 0 (код, числовое)
  • $customData = null (любая дополнительная информация, массивы, обьекты и т.п.)

Получается, что для реализации поставленной задачи нем нужно

  1. указать, что наш класс реализует интерфейс Errorable
  2. реализовать методы getErrors и getErrorByCode в классе компонента

В принципе этого достаточно, но использование в чистом виде достаточно трудоемко. Поэтому нам на помощь идет ErrorCollection - итерируемый массиво-подобный словарь ошибок.

Не забываем, что перед использованием объект ErrorCollection необходимо будет инициализировать. Чтобы в каждом методе не проводить соответствующие операции и переопределять его, мы сделаем это в конструкторе компонента, переопределив его в нашем классе-наследнике.

Реализовали интерфейс Errorable в классе компонента
Реализовали интерфейс Errorable в классе компонента

Нам осталось только создать наш ajax-метод и проверить его работу.

Добавляем метод, возвращающий errorCount-ошибок
Добавляем метод, возвращающий errorCount-ошибок
Результат выполнения метода для 5 ошибок
Результат выполнения метода для 5 ошибок

В своих примерах я использовал негативный prefilter и отключил проверку на авторизацию. Я рекомендую вам изучить работу данной части системы перед тем как копировать ее "как есть".

Надеюсь эта заметка была для вас информативна и полезна, а если вы хотите побольше узнать о каких-либо внутренностях битрикс24 пишите об этом в комментариях!