• Модуль: webdav
  • Путь к файлу: ~/bitrix/modules/webdav/classes/usertypewebdav.php
  • Класс: CUserTypeWebdavElement
  • Вызов: CUserTypeWebdavElement::CheckFields
function CheckFields($arUserField, $value)
{
	static $arRootID = array();

	$fileExists = false;
	$arError = array();
	if (! static::_checkRequiredModules())
		$arError[] = array('id' => 'WD_ERR_MODULES', 'text' => GetMessage('WD_ERR_MODULES'));
	$arFile = static::_fileUnserialize($value);
	if ($arFile === false)
		$arError[] = array('id' => 'WD_ERR_PARSE_FILE', 'text' => GetMessage('WD_ERR_PARSE_FILE'));

	$checkRights = static::CheckRights($arFile['id']);
	if($checkRights === null)
	{
		//mark to delete non exists file
		self::$UF_TO_DELETE[] = $value;
		return array();
	}
	elseif($checkRights === false)
	{
		$arError[] = array('id' => 'WD_ERR_IBLOCK404', 'text' =>GetMessage('WD_ERR_IBLOCK404'));
	}

	if ((sizeof($arError) <= 0) && isset($arFile['dest_section'])) // move to section
	{
		$ibe = new CIBlockElement();
		$dbWDFile = $ibe->GetList(array(), array('ID' => $arFile['id']), false, false, array('ID', 'NAME', 'IBLOCK_SECTION_ID', 'IBLOCK_ID'));
		if ($dbWDFile && $arWDFile = $dbWDFile->Fetch())
		{
			$arFile['iblock'] = $arWDFile['IBLOCK_ID'];
			if ($arFile['dest_iblock'] != $arWDFile['IBLOCK_ID'])
			{
				$dbIBlock = CIBlock::GetList(array(), array('ID' => $arFile['dest_iblock'], 'CHECK_PERMISSIONS' => 'N'));
				if ($dbIBlock && $arIBlock=$dbIBlock->Fetch())
				{
					$arFile['iblock'] = $arIBlock['ID'];
				}
				else
				{
					$arError[] = array('id' => 'WD_ERR_IBLOCK404', 'text' =>GetMessage('WD_ERR_IBLOCK404'));
				}
			}
			$arFile['section'] = $arWDFile['IBLOCK_SECTION_ID'];
			if (($arFile['dest_section'] != $arWDFile['IBLOCK_SECTION_ID']) || ($arFile['iblock'] != $arWDFile['IBLOCK_ID']))
			{
				$arFile['section'] = false;
				if ($arFile['dest_section'] === 0)
				{
					$arFile['section'] = 0;
				}
				else
				{
					$dbWDSection = CIBlockSection::GetList(
						array(),
						array(
							'ID' => $arFile['dest_section'],
							'IBLOCK_ID' => $arFile['iblock'],
							'CHECK_PERMISSIONS' => 'Y'
						)
					);
					if ($dbWDSection && $arWDSection = $dbWDSection->Fetch())
					{
						$arFile['section'] = $arWDSection['ID'];
					}
					else
					{
						$dbWDSection = CIBlockSection::GetList(
							array(),
							array(
								'ID' => $arFile['dest_section'],
								'IBLOCK_ID' => $arFile['iblock'],
								'CHECK_PERMISSIONS' => 'N'
							)
						);
						if ($dbWDSection && $arWDSection = $dbWDSection->Fetch())
						{
							$arError[] = array('id' => 'WD_ERR_SECTION403', 'text' => GetMessage('WD_ERR_SECTION403'));
						}
						else
						{
							$arError[] = array('id' => 'WD_ERR_SECTION404', 'text' => GetMessage('WD_ERR_SECTION404'));
						}
					}
				}
				if (sizeof($arError) <= 0)
				{
					$arFileExistSearch = array(
							'NAME' => $arWDFile['NAME'],
							'IBLOCK_ID' => $arFile['dest_iblock'],
							'SECTION_ID' => $arFile['dest_section']
						);
					$dbFileExist = CIBlockElement::GetList( array(), $arFileExistSearch, false, false, array('ID', 'PROPERTY_FILE'));
					if ($dbFileExist && $arFileExists = $dbFileExist->Fetch())
					{
						$fileExists = $arFileExists;
						//$arError[] = array('id' => 'WD_ERR_FILE_EXISTS', 'text' =>GetMessage('WD_ERR_FILE_EXISTS'));
					}
				}
			}

			if (sizeof($arError) <= 0)
			{
				if ($fileExists === false)
				{
					if ($arFile['iblock'] != $arWDFile['IBLOCK_ID'])
					{
						global $DB;
						$DB->startTransaction();
						$newID = CWebDavIblock::_move_from_iblock_to_iblock($arWDFile['ID'], $arFile['iblock'], $arFile['section']);
						if (!$newID)
						{
							$DB->rollback();
							$arError[] = array('id' => 'WD_ERR_ELEMENT_MOVE', 'text' => GetMessage('WD_ERR_PARSE_FILE'));
						}
						else
						{
							$DB->commit();
							static::$UF_MOVED[$arWDFile['ID']] = $newID;
						}
					}
					elseif( $arFile['section'] != $arWDFile['IBLOCK_SECTION_ID'] )
					{
						global $DB;
						$DB->startTransaction();
						if (! $ibe->Update($arFile['id'], array('IBLOCK_SECTION' => $arFile['dest_section'])))
						{
							$DB->rollback();
							$arError[] = array('id' => 'WD_ERR_IBLOCK_ELEMENT_UPDATE', 'text' => $ibe->LAST_MESSAGE);
						}
						else
						{
							$DB->commit();
						}
					}
				}
				else
				{
					if (!isset($arRootID[$arFile['iblock']]))
					{
						$userIBlockID = CWebDavIblock::LibOptions('user_files', false, SITE_ID);
						$userIBlockID = $userIBlockID['id'];

						$groupIBlockID = CWebDavIblock::LibOptions('group_files', false, SITE_ID);
						$groupIBlockID = $groupIBlockID['id'];
						if ($arFile['iblock'] == $userIBlockID || $arFile['iblock'] == $groupIBlockID)
						{
							$dbChain = CIBlockSection::GetNavChain($arFile['iblock'], $arFile['section']);
							if ($dbChain && $arChain = $dbChain->Fetch())
								$arRootID[$arFile['iblock']] = $arChain['ID'];
						}
						else
						{
							$arRootID[$arFile['iblock']] = false;
						}
					}

					$ob = null;
					$rootID = $arRootID[$arFile['iblock']];
					if ($arFile['iblock'] == $userIBlockID)
					{
						$dbSocNetSection = CIBlockSection::GetList(array(), array('ID' => $rootID));
						if ($dbSocNetSection && $arSocNetSection = $dbSocNetSection->Fetch())
						{
							$ob = new CWebDavIblock($arFile['iblock'], '',
								array(
									"ROOT_SECTION_ID" => $rootID,
									'DOCUMENT_TYPE' => array("webdav", "CIBlockDocumentWebdavSocnet", "iblock_".$arFile['iblock']."_user_".$arSocNetSection['CREATED_BY'])
								)
							);
						}
					}
					elseif ($arFile['iblock'] == $groupIBlockID)
					{
						$dbSocNetSection = CIBlockSection::GetList(array(), array('ID' => $rootID));
						if ($dbSocNetSection && $arSocNetSection = $dbSocNetSection->Fetch())
						{
							$ob = new CWebDavIblock($arFile['iblock'], '',
								array(
									"ROOT_SECTION_ID" => $rootID,
									'DOCUMENT_TYPE' => array("webdav", "CIBlockDocumentWebdavSocnet", "iblock_".$arFile['iblock']."_group_".$arSocNetSection['SOCNET_GROUP_ID'])
								)
							);
						}
					}
					else
					{
						$ob = new CWebDavIblock($arFile['iblock'], '', array());
					}

					if(!isset($ob))
					{
						$arError[] = array(
							"id" => "error_put",
							"text" => "Empty webdav object.",
						);
						return $arError;
					}

					$dbFileNew = $ibe->GetList(
						array(),
						array(
							'ID' => $arWDFile['ID'],
							'IBLOCK_ID' => $arWDFile['IBLOCK_ID'],
						), false, false, array('ID', 'PROPERTY_FILE'));
					if ($dbFileNew && $arFileNew = $dbFileNew->Fetch())
					{
						$fileNew = $arFileNew;
						//$arError[] = array('id' => 'WD_ERR_FILE_EXISTS', 'text' =>GetMessage('WD_ERR_FILE_EXISTS'));
					}

					$cFile = CFile::MakeFileArray($fileNew['PROPERTY_FILE_VALUE']);

					$options = array(
						"new" => false,
						"FILE_NAME" => $arWDFile['NAME'],
						"IBLOCK_ID" => $arFile['iblock'],
						"IBLOCK_SECTION_ID" => $arFile['section'],
						"ELEMENT_ID" => $fileExists['ID'],
						"arFile" => $cFile
					);


					$GLOBALS["DB"]->StartTransaction();

					if (!$ob->put_commit($options))
					{
						$arError[] = array(
							"id" => "error_put",
							"text" => $ob->LAST_ERROR);
						$GLOBALS["DB"]->Rollback();
					}
					else
					{
						$GLOBALS["DB"]->Commit();
						static::$UF_MOVED[$arWDFile['ID']] = $options['ELEMENT_ID'];
					}
				}
			}
		}
	}

	return $arError;
}