Документация для разработчиков
Темная тема

BX.ajax.runComponentAction

BX.ajax.runComponentAction(component, action[, config])

BX.ajax.runComponentAction - это метод для запуска аякс-действий в компоненте, который возвращает BX.Promise. Если был просрочен csrf-токен, то он сам попробует его восстановить (выполняется только одна попытка) и повторить запрос. Если от сервера пришёл ответ, в котором status не равен success, то promis'y выполняется reject.

Параметры

Параметр Описание С версии
component {string} Полное имя компонента, куда шлём запрос. Например, bitrix:main.post.form или vendor:example.
action {string} Действие, которое необходимо запустить. Например, greet.
config {Object} Параметры:
  • mode {string} Допустимое значение либо class, либо ajax:
    class - запуск действия внутри class.php,
    ajax - запуск действия внутри ajax.php
  • data {Object|FormData} Объект с данными, которые будут посланы в теле запроса. Как в BX.ajax.
  • json {Object} - объект с данными, которые будут переданы в теле запроса. При этом при отправке будет проставлен contentType: application/json, а контроллеры смогут получить доступ к оригинальному JSON'y, что позволит удобнее работать с числами и пустыми значениями.
  • navigation {Object} - объект постраничной навигации.
    • page {number} - номер страницы. Отсчет начинается с 1.
  • signedParameters {string} Необязательный. Это строка с подписанными параметрами. Генерируется методом getSignedParameters()
  • analyticsLabel {string|Object} Необязательный параметр используется, как пометка хитов для аналитики.
  • method {string} Необязательный. По умолчанию, POST.

Если ответ не будет содержать ключи data и status, запрос будет обрабатываться с ошибкой Network Error.

Пример

Представим, мы делаем аякс-запрос на компонент vendor:example из примера. И вызываем там действие greet.

BX.ajax.runComponentAction('vendor:example', 'greet', {
	mode: 'class', //это означает, что мы хотим вызывать действие из class.php
	data: {
		person: 'Hero!' //данные будут автоматически замаплены на параметры метода 
	},
	analyticsLabel: {
		viewMode: 'grid',
		filterState: 'closed'	
	}	
}).then(function (response) {
	console.log(response);
	/**
	{
		"status": "success", 
		"data": "Hi Hero!", 
		"errors": []
	}
	**/			
}, function (response) {
	//сюда будут приходить все ответы, у которых status !== 'success'
	console.log(response);
	/**
	{
		"status": "error", 
		"errors": [...]
	}
	**/				
});

Дополнительно


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Леонид Бычков
Сообщение не промодерировано, возможны ошибки и неточности.
Оказывается, что есть не только объект data и json, но и getParameters
Он нужен, когда в конфиге установлен метод GET (а в описании не указано, что есть еще поле method и объекта config)

Ищите в файле
Код
\bitrix\modules\main\install\js\main\core\core.js

В итоге GET запрос на Action компонента в class.php выглядит следующим образом:
Код
function onSuccess(response) {
    // ...
}
function onError(response) {
    // ...
}

BX.ajax.runComponentAction(
    "namespace:component_name",
    "getAgents",
    {
        mode: "class",
        method: "GET",
        getParameters: {
            departmentId: 15,
            agentsIblockId: 3
        },
    }
).then(onSuccess, onError);
URL запроса при таком вызове получается следующим:
Код
/bitrix/services/main/ajax.php?departmentId=15&agentsIblockId=3&mode=class&c=namespace%3Acomponent_name&action=getAgents
Action в файле class.php компонента выглядит так:
Код
public function getAgentsAction(int $departmentId, int $agentsIblockId):array
{
    // проверки параметров ...

    $arAgents = [];
    $res = \CIBlockElement::GetList(
       array(),
       array(
          "IBLOCK_ID" => $agentsIblockId,
          "ACTIVE" => "Y",
          "PROPERTY_DEPARTMENT" => $departmentId
       ),
       false,
       false,
       array(
          "ID", "IBLOCK_ID", "NAME"
          
       )
    );
    while ($agent = $res->GetNext()) {
       $arAgents[] = $agent;
    }
    
    return $arAgents;
}
Если указывать ключи
Код
departmentId: 15,
agentsIblockId: 3
в поле data объекта config, то в ответ придет ошибка с текстом (текст приведен для случая, когда метод принимал всего один аргумент)
Код
'Could not find value for parameter {departmentId}', code: 100, customData: null
 
0
Андрей Чурсин
Сообщение не промодерировано, возможны ошибки и неточности.
0
Андрей Чурсин
Сообщение не промодерировано, возможны ошибки и неточности.
0
Андрей Чурсин
Сообщение не промодерировано, возможны ошибки и неточности.
Вот напрашивается пояснение за analyticsLabel... что, как, зачем?
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх