• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_tools.php
  • Класс: CSocNetLogComponent
  • Вызов: CSocNetLogComponent::saveFileToUF
static function saveFileToUF($arFile = array(), &$type = null, $userId = false)
{
	global $USER, $DB, $USER_FIELD_MANAGER;

	static $isDiskEnabled = false;
	static $isWebDavEnabled = false;

	static $arDiskData = array();
	static $arWebDavData = array();

	$resultId = false;

	if (
		!$userId
		|| (int)$userId <= 0
	)
	{
		$userId = $USER->GetID();
	}

	if ($isDiskEnabled === false)
	{
		$isDiskEnabled = (
			BitrixMainConfigOption::get('disk', 'successfully_converted', false)
			&& CModule::includeModule('disk')
				? 'Y'
				: 'N'
		);
	}

	if ($isWebDavEnabled === false)
	{
		$isWebDavEnabled = (
			$isDiskEnabled === 'N'
			&& CModule::includeModule('webdav')
				? "Y"
				: "N"
		);
	}

	if (!isset($arDiskData[$userId]))
	{
		$arDiskData[$userId] = array(
			"ENABLED" => "N"
		);

		if ($isDiskEnabled === "Y")
		{
			if (
				($storage = BitrixDiskDriver::getInstance()->getStorageByUserId($userId))
				&& ($folder = $storage->getFolderForUploadedFiles($userId))
			)
			{
				$arDiskData[$userId] = array(
					"ENABLED" => "Y",
					"STORAGE" => $storage,
					"FOLDER" => $folder
				);
			}
		}
	}

	if (!isset($arWebDavData[$userId]))
	{
		$arWebDavData[$userId] = array(
			"ENABLED" => "N"
		);

		if ($isWebDavEnabled === "Y" && $USER instanceof CUser)
		{
			$webDavData = CWebDavIblock::getRootSectionDataForUser($userId);

			if (is_array($webDavData))
			{
				$webDavObject = new CWebDavIblock(
					$webDavData["IBLOCK_ID"],
					"",
					array(
						"ROOT_SECTION_ID" => $webDavData["SECTION_ID"],
						"DOCUMENT_TYPE" => array("webdav", 'CIBlockDocumentWebdavSocnet', 'iblock_'.$webDavData['SECTION_ID'].'_user_'.$userId)
					)
				);

				if ($webDavObject)
				{
					$arParent = $webDavObject->GetObject(
						array(
							"section_id" => $webDavObject->GetMetaID("DROPPED")
						)
					);

					if (!$arParent["not_found"])
					{
						$path = $webDavObject->_get_path($arParent["item_id"], false);
						$tmpName = str_replace(array(":", ".", "/", "\"), "_", ConvertTimeStamp(time(), "FULL"));
						$tmpOptions = array("path" => str_replace("//", "/", $path."/".$tmpName));
						$arParent = $webDavObject->GetObject($tmpOptions);
						if ($arParent["not_found"])
						{
							$rMKCOL = $webDavObject->MKCOL($tmpOptions);
							if ((int)$rMKCOL == 201)
							{
								$webDavData["SECTION_ID"] = $webDavObject->arParams["changed_element_id"];
							}
						}
						else
						{
							$webDavData["SECTION_ID"] = $arParent['item_id'];
							if (!$webDavObject->CheckUniqueName($tmpName, $webDavData["SECTION_ID"], $tmpRes))
							{
								$path = $webDavObject->_get_path($webDavData["SECTION_ID"], false);
								$tmpName = randString(6);
								$tmpOptions = array("path" => str_replace("//", "/", $path."/".$tmpName));
								$rMKCOL = $webDavObject->MKCOL($tmpOptions);
								if (intval($rMKCOL) == 201)
								{
									$webDavData["SECTION_ID"] = $webDavData->arParams["changed_element_id"];
								}
							}
						}

						$arWebDavData[$userId] = array(
							"ENABLED" => "Y",
							"OBJECT" => $webDavObject,
							"DATA" => $webDavData
						);
					}
				}
			}
		}
	}

	if(is_array($arFile))
	{
		$resultId = false;
		if ($arDiskData[$userId]["ENABLED"] === "Y")
		{
			$type = "disk";
			$file = $arDiskData[$userId]["FOLDER"]->uploadFile(
				$arFile, // file array
				array(
					'NAME' => $arFile["name"],
					'CREATED_BY' => $userId
				),
				array(),
				true
			);

			if ($file)
			{
				$resultId = BitrixDiskUfFileUserType::NEW_FILE_PREFIX.$file->getId();
			}
		}
		elseif ($arWebDavData[$userId]["ENABLED"] == "Y")
		{
			$type = "webdav";
			$options = array(
				"new" => true,
				'dropped' => true,
				"arFile" => $arFile,
				"arDocumentStates" => false,
				"arUserGroups" => array_merge($arWebDavData[$userId]["OBJECT"]->USER["GROUPS"], array("Author")),
				"FILE_NAME" => $arFile["name"],
				"IBLOCK_ID" => $arWebDavData[$userId]["DATA"]["IBLOCK_ID"],
				"IBLOCK_SECTION_ID" => $arWebDavData[$userId]["DATA"]["SECTION_ID"],
				"USER_FIELDS" => array()
			);

			$USER_FIELD_MANAGER->EditFormAddFields($arWebDavData[$userId]["OBJECT"]->GetUfEntity(), $options['USER_FIELDS']);

			$DB->StartTransaction();

			if (!$arWebDavData[$userId]["OBJECT"]->put_commit($options))
			{
				$DB->Rollback();
			}
			else
			{
				$DB->Commit();
				$resultId = $options['ELEMENT_ID'];
			}

		}
		else // for main
		{
			$type = "main";
			$resultId = CFile::SaveFile($arFile, $arFile["MODULE_ID"]);
		}
	}

	return $resultId;
}