Новые Ajax-запросы в 1С-Битрикс
В версии 17.5.10 главного модуля 1С-Битрикс появились нативные обработчики ajax-запросов у компонентов и модулей.
Компоненты
Рассмотрим простой компонент формы обратной связи:
<?php
namespace Prominado\Components;
use Bitrix\Main\Context;
class Feedback extends \CBitrixComponent
{
public function sendMessage($post)
{
// отправляем данные
}
public function executeComponent()
{
$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([
ActionFilter\HttpMethod::METHOD_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
// updater.apply – название класса и метода без постфикса Action
BX.ajax.runAction('prominado:module.api.updater.apply')
.then(function() {
// Код после выполнения экшена
});
Таким образом, обращаться к методам модулей и компонентов с помощью ajax-запросов стало намного проще :)