132  /  382
Справочник

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

Просмотров: 27216
Дата последнего изменения: 25.09.2023
Ольга Пичужкина
Сложность урока:
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);
    	} 


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

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