Веб

Подгрузить компонент Bitrix через AJAX без файла

Узнайте, как напрямую подгрузить шаблон компонента Bitrix через AJAX, используя BX.ajax.runComponentAction, без PHP‑файла, и какие шаги нужны для реализации.

Как можно подгрузить обычный компонент Bitrix напрямую через AJAX, без промежуточного файла?
Я хочу вывести шаблон компонента test:test через AJAX, но сейчас делаю это через /ajax/test.php, который подключает компонент. Можно ли отправить запрос к компоненту без промежуточного PHP‑файла?

Текущий подход

javascript
$.ajax({
    url: '/ajax/test.php',
    type: 'post',
    data: {},
}).done(function(data) {
    // обработка
});

Файл /ajax/test.php:

php
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$APPLICATION->IncludeComponent("test:test", "", [], false, []);
?>

Как обойти необходимость промежуточного файла и напрямую подгрузить компонент через AJAX?

Кратко

Никак не получится «потянуть» шаблон обычного компонента прямо из /bitrix/services/main/ajax.php без собственного PHP‑обработчика, в реальности.
Но в Bitrix есть готовый механизм – BX.ajax.runComponentAction.
Он отправляет запрос сразу к классу компонента, а не к отдельному скрипту, и это удобно.
Для этого в компоненте нужно добавить “action”‑метод (например actionRenderAction()), который вернёт HTML‑шаблон, и вызывать его из JavaScript, а как это выглядит?


1. Что делает BX.ajax.runComponentAction

js
BX.ajax.runComponentAction(
    componentName,   // например, 'test:test'
    actionName,      // имя метода без суффикса Action
    {                // настройки запроса
        mode: 'class', // вызываем метод из class.php
        data: {},      // параметры, которые передаём в метод
    }
).then(function(response){
    // response содержит то, что вернул метод
});

Запрос автоматически идёт по адресу
/bitrix/services/main/ajax.php и не требует промежуточного файла.


2. Как подготовить компонент

2.1. Добавьте в class.php (путь components/test/test/class.php)

php
class CTestTestComponent extends CBitrixComponent
{
    // обычный вывод компонента
    public function executeComponent()
    {
        // обычная логика
        $this->IncludeComponentTemplate();
    }

    // AJAX‑доступный метод
    public function actionRenderAction()
    {
        // Получаем HTML шаблона
        $html = $this->IncludeComponentTemplate();
        // Или, если template не должен включать layout:
        // $template = $this->GetComponentTemplate();
        // $html = $template->GetContent();

        // Возвращаем JSON‑ответ
        $this->SetResult(['html' => $html]);
    }
}

Важно
Методы, которые будут вызываться через AJAX, должны иметь суффикс Action и быть объявлены как public.
Внутри метода можно использовать любую логику компонента, читать параметры из $this->arParams и т.д.


3. Как послать запрос

js
BX.ajax.runComponentAction(
    'test:test',
    'render',
    {
        mode: 'class', // вызов метода из class.php
        data: { /* параметры, если нужны */ }
    }
).then(function(response) {
    // response.html содержит HTML‑шаблон
    document.getElementById('container').innerHTML = response.html;
}).catch(function(error) {
    console.error('Ошибка AJAX‑компонента:', error);
});

Если ваш компонент использует шаблон, который требует данных из arResult, поместите их в $this->arResult в actionRenderAction() перед вызовом IncludeComponentTemplate().


4. Что можно сделать, если менять компонент нельзя

Если вы не можете вносить изменения в сам компонент, то единственный вариант – оставить промежуточный файл /ajax/test.php, как вы делали.
Bitrix не предоставляет «публичный» эндпоинт, который бы напрямую отдавал шаблон компонента без кода.


5. Краткое резюме

Способ Плюсы Минусы
Промежуточный /ajax/test.php Простое решение, работает сразу Требует дополнительного файла, лишний запрос к серверу
BX.ajax.runComponentAction + actionRenderAction Одна точка входа, чистый код, гибко Нужно изменить компонент (добавить метод), может быть не так удобно для шаблонов, которые не возвращают HTML напрямую
Публичный /bitrix/services/main/ajax.php Никакого промежуточного файла Не поддерживает «вывод шаблона» без собственного метода, поэтому не работает без изменений в компоненте

Итог:
Для прямой загрузки шаблона компонента через AJAX без отдельного файла необходимо добавить в компонент actionRenderAction() (или любое другое действие) и вызывать его через BX.ajax.runComponentAction. Если изменить компонент нельзя, остаётся использовать промежуточный файл.

Авторы
Проверено модерацией
Модерация