Your IP : 3.144.200.28


Current Path : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/integration/
Upload File :
Current File : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/integration/storagemanager.php

<?php
namespace Bitrix\Crm\Integration;
use Bitrix\Main;

class StorageManager
{
	public static function getDefaultTypeID()
	{
		return StorageType::getDefaultTypeID();
	}
	/**
	 * @param array $fileData
	 * @param int $storageTypeID
	 * @param string $siteID
	 * @return array|null
	 */
	public static function getFileInfo($fileID, $storageTypeID = 0, $checkPermissions = true, $options = null)
	{
		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		if(!StorageType::isDefined($storageTypeID))
		{
			$storageTypeID = StorageType::getDefaultTypeID();
		}

		if($storageTypeID === StorageType::Disk)
		{
			return DiskManager::getFileInfo($fileID, $checkPermissions, $options);
		}
		elseif($storageTypeID === StorageType::WebDav)
		{
			return \CCrmWebDavHelper::getElementInfo($fileID, $checkPermissions);
		}
		elseif($storageTypeID === StorageType::File)
		{
			$fileInfo = \CFile::GetFileArray($fileID);
			if(!is_array($fileInfo))
			{
				return null;
			}

			return array(
				'ID' => $fileID,
				'NAME' => isset($fileInfo['ORIGINAL_NAME']) ? $fileInfo['ORIGINAL_NAME'] : $fileID,
				'SIZE' => \CFile::FormatSize($fileInfo['FILE_SIZE'] ? $fileInfo['FILE_SIZE'] : 0),
				'VIEW_URL' => isset($fileInfo['SRC']) ? $fileInfo['SRC'] : ''
			);
		}

		throw new Main\NotSupportedException("Storage type: '{$storageTypeID}' is not supported in current context");
	}
	/**
	 * @param array $fileData
	 * @param string $siteID
	 * @return int|false
	 */
	public static function saveEmailAttachment(array $fileData, $storageTypeID = 0, $siteID = '', $params = array())
	{
		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		if(!StorageType::isDefined($storageTypeID))
		{
			$storageTypeID = StorageType::getDefaultTypeID();
		}

		if($storageTypeID === StorageType::Disk)
		{
			$params['USE_MONTH_FOLDERS'] = true;
			return DiskManager::saveEmailAttachment($fileData, $siteID, $params);
		}
		elseif($storageTypeID === StorageType::WebDav)
		{
			return \CCrmWebDavHelper::saveEmailAttachment($fileData, $siteID, $params);
		}

		throw new Main\NotSupportedException("Storage type: '{$storageTypeID}' is not supported in current context");
	}
	/**
	 * @param array $fileData
	 * @param string $siteID
	 * @param array $params
	 * @return int|false
	 */
	public static function saveFile(array $fileData, $storageTypeID = 0, $siteID = '', $params = array())
	{
		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		if(!StorageType::isDefined($storageTypeID))
		{
			$storageTypeID = StorageType::getDefaultTypeID();
		}

		if($storageTypeID === StorageType::Disk)
		{
			return DiskManager::saveFile($fileData, $siteID, $params);
		}
		elseif($storageTypeID === StorageType::WebDav)
		{
			return \CCrmWebDavHelper::saveFile($fileData, $siteID, $params);
		}

		throw new Main\NotSupportedException("Storage type: '{$storageTypeID}' is not supported in current context");
	}

	public static function deleteFile($fileID, $storageTypeID = 0)
	{
		if($storageTypeID === StorageType::File)
		{
			\CFile::Delete($fileID);
		}
		elseif($storageTypeID === StorageType::Disk)
		{
			Main\Loader::includeModule('disk');

			$codeMap = array(
				StorageFileType::getFolderXmlID(StorageFileType::EmailAttachment) => true,
				StorageFileType::getFolderXmlID(StorageFileType::CallRecord) => true,
				StorageFileType::getFolderXmlID(StorageFileType::Rest) => true
			);

			$file = \Bitrix\Disk\File::loadById($fileID);
			if($file !== null)
			{
				$folder = $file->getParent();
				if($folder !== null)
				{
					if((isset($codeMap[$folder->getXmlId()]) || $folder->getCode() === \Bitrix\Disk\SpecificFolder::CODE_FOR_UPLOADED_FILES)
						&& $file->countAttachedObjects() == 0
					)
					{
						$file->delete(\Bitrix\Disk\SystemUser::SYSTEM_USER_ID);
					}
				}
			}
		}
	}

	/**
	 * @param int|array $fileID
	 * @param int $storageTypeID
	 * @return array|null
	 */
	public static function makeFileArray($fileID, $storageTypeID)
	{
		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		if($storageTypeID === StorageType::Disk)
		{
			if(!is_array($fileID))
			{
				return DiskManager::makeFileArray($fileID);
			}

			$result = array();
			foreach($fileID as $ID)
			{
				$ary = DiskManager::makeFileArray($ID);
				if(is_array($ary))
				{
					$result[] = $ary;
				}
			}
			return $result;
		}
		elseif($storageTypeID === StorageType::WebDav)
		{
			if(!is_array($fileID))
			{
				return \CCrmWebDavHelper::makeElementFileArray($fileID);
			}

			$result = array();
			foreach($fileID as $ID)
			{
				$ary = \CCrmWebDavHelper::makeElementFileArray($ID);
				if(is_array($ary))
				{
					$result[] = $ary;
				}
			}
			return $result;
		}
		elseif($storageTypeID === StorageType::File)
		{
			if(!is_array($fileID))
			{
				return \CFile::makeFileArray($fileID);
			}

			$result = array();
			foreach($fileID as $ID)
			{
				$ary = \CFile::makeFileArray($ID);
				if(is_array($ary))
				{
					$result[] = $ary;
				}
			}
			return $result;
		}

		throw new Main\NotSupportedException("Storage type: '{$storageTypeID}' is not supported in current context");
	}
	/**
	 * @param int $fileID
	 * @param int $storageTypeID
	 * @return string
	 */
	public static function getFileName($fileID, $storageTypeID)
	{
		if(!is_integer($fileID))
		{
			$storageTypeID = (int)$fileID;
		}

		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		if($storageTypeID === StorageType::Disk)
		{
			return DiskManager::getFileName($fileID);
		}
		elseif($storageTypeID === StorageType::WebDav)
		{
			$info = \CCrmWebDavHelper::GetElementInfo($fileID, false);
			return is_array($info) && isset($info['NAME']) ? $info['NAME'] : "[{$fileID}]";
		}
		elseif($storageTypeID === StorageType::File)
		{
			$info = \CFile::GetFileArray($fileID);
			return is_array($info) && isset($info['FILE_NAME']) ? $info['FILE_NAME'] : "[{$fileID}]";
		}

		throw new Main\NotSupportedException("Storage type: '{$storageTypeID}' is not supported in current context");
	}
	/**
	 * @param int $fileID
	 * @param int $storageTypeID
	 * @return boolean
	 */
	public static function checkFileReadPermission($fileID, $storageTypeID, $userID = 0)
	{
		if(!is_integer($fileID))
		{
			$storageTypeID = (int)$fileID;
		}

		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		if($storageTypeID === StorageType::WebDav)
		{
			return \CCrmWebDavHelper::CheckElementReadPermission($fileID, $userID);
		}
		elseif($storageTypeID === StorageType::Disk)
		{
			return DiskManager::checkFileReadPermission($fileID, $userID);
		}
		elseif($storageTypeID === StorageType::File)
		{
			return true;
		}

		throw new Main\NotSupportedException("Storage type: '{$storageTypeID}' is not supported in current context");
	}

	public static function registerInterRequestFile($fileID, $storageTypeID)
	{
		if($storageTypeID === StorageType::WebDav)
		{
			if (!isset($_SESSION['crm_saved_dav_files']))
			{
				$_SESSION['crm_saved_dav_files'] = array();
			}
			$_SESSION['crm_saved_dav_files'][] = $fileID;
		}
		elseif($storageTypeID === StorageType::Disk)
		{
			if (!isset($_SESSION['crm_saved_disk_files']))
			{
				$_SESSION['crm_saved_disk_files'] = array();
			}
			$_SESSION['crm_saved_disk_files'][] = $fileID;
		}
	}
	public static function getInterRequestFiles($storageTypeID)
	{
		if($storageTypeID === StorageType::WebDav)
		{
			return isset($_SESSION['crm_saved_dav_files']) ? $_SESSION['crm_saved_dav_files'] : array();
		}
		elseif($storageTypeID === StorageType::Disk)
		{
			return isset($_SESSION['crm_saved_disk_files']) ? $_SESSION['crm_saved_disk_files'] : array();
		}
		return array();
	}

	public static function filterFiles(array $fileIDs, $storageTypeID, $userID = 0)
	{
		if(!is_integer($storageTypeID))
		{
			$storageTypeID = (int)$storageTypeID;
		}

		$savedFiles = self::getInterRequestFiles($storageTypeID);
		$result = array();
		if($storageTypeID === StorageType::WebDav)
		{
			foreach($fileIDs as $fileID)
			{
				if(in_array($fileID, $savedFiles) || \CCrmWebDavHelper::CheckElementReadPermission($fileID, $userID))
				{
					$result[] = $fileID;
				}
			}
		}
		elseif($storageTypeID === StorageType::Disk)
		{
			foreach($fileIDs as $fileID)
			{
				if(in_array($fileID, $savedFiles) || DiskManager::checkFileReadPermission($fileID, $userID))
				{
					$result[] = $fileID;
				}
			}
		}
		elseif($storageTypeID === StorageType::File)
		{
			$result = $fileIDs;
		}

		return $result;
	}
}