IncludeModuleLangFile(__FILE__); class CFileInput { private static $bMultiple = false, $bUseUpload = false, $bUseMedialib = false, $bUseFileDialog = false, $bUseCloud = false, $bShowDescInput = false, $bShowDelInput = true, $curFileIds = array(), $curFiles = array(), $jsId, $bFileExists, $menuNew, $menuExist, $delInputName, $descInputName, $maxPreviewWidth, $maxPreviewHeight, $minPreviewWidth, $minPreviewHeight, $maxCount, $inputSize = 50, $arInputs = array(), $inputNameTemplate, $showInfo, $bViewMode ; private static function Init($showInfo, $inputName, $maxCount = false) { self::$bMultiple = false; self::$bUseUpload = false; self::$bUseMedialib = false; self::$bUseFileDialog = false; self::$bUseCloud = false; self::$bShowDelInput = false; self::$bShowDescInput = false; self::$bViewMode = false; self::$maxCount = $maxCount; self::$showInfo = $showInfo; self::$maxPreviewWidth = max((isset($showInfo['MAX_SIZE']['W']) ? $showInfo['MAX_SIZE']['W'] : 200), 40); self::$maxPreviewHeight = max((isset($showInfo['MAX_SIZE']['H']) ? $showInfo['MAX_SIZE']['H'] : 200), 40); self::$minPreviewWidth = min((isset($showInfo['MIN_SIZE']['W']) ? $showInfo['MIN_SIZE']['W'] : 120), 500); self::$minPreviewHeight = min((isset($showInfo['MIN_SIZE']['H']) ? $showInfo['MIN_SIZE']['H'] : 100), 500); self::$jsId = 'bx_file_'.mb_strtolower(preg_replace("/[^a-z0-9]/i", "_", $inputName)); } /** * @param $strInputName * @param string $strFileId * @param bool|array $showInfo * @param array $inputs * @return string */ public static function Show( $strInputName, $strFileId = "", $showInfo = false, $inputs = array() ) { global $USER; CJSCore::Init('file_input'); ob_start(); $uploadInput = $inputs['upload'] === true ? array() : $inputs['upload']; $medialibInput = $inputs['medialib'] === true ? array() : $inputs['medialib']; $fileDialogInput = $inputs['file_dialog'] === true ? array() : $inputs['file_dialog']; $cloudInput = $inputs['cloud'] === true ? array() : $inputs['cloud']; self::Init($showInfo, $strInputName); //1. Upload from PC if(is_array($uploadInput)) { self::$bUseUpload = true; if(!array_key_exists("NAME", $uploadInput)) $uploadInput["NAME"] = $strInputName; } //2. Select file from medialib if(COption::GetOptionString('fileman', "use_medialib", "Y") != "N" && is_array($medialibInput)) { self::$bUseMedialib = true; if(!array_key_exists("NAME", $medialibInput)) $medialibInput["NAME"] = $strInputName; } //3. Select file from file dialog if(is_array($fileDialogInput)) { self::$bUseFileDialog = true; if(!array_key_exists("NAME", $fileDialogInput)) $fileDialogInput["NAME"] = $strInputName; } //4. Select file from cloud if( is_array($cloudInput) && $USER->CanDoOperation("clouds_browse") && CModule::IncludeModule("clouds") && CCloudStorage::HasActiveBuckets() ) { self::$bUseCloud = true; if(!array_key_exists("NAME", $cloudInput)) $cloudInput["NAME"] = $strInputName; } if($inputs['description'] !== false) { self::$bShowDescInput = true; self::$descInputName = isset($inputs['description']["NAME"]) ? $inputs['description']["NAME"] : self::GetInputName($strInputName, "_descr"); } if($inputs['del'] !== false) { self::$bShowDelInput = true; self::$delInputName = isset($inputs['del']["NAME"]) ? $inputs['del']["NAME"] : self::GetInputName($strInputName, "_del"); } // $arFile - Array with current file or false if it's empty self::$curFileIds = is_array($strFileId) && !array_key_exists("tmp_name", $strFileId)? $strFileId : array($strFileId); self::$curFiles = array(); self::$bFileExists = false; foreach(self::$curFileIds as $fileId) { if (is_array($fileId)) continue; if (mb_strlen($fileId) <= 1 && intval($fileId) === 0) continue; self::$bFileExists = true; if($arFile = self::GetFile($fileId)) { $arFile['FILE_NOT_FOUND'] = false; if (self::$bShowDescInput && isset($inputs['description']['VALUE'])) $arFile['DESCRIPTION'] = $inputs['description']['VALUE']; } else { $arFile = array( 'FILE_NOT_FOUND' => true, 'DEL_NAME' => self::$delInputName ); } self::$curFiles[] = $arFile; } self::$bViewMode = self::IsViewMode(); if (self::$bViewMode) self::$bShowDelInput = false; if (!self::$bViewMode || self::$bFileExists) { $inputs = array( 'upload' => self::$bUseUpload, 'medialib' => self::$bUseMedialib, 'file_dialog' => self::$bUseFileDialog, 'cloud' => self::$bUseCloud, 'del' => self::$bShowDelInput, 'description' => self::$bShowDescInput ); self::$arInputs = array( 'upload' => $uploadInput, 'medialib' => $medialibInput, 'file_dialog' => $fileDialogInput, 'cloud' => $cloudInput ); self::DisplayControl($inputs); } $result = ob_get_contents(); ob_end_clean(); return $result; } /** * @param array $values * @param string $inputNameTemplate * @param bool|array $showInfo * @param bool $maxCount * @param array $inputs * @return string */ public static function ShowMultiple( $values = array(), $inputNameTemplate = "", // #IND# will be replaced by autoincrement int (0, 1, 2,..) $showInfo = false, $maxCount = false, $inputs = array() ) { CJSCore::Init('file_input'); ob_start(); global $USER; self::Init($showInfo, $inputNameTemplate, $maxCount); self::$bMultiple = true; $arDescInput = (is_array($inputs['description']) && isset($inputs['description']['VALUES']) && isset($inputs['description']['NAME_TEMPLATE'])) ? $inputs['description'] : false; $inputs = array( 'upload' => $inputs['upload'] === true, 'medialib' => $inputs['medialib'] === true && COption::GetOptionString('fileman', "use_medialib", "Y") != "N", 'file_dialog' => $inputs['file_dialog'] === true, 'cloud' => $inputs['cloud'] === true && $USER->CanDoOperation("clouds_browse") && CModule::IncludeModule("clouds") && CCloudStorage::HasActiveBuckets(), 'del' => $inputs['del'] !== false, 'description' => $inputs['description'] === true || $arDescInput ); self::$bUseUpload = $inputs['upload']; self::$bUseMedialib = $inputs['medialib']; self::$bUseFileDialog = $inputs['file_dialog']; self::$bUseCloud = $inputs['cloud']; self::$bShowDelInput = $inputs['del']; self::$bShowDescInput = $inputs['description']; self::$inputNameTemplate = $inputNameTemplate; self::$bViewMode = self::IsViewMode(); if (self::$bViewMode) self::$bShowDelInput = false; if (self::$bShowDelInput) self::$delInputName = self::GetInputName($inputNameTemplate, "_del"); if (self::$bShowDescInput) { self::$descInputName = ''; if ($arDescInput) self::$descInputName = $arDescInput['NAME_TEMPLATE']; if (empty(self::$descInputName)) self::$descInputName = self::GetInputName($inputNameTemplate, "_descr"); } // $arFile - Array with current file or false if it's empty self::$curFiles = array(); self::$bFileExists = false; if ($arDescInput) { reset($arDescInput['VALUES']); } foreach($values as $inputName => $fileId) { if (mb_strlen($fileId) <= 1 && intval($fileId) === 0) continue; self::$bFileExists = true; if($arFile = self::GetFile($fileId)) { $arFile['FILE_NOT_FOUND'] = false; $arFile['INPUT_NAME'] = $inputName; $arFile['DEL_NAME'] = self::GetInputName($inputName, '_del'); $arFile['DESC_NAME'] = self::GetInputName($inputName, '_descr'); if ($arDescInput) { $arFile['DESC_NAME'] = key($arDescInput['VALUES']); $arFile['DESCRIPTION'] = current($arDescInput['VALUES']); next($arDescInput['VALUES']); } } else { $arFile = array( 'FILE_NOT_FOUND' => true, 'INPUT_NAME' => $inputName, 'DEL_NAME' => self::GetInputName($inputName, '_del'), 'DESC_NAME' => self::GetInputName($inputName, '_descr') ); } self::$curFiles[] = $arFile; } self::DisplayControl($inputs); $result = ob_get_contents(); ob_end_clean(); return $result; } private static function GetFile($fileId = "") { $arFile = CFile::GetFileArray($fileId); $io = CBXVirtualIo::GetInstance(); //Check if not ID but file path was given if(!is_array($arFile) && $fileId != "") { $strFilePath = $_SERVER["DOCUMENT_ROOT"].$fileId; if($io->FileExists($strFilePath)) { $flTmp = $io->GetFile($strFilePath); $arFile = array( "PATH" => $fileId, "FILE_SIZE" => $flTmp->GetFileSize(), "DESCRIPTION" => "", ); $arImageSize = CFile::GetImageSize($strFilePath); if(is_array($arImageSize)) { $arFile["WIDTH"] = intval($arImageSize[0]); $arFile["HEIGHT"] = intval($arImageSize[1]); } } elseif(self::$showInfo['IMAGE'] == 'N') { $arFile = array( "PATH" => $fileId, "FORMATED_SIZE" => '', "DESCRIPTION" => "", "IS_IMAGE" => false ); return $arFile; } } $sImagePath = isset($arFile["PATH"]) ? $arFile["PATH"] : $arFile["SRC"]; if( $arFile["HANDLER_ID"] || (defined("BX_IMG_SERVER") && mb_substr($sImagePath, 0, mb_strlen(BX_IMG_SERVER)) === BX_IMG_SERVER) || $io->FileExists($_SERVER["DOCUMENT_ROOT"].$sImagePath) ) { $arFile["FORMATED_SIZE"] = CFile::FormatSize($arFile["FILE_SIZE"]); $arFile["IS_IMAGE"] = $arFile["WIDTH"] > 0 && $arFile["HEIGHT"] > 0 && self::$showInfo['IMAGE'] != 'N'; //Mantis:#65168 if ($arFile["CONTENT_TYPE"] && $arFile["IS_IMAGE"] && mb_strpos($arFile["CONTENT_TYPE"], 'application') !== false) { $arFile["IS_IMAGE"] = false; } unset($arFile["MODULE_ID"], $arFile["CONTENT_TYPE"], $arFile["SUBDIR"], $arFile["~src"]); return $arFile; } return false; } private static function DisplayControl($inputs = array()) { self::$menuNew = array(); self::$menuExist = array(); if ($inputs['upload']) { self::$menuNew[] = array("ID" => "upload", "GLOBAL_ICON" => "adm-menu-upload-pc", "TEXT" => GetMessage("ADM_FILE_UPLOAD"), "CLOSE_ON_CLICK" => false); self::$menuExist[] = array("ID" => "upload", "GLOBAL_ICON" => "adm-menu-upload-pc", "TEXT" => GetMessage("ADM_FILE_NEW_UPLOAD"), "CLOSE_ON_CLICK" => false); } if ($inputs['medialib']) { self::$menuNew[] = array("TEXT" => GetMessage("ADM_FILE_MEDIALIB"), "GLOBAL_ICON" => "adm-menu-upload-medialib", "ONCLICK" => "OpenMedialibDialog".self::$jsId."()"); self::$menuExist[] = array("TEXT" => GetMessage("ADM_FILE_NEW_MEDIALIB"), "GLOBAL_ICON" => "adm-menu-upload-medialib", "ONCLICK" => "OpenMedialibDialog".self::$jsId."()"); } if ($inputs['file_dialog']) { self::$menuNew[] = array("TEXT" => GetMessage("ADM_FILE_SITE"), "GLOBAL_ICON" => "adm-menu-upload-site", "ONCLICK" => "OpenFileDialog".self::$jsId."()"); self::$menuExist[] = array("TEXT" => GetMessage("ADM_FILE_NEW_SITE"), "GLOBAL_ICON" => "adm-menu-upload-site", "ONCLICK" => "OpenFileDialog".self::$jsId."()"); } if ($inputs['cloud']) { self::$menuNew[] = array("TEXT" => GetMessage("ADM_FILE_CLOUD"), "GLOBAL_ICON" => "adm-menu-upload-cloud", "ONCLICK" => "OpenCloudDialog".self::$jsId."()"); self::$menuExist[] = array("TEXT" => GetMessage("ADM_FILE_NEW_CLOUD"), "GLOBAL_ICON" => "adm-menu-upload-cloud", "ONCLICK" => "OpenCloudDialog".self::$jsId."()"); } $arConfig = array( 'id' => self::$jsId, 'fileExists' => self::$bFileExists, 'files' => self::$curFiles, 'menuNew' => self::$menuNew, 'menuExist' => self::$menuExist, 'multiple' => self::$bMultiple, 'useUpload' => self::$bUseUpload, 'useMedialib' => self::$bUseMedialib, 'useFileDialog' => self::$bUseFileDialog, 'useCloud' => self::$bUseCloud, 'delName' => self::$delInputName, 'descName' => self::$descInputName, 'inputSize' => self::$inputSize, 'minPreviewHeight' => self::$minPreviewHeight, 'minPreviewWidth' => self::$minPreviewWidth, 'showDesc' => self::$bShowDescInput, 'showDel' => self::$bShowDelInput, 'maxCount' => self::$maxCount, 'viewMode' => self::$bViewMode ); if (self::$bMultiple) $arConfig['inputNameTemplate'] = self::$inputNameTemplate; else $arConfig['inputs'] = self::$arInputs; if (self::$bUseCloud) $arConfig['cloudDialogPath'] = '/bitrix/admin/clouds_file_search.php?lang='.LANGUAGE_ID.'&n='; //Base container ?>