Новые 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-запросов стало намного проще :)