%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/main/lib/ui/viewer/transformation/ |
Current File : /home/bitrix/www/bitrix/modules/main/lib/ui/viewer/transformation/transformermanager.php |
<? namespace Bitrix\Main\UI\Viewer\Transformation; use Bitrix\Main\Engine\CurrentUser; use Bitrix\Main\Error; use Bitrix\Main\Event; use Bitrix\Main\EventResult; use Bitrix\Main\Loader; use Bitrix\Main\ModuleManager; use Bitrix\Main\Result; use Bitrix\Main\SystemException; use Bitrix\Transformer\Command; use Bitrix\Transformer\FileTransformer; final class TransformerManager { const PULL_TAG = 'mainTransform'; protected static $transformationList = []; public function __construct() { //optimize $this->buildTransformationList(); } public static function getPullTag($fileId) { return self::PULL_TAG . $fileId; } private function buildTransformationList() { if (!empty(static::$transformationList)) { return; } $default = [ Document::class, Video::class, ]; $event = new Event('main', 'onTransformationBuildList'); $event->send(); $additionalList = []; foreach ($event->getResults() as $result) { if ($result->getType() != EventResult::SUCCESS) { continue; } $result = $result->getParameters(); if (!is_array($result)) { throw new SystemException('Wrong event result. Must be array.'); } foreach ($result as $class) { if (!is_string($class) || !class_exists($class)) { throw new SystemException('Wrong event result. There is not a class.'); } if (!is_subclass_of($class, Transformation::class, true)) { throw new SystemException("Wrong event result. {$class} is not a subclass of " . Transformation::class); } $additionalList[] = $class; } } static::$transformationList = array_merge($default, $additionalList); } public function isAvailable() { return ModuleManager::isModuleInstalled('transformer'); } public function transform($fileId) { $result = new Result(); if (!Loader::includeModule('transformer')) { $result->addError(new Error('Could not include module transformer')); return $result; } $fileData = \CFile::getByID($fileId)->fetch(); if (!$fileData) { $result->addError(new Error('Could not find file')); return $result; } $transformation = $this->buildTransformationByFile($fileData); if (!$transformation) { $result->addError(new Error('There is no transformation for file')); return $result; } if( $transformation->getInputMaxSize() > 0 && $fileData['FILE_SIZE'] > $transformation->getInputMaxSize() ) { $result->addError(new Error('Too big file for transformation')); return $result; } $transformer = $transformation->buildTransformer(); if (!$transformer) { $result->addError(new Error('Could not build transformer')); return $result; } $shouldSendPullTag = true; $information = $this->getTransformationInformation($fileId); if (!$information) { $result = $transformer->transform( (int)$fileId, [$transformation->getOutputExtension()], 'main', CallbackHandler::class, ['id' => $fileId, 'fileId' => $fileId, 'queue' => 'disk_on_load'] ); if (!$result->isSuccess()) { $shouldSendPullTag = false; } } if (isset($information['status']) && $information['status'] == Command::STATUS_ERROR) { $shouldSendPullTag = false; $result->addError(new Error('Could not transform file', Command::STATUS_ERROR)); } if ($shouldSendPullTag) { $pullTag = $this->subscribeCurrentUserForTransformation($fileId); $result->setData([ 'pullTag' => $pullTag, ]); } return $result; } protected function getTransformationInformation($fileId) { return FileTransformer::getTransformationInfoByFile((int)$fileId); } public function subscribeCurrentUserForTransformation($fileId) { if (!Loader::includeModule('pull')) { return null; } $pullTag = self::getPullTag($fileId); \CPullWatch::add(CurrentUser::get()->getId(), $pullTag); return $pullTag; } /** * @param array $fileData * * @return null|Transformation * @throws \ReflectionException */ public function buildTransformationByFile(array $fileData) { foreach (static::$transformationList as $transformationClass) { /** @var Transformation $transformationClass */ if (in_array($fileData['CONTENT_TYPE'], $transformationClass::getInputContentTypes(), true)) { $reflectionClass = new \ReflectionClass($transformationClass); return $reflectionClass->newInstance(); } } return null; } }