Давненько я не писал заметки в блог, а заметки про новые возможности компонентов связанных с расширеним на ajax-методы не писал разве что ленивый. В этот раз мне хотелось бы рассказать о том, что разработчики особо не раскрывают в документации: можно вернуть несколько ошибок в ответе.
В ajax-методах традиционно существует два варианта ответа: успешный (success) и провальный (failed) и все традиционные запоросы оборачиваются в эти типовые структуры ответов (на самом деле не все, но об этом в другой раз). И если с простым ответом все ясно - мы можем вернуть что угодно и это будет передано на клиентскую сторону, то с ошибками все гораздо интереснее.
Каким образом можно вернуть структуру с ошибкой? Правильно! Бросить исключение. Но, постойте, в типовой структуре значится ключ errors и в ней всегда есть ошибка под ключем 0, а это значит что можно вернуть несколько ошибок? Можно!
Давайте разберемся как это сделать. Для того чтобы показать я буду использовать:
- Установленный Битрикс.
В примере я буду использовать версию 20.0.450, но она у вас может быть и старше. Мы проверяли работу механизма на 19 версии, хотя он в целом и с 18.5 должен работать.
- Тестовый компонент example:blank описанный через класс компонента (class.php)
Напомню: не обязательно его вообще где-нибудь размещать, достаточно чтобы он просто существовал.
Стандартный себе класс с стандартным вызовом и его результатом
Лирическое отступление: на самом деле, для большинства задач возвращение одной ошибки будет более чем достаточно, но бывают случаи (например валидация формы), когда хотелось бы отделить одно от другого.
Для подобной реализации в пространстве имен битрикса \Bitrix\Main существует интерфейс Errorable и объект ошибки Error.
Небольшое отступление: ошибка не наследник Exception, но имеет ряд схожих смысловых параметров:
- $message (сообщение, текстовое)
- $code = 0 (код, числовое)
- $customData = null (любая дополнительная информация, массивы, обьекты и т.п.)
Получается, что для реализации поставленной задачи нем нужно
- указать, что наш класс реализует интерфейс Errorable
- реализовать методы getErrors и getErrorByCode в классе компонента
В принципе этого достаточно, но использование в чистом виде достаточно трудоемко. Поэтому нам на помощь идет ErrorCollection - итерируемый массиво-подобный словарь ошибок.
Не забываем, что перед использованием объект ErrorCollection необходимо будет инициализировать. Чтобы в каждом методе не проводить соответствующие операции и переопределять его, мы сделаем это в конструкторе компонента, переопределив его в нашем классе-наследнике.
Нам осталось только создать наш ajax-метод и проверить его работу.
В своих примерах я использовал негативный prefilter и отключил проверку на авторизацию. Я рекомендую вам изучить работу данной части системы перед тем как копировать ее "как есть".
Надеюсь эта заметка была для вас информативна и полезна, а если вы хотите побольше узнать о каких-либо внутренностях битрикс24 пишите об этом в комментариях!