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'])) { $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); } $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; }
public static function saveRawFilesToUF($arAttachedFilesRaw, $ufCode, &$arFields) { static $isDiskEnabled = false; static $isWebDavEnabled = false; if ($isDiskEnabled === false) { $isDiskEnabled = \Bitrix\Main\Config\Option::get('disk', 'successfully_converted', false) && CModule::includeModule('disk') && ($storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($GLOBALS["USER"]->GetID())) && ($folder = $storage->getFolderForUploadedFiles($GLOBALS["USER"]->GetID())) ? "Y" : "N"; } if ($isWebDavEnabled === false) { $isWebDavEnabled = IsModuleInstalled('webdav') ? "Y" : "N"; } if (empty($arFields[$ufCode])) { $arFields[$ufCode] = array(); } $arRelation = array(); foreach ($arAttachedFilesRaw as $attachedFileRow) { if (!empty($attachedFileRow["base64"]) && !empty($attachedFileRow["url"])) { $fileContent = base64_decode($attachedFileRow["base64"]); $arUri = parse_url($attachedFileRow["url"]); if (!empty($arUri) && !empty($arUri["path"])) { $fileName = $arUri["path"]; } if (!empty($fileContent) && !empty($fileName)) { $fileName = CTempFile::GetFileName($fileName); if (CheckDirPath($fileName)) { file_put_contents($fileName, $fileContent); $arFile = CFile::MakeFileArray($fileName); if (is_array($arFile)) { $resultId = false; if ($isDiskEnabled == "Y") { $file = $folder->uploadFile($arFile, array('NAME' => $arFile["name"], 'CREATED_BY' => $GLOBALS["USER"]->GetID()), array(), true); if ($file) { $resultId = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX . $file->getId(); } } elseif ($isWebDavEnabled == "Y") { $webDavData = CWebDavIblock::getRootSectionDataForUser($GLOBALS["USER"]->GetID()); 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_' . intval($GLOBALS["USER"]->GetID())))); 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 (intval($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"]; } } } } $options = array("new" => true, 'dropped' => true, "arFile" => $arFile, "arDocumentStates" => false, "arUserGroups" => array_merge($webDavObject->USER["GROUPS"], array("Author")), "FILE_NAME" => $arFile["name"], "IBLOCK_ID" => $webDavData["IBLOCK_ID"], "IBLOCK_SECTION_ID" => $webDavData["SECTION_ID"], "USER_FIELDS" => array()); $GLOBALS['USER_FIELD_MANAGER']->EditFormAddFields($webDavObject->GetUfEntity(), $options['USER_FIELDS']); $GLOBALS["DB"]->StartTransaction(); if (!$webDavObject->put_commit($options)) { $GLOBALS["DB"]->Rollback(); } else { $GLOBALS["DB"]->Commit(); $resultId = $options['ELEMENT_ID']; } } } } else { $resultId = CFile::SaveFile($arFile, $arFile["MODULE_ID"]); } if ($resultId) { $arFields[$ufCode][] = $resultId; } if (!empty($attachedFileRow["id"])) { $arRelation[$attachedFileRow["id"]] = $resultId; } } } } } } if (!empty($arRelation)) { $arFields["DETAIL_TEXT"] = preg_replace_callback("/\\[DISK\\s+FILE\\s+ID\\s*=\\s*pseudo@([\\d]+)\\]/is" . BX_UTF_PCRE_MODIFIER, function ($matches) use($arRelation, $isDiskEnabled, $isWebDavEnabled) { if (isset($arRelation[intval($matches[1])])) { if ($isDiskEnabled == "Y") { return "[DISK FILE ID=" . $arRelation[intval($matches[1])] . "]"; } elseif ($isWebDavEnabled == "Y") { return "[DOCUMENT ID=" . intval($arRelation[intval($matches[1])]) . "]"; } else { return "[DISK FILE ID=pseudo@" . $matches[1] . "]"; } } else { return "[DISK FILE ID=pseudo@" . $matches[1] . "]"; } }, $arFields["DETAIL_TEXT"]); } }