Просмотров: 27197
Дата последнего изменения: 25.09.2023
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
4
5
Недоступно в лицензиях:
Ограничений нет
Для удобной отладки ошибок в жизненном цикле AJAX включайте debug => true
в .settings.php
, тогда вы сможете увидеть трейс ошибок, исключений.
Если нужно:
- отдать файл, то воспользуйтесь классами \Bitrix\Main\Engine\Response\File и \Bitrix\Main\Engine\Response\BFile:
class Controller extends Engine\Controller
{
public function downloadAction($orderId)
{
//... find attached fileId by $orderId
return \Bitrix\Main\Engine\Response\BFile::createByFileId($fileId);
}
public function downloadGeneratedTemplateAction()
{
//... generate file ... $generatedPath
return new \Bitrix\Main\Engine\Response\File(
$generatedPath,
'Test.pdf',
\Bitrix\Main\Web\MimeType::getByFileExtension('pdf')
);
}
public function showImageAction($orderId)
{
//... find attached imageId by $orderId
return \Bitrix\Main\Engine\Response\BFile::createByFileId($imageId)
->showInline(true)
;
}
}
- отдать отресайзенное изображение, то используйте \Bitrix\Main\Engine\Response\ResizedImage.
Помните, что нельзя давать пользователю запрашивать произвольные размеры для ресайза. Всегда подписывайте параметры или явно указывайте в коде размеры.
class Controller extends Engine\Controller
{
public function showAvatarAction($userId)
{
//... find attached imageId by $userId
return \Bitrix\Main\Engine\Response\ResizedImage::createByImageId($imageId, 100, 100);
}
}
- сгенерировать ссылку в контроллере на действие из этого же контроллера, то используйте \Bitrix\Main\Engine\Controller::getActionUri
public function getAction(File $file)
{
return [
'file' => [
'id' => $file->getId(),
'name' => $file->getName(),
'links' => [
'rename' => $this->getActionUri('rename', array('fileId' => $file->getId())),
]
]
];
}
public function renameAction(File $file)
{
...
}
- сгенерировать ссылку в контроллере на действие, которое будет отдавать контент, например, скачивание файла, то используйте \Bitrix\Main\Engine\Response\DataType\ContentUri. Это нужно для интеграции с модулем REST.
public function getAction(File $file)
{
return [
'file' => [
'id' => $file->getId(),
'name' => $file->getName(),
'links' => [
'download' => new ContentUri($this->getActionUri('download', array('fileId' => $file->getId()))),
]
]
];
}
public function downloadAction(File $file)
{
...
}
- преобразовать данные
SNAKE_CASE
по стандарту в camelCase
, то можно воспользоваться вспомогательными методами контроллера \Bitrix\Main\Engine\Controller::convertKeysToCamelCase, либо явной настройкой \Bitrix\Main\Engine\Response\Converter:
public function getAction(File $file)
{
return [
'file' => $this->convertKeysToCamelCase($fileData)
];
}
public function showInformationAction(File $file)
{
$converter = new \Bitrix\Main\Engine\Response\Converter(Converter::OUTPUT_JSON_FORMAT & ~Converter::RECURSIVE);
return $converter->process($data);
}