В версии 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-методы должны быть с постфиксом Action22 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.php4// updater.apply – название класса и метода без постфикса Action5 6BX.ajax.runAction('ps:module.api.updater.apply')7 .then(function() {8 // Код после выполнения экшена9 });
Таким образом, обращаться к методам модулей и компонентов с помощью AJAX-запросов стало намного проще.