Bitrix Framework предоставляет несколько типов ответов из контроллеров, каждый из которых предназначен для определённого сценария: компонент, файл, JSON, HTML и др.
Аякс-загрузка компонента
Для асинхронной загрузки компонента достаточно вернуть
\Bitrix\Main\Engine\Response\Component из действия контроллера. Это аналог $APPLICATION->IncludeComponent(). class Item extends \Bitrix\Main\Engine\Controller { public function viewAction($fileId) { return new \Bitrix\Main\Engine\Response\Component('bitrix:disk.file.view', '', [ 'FILE_ID' => $fileId, ]); } }
На клиенте вызывается через BX.ajax.runAction()
. HTML компонента будет в response.data.html
.
BX.ajax.runAction('example.item.view', { data: { fileId: 2208 } }).then(response => { Runtime.html(someNode, response.data.html); });
Открытие компонента в слайдере
Если нужно отобразить компонент в слайдере (без iframe), используйте BX.SidePanel.Instance.open()
с contentCallback
.
BX.SidePanel.Instance.open("widget:file-props", { contentCallback: function(slider) { return new Promise(function(resolve) { BX.ajax.runAction('example.item.view', { data: { fileId: 2208 } }) .then(response => resolve({ html: response.data.html })); }); } });
Скачивание файла
Для скачивания файла используйте \Bitrix\Main\Engine\Response\BFile
.
return \Bitrix\Main\Engine\Response\BFile::createByFileId($fileId, 'Report.xlsx');
Ресайз изображения
Чтобы отдать уменьшенное изображение, примените \Bitrix\Main\Engine\Response\ResizedImage
.
return \Bitrix\Main\Engine\Response\ResizedImage::createByImageId($imageId, 32, 32, 'thumb.jpg');
Типовой JSON
Для типичного ответа с данными и статусом используйте AjaxJson
.
return \Bitrix\Main\Engine\Response\AjaxJson::createSuccess($message);
Произвольный JSON
Если нужен полностью произвольный JSON, используйте \Bitrix\Main\Engine\Response\Json
.
return new \Bitrix\Main\Engine\Response\Json(["pong" => true]);
HtmlContent с ресурсами
Тип ответа \Bitrix\Main\Engine\Response\Component
основан на \Bitrix\Main\Engine\Response\HtmlContent
, который можно использовать, если вам нужно отдавать произвольный контент с ресурсами, а не именно компонент.
При этом js-обертка BX.ajax.runAction
или BX.ajax.runComponentAction
загрузит сама все ресурсы.
Планируется, что на данном типе ответа будет основан тип ответа Page
.