131  /  389
Справочник

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

Просмотров: 1927
Дата последнего изменения: 14.05.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);
       }


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

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