AJAX-запросы в 1С-Битрикс

1С-Битрикс
AJAX-запросы в 1С-Битрикс

В версии 17.5.10 Главного модуля 1С-Битрикс появились нативные обработчики ajax-запросов у компонентов и модулей.

Компоненты

Пример простого компонента формы обратной связи:

1<?php
2 
3namespace Ps\Components;
4 
5use Bitrix\Main\Context;
6 
7class Feedback extends \CBitrixComponent
8{
9 public function sendMessage($post)
10 {
11 // отправляем данные
12 }
13 
14 public function executeComponent()
15 {
16 $this->sendMessage($this->request->getPostList()->toArray());
17 
18 $this->includeComponentTemplate();
19 }
20}

Чтобы вызвать метод sendMessage в AJAX-запросе, раньше необходимо было создать файл /local/ajax/send-message.php с содержимым:

1<?php
2 
3use Bitrix\Main\Context;
4 
5require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
6 
7\CBitrixComponent::includeComponentClass('ps:feedback');
8 
9$post = Context::getCurrent()->getRequest()->getPostList()->toArray();
10 
11$component = new \Ps\Components\Feedback();
12$component->sendMessage($post);

И так для каждого запроса.

В обновлении, 1С-Битрикс добавили возможность обращаться к методам непосредственно из javascript. Для этого обновите класс компонента:

1<?php
2 
3namespace Ps\Components;
4 
5use Bitrix\Main\Engine\Contract\Controllerable;
6 
7class Feedback extends \CBitrixComponent implements Controllerable
8{
9 // Обязательный метод
10 public function configureActions()
11 {
12 // Сброс фильтров по умолчанию (ActionFilter\Authentication и ActionFilter\HttpMethod)
13 // Предустановленные фильтры находятся в папке /bitrix/modules/main/lib/engine/actionfilter/
14 return [
15 'sendMessage' => [ // Ajax-метод
16 'prefilters' => [],
17 ],
18 ];
19 }
20 
21 // Ajax-методы должны быть с постфиксом Action
22 public function sendMessageAction($post)
23 {
24 // отправка данных
25 }
26 
27 public function executeComponent()
28 {
29 $this->includeComponentTemplate();
30 }
31}

Теперь необходимо вызвать метод:

1<script>
2BX.ajax.runComponentAction('ps:feedback',
3 'sendMessage', { // Вызывается без постфикса Action
4 mode: 'class',
5 data: {post: {name: 'Иван', message: 'Тестовое сообщение'}}, // ключи объекта data соответствуют параметрам метода
6 })
7 .then(function(response) {
8 if (response.status === 'success') {
9 // В случае успешного выполнения
10 }
11 });
12</script>

В configureActions можно задать предпроверку данных, например, чтобы метод был доступен только для авторизованных пользователей или только PUT-запросом:

1public function configureActions()
2{
3 return [
4 'sendMessage' => [
5 'prefilters' => [
6 new ActionFilter\Authentication,
7 new ActionFilter\HttpMethod([
8 ActionFilter\HttpMethod::METHOD_PUT
9 ])
10 ],
11 ],
12 ];
13}

Ответ на запрос всегда будет приходить в стандартизированном json-формате.

Модули

Замечание

Данный функционал для партнёрских модулей, содержащих в названии точку (ps.module) доступен с версии 18.1.1 Главного модуля.

В модулях также дали возможность для AJAX-запросов к методам. В корне модуля создайте файл .settings.php со следующим содержимым:

1<?php
2 
3return [
4 'controllers' => [
5 'value' => [
6 'namespaces' => [
7 // Ключ - неймспейс для ajax-классов,
8 // api - приставка экшенов, о ней мы поговорим чуть позже
9 '\\Ps\\Module\\Controller' => 'api',
10 ],
11 ],
12 'readonly' => true,
13 ],
14];

В папке /lib/ добавьте папку controller и в ней разместите классы:

1<?php
2 
3namespace Ps\Module\Controller;
4 
5use Bitrix\Main\Engine\Controller;
6 
7class Updater extends Controller
8{
9 public function applyAction()
10 {
11 $request = $this->getRequest();
12 
13 return ['response' => 'success'];
14 }
15}

Чтобы обратиться к методу applyAction, вызовите функцию:

1// ps – префикс партнёра, отделяется двоеточием
2// module – название модуля
3// api – приставка из .settings.php
4// updater.apply – название класса и метода без постфикса Action
5 
6BX.ajax.runAction('ps:module.api.updater.apply')
7 .then(function() {
8 // Код после выполнения экшена
9 });

Таким образом, обращаться к методам модулей и компонентов с помощью AJAX-запросов стало намного проще.