133  /  385

Практика. Советы

Просмотров: 252
Дата последнего изменения: 26.02.2021
Ольга Пичужкина
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
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);
          }
    
    


0
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии