В блог

Новые Ajax-запросы в 1С-Битрикс

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

Компоненты

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

<?php

namespace Prominado\Components;

use Bitrix\Main\Context;

class Feedback extends \CBitrixComponent
{
    private $request;

    public function sendMessage($post)
    {
        // отправляем данные
    }

    public function executeComponent()
    {
        $this->request = Context::getCurrent()->getRequest();

        $this->sendMessage($this->request->getPostList()->toArray());

        $this->includeComponentTemplate();
    }
}

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

<?php

use Bitrix\Main\Context;

require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

\CBitrixComponent::includeComponentClass('prominado:feedback');

$post = Context::getCurrent()->getRequest()->getPostList()->toArray();

$component = new \Prominado\Components\Feedback();
$component->sendMessage($post);

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

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

<?php

namespace Prominado\Components;

use Bitrix\Main\Engine\Contract\Controllerable;

class Feedback extends \CBitrixComponent implements Controllerable
{
    // Обязательный метод
    public function configureActions()
    {
       // Сбрасываем фильтры по-умолчанию (ActionFilter\Authentication и ActionFilter\HttpMethod)
       // Предустановленные фильтры находятся в папке /bitrix/modules/main/lib/engine/actionfilter/
        return [
            'sendMessage' => [ // Ajax-метод
                'prefilters' => [],
            ],
        ];
    }

    // Ajax-методы должны быть с постфиксом Action
    public function sendMessageAction($post)
    {
        // отправляем данные
    }

    public function executeComponent()
    {
        $this->includeComponentTemplate();
    }
}

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

BX.ajax.runComponentAction('prominado:feedback',
    'sendMessage', { // Вызывается без постфикса Action
      mode: 'class',
      data: {post: {name: 'Иван', message: 'Тестовое сообщение'}}, // ключи объекта data соответствуют параметрам метода
    })
    .then(function(response) {
      if (response.status === 'success') {
        // Если форма успешно отправилась
      }
    });

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

public function configureActions()
{
    return [
        'sendMessage' => [
            'prefilters' => [
                new ActionFilter\Authentication,
                new ActionFilter\HttpMethod('PUT')
            ],
        ],
    ];
}

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

Модули

На данный момент поддерживаются только модули в названии которых нет точки. Обращение в техподдержку отправлено.

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

<?php

return [
    'controllers' => [
        'value' => [
            'namespaces' => [
                // Ключ - неймспейс для ajax-классов,
                // api - приставка экшенов, о ней мы поговорим чуть позже
                '\\Prominado\\Module\\Controller' => 'api',
            ],
        ],
        'readonly' => true,
    ],
];

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

<?php

namespace Prominado\Module\Controller;

use Bitrix\Main\Engine\Controller;

class Updater extends Controller
{
    public function applyAction()
    {
        $request = $this->getRequest();

        return ['response' => 'success'];
    }
}

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

// prominado.module - наименование модуля
// api - приставка из .settings.php
// apply - название метода без постфикса Action

BX.runAction('prominado.module.api.apply')
    .then(function() {
      // Код после выполнения экшена
    });
Таким образом, обращаться к методам модулей и компонентов с помощью ajax-запросов стало намного проще :)
Хочу проект
Закрыть