- Допустим вы пишите код для битрикса, создаете компонент или модуль, и хотели бы через асинхронные вызовы менять сущности битрикса. Через классы D7 легко написать свой обработчик или бекенд, назвать его ajax.php и обращаться к нему. Но если нужно делать стандартные операции, которые есть в Bitrix REST, то незачем все писать с нуля. Можно использовать встроенный ajax.runAction https://dev.1c-bitrix.ru/api_help/js_lib/ajax/bx_ajax_runaction.php
Например, взять задачу из БД. Для этого нужно написать:
1 2 3 4 5 6 7 8 9 10 |
BX.ajax.runAction('tasks.task.get', { data: { taskId: 206, select: ['ID', 'RESPONSIBLE_ID', 'UF_SOME_USER_FIELD'] } }).then(function (response) { console.log(response) }) |
Который вернет ответ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "task": { "id": "206", "responsibleId": "1", "favorite": "N", "ufSomeUserField": "YES", "group": [], "responsible": { "id": "1", "name": "Алмат Жандаулетов", "link": "/company/personal/user/1/", "icon": "/bitrix/images/tasks/default_avatar.png", "workPosition": "" }, "action": { bla-bla } } } |
Или обновить саму Задачу, для примера обновлю пользовательское поле UF_SOME_USER_FIELD:
1 2 3 4 5 6 7 8 9 10 |
BX.ajax.runAction('tasks.task.update', { data: { taskId: 206, fields: {'UF_SOME_USER_FIELD': 'awesome'} } }).then(function (response) { console.log(response) }) |
Откуда брать параметры?
В этом поможет документация REST https://dev.1c-bitrix.ru/rest_help/tasks/task/tasks/tasks_task_get.php
Хоть в документации REST и используется другой класс JS BX24.callMethod его можно заменить на BX.ajax.runAction, то есть нам становятся доступны все операции над сущностями. Ура!🎉
Хотя странно, ведь документация REST говорит об обратном:
Для использования методов REST необходимо либо создать локальное приложение в рамках конкретного Битрикс24 или вебхук, либо разработать тиражное решение и добавить его в партнерский кабинет.
Если заглянуть под капот?
Этот же код можно вызвать другим способом
1 2 3 4 5 6 7 8 9 10 |
BX.ajax.runAction('bitrix:tasks.rest.controllers.task.get', { data: { taskId: 206, select: ['ID', 'RESPONSIBLE_ID', 'UF_SOME_USER_FIELD'] } }).then(function (response) { console.log(response) }) |
который вернет то самое
Откуда взялся bitrix:tasks.rest.controllers.task.get ?
Для этого нужно обратиться к документации Контроллеры
Контроллер — часть модуля, отвечаюший за REST or Ajax вызовы.
Посмотрим как они настроены в задачах
bitrix/modules/tasks/.settings.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
'controllers' => [ 'value' => [ 'namespaces' => [ '\\Bitrix\\Tasks\\Rest\\Controllers' => 'api', '\\Bitrix\\Tasks\\Scrum\\Controllers' => 'scrum', ], 'defaultNamespace' => '\\Bitrix\\Tasks\\Rest\\Controllers', 'restIntegration' => [ 'enabled'=>true ], ], 'readonly' => true, ], |
Namespace \\Bitrix\\Tasks\\Rest\\Controllers — как раз отвечает за первую часть пути bitrix:tasks.rest.controllers
Откуда взялся task.get?
В модуле есть класс bitrix/modules/tasks/lib/rest/controllers/task.php, который обрабатывает все запросы. Метод же называется \Bitrix\Tasks\Rest\Controllers\Task::getAction
get — название метода
Action — указывает что это роут, похожая система есть как в Laravel, так и в YII2
Откуда взялся taskId?
Пришлось долго подебажит, но в итоге оказалось, что с помощью цепочек, сложно запутанной, рефлексии, код анализирует параметры, которые поступают в метод. 99% этого кода вам не понадобиться, но если интересно, то посмотрите
\Bitrix\Main\Engine\AutoWire\Parameter::__construct вот эту строчку
1 2 3 4 5 |
$externalNameConstructor = function(\ReflectionParameter $parameter){ return $parameter->getName() . 'Id'; }; |
также в самом контроллере метод
1 2 3 |
getAutoWiredParameters |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public function getAutoWiredParameters() { return [ new Parameter( \CTaskItem::class, function ($className, $id) { if (($id = (int)$id) <= 0) { throw new SystemException('wrong task id'); } return new $className($id, CurrentUser::get()->getId()); } ), new Parameter( Template::class, function ($className, $id) { return new $className($id, CurrentUser::get()->getId()); } ), ]; } |