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"]); } }
function _get_section_info_arr(&$arr) { $arr["SHOW"] = array("EDIT" => $this->permission > "U" && !$this->check_creator ? "Y" : "N", "DELETE" => $this->permission > "U" && !$this->check_creator ? "Y" : "N", "PERMISSIONS" => $this->permission > "W", "UNDELETE" => "N", "RIGHTS" => $this->e_rights ? "Y" : "N"); $info = array(); if (!isset($arr["~NAME"])) { $arr["~NAME"] = $arr["NAME"]; } $arr["PATH"] = str_replace("//", "/", CWebDavIblock::_get_path($arr["IBLOCK_SECTION_ID"], false) . "/" . $arr["NAME"]); if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') { $info["path"] = $arr["PATH"]; if (SITE_CHARSET != "UTF-8") { $info["path"] = $GLOBALS["APPLICATION"]->ConvertCharset($info["path"], SITE_CHARSET, "UTF-8"); } $info["props"] = array(); $info["props"][] = array('ns' => 'DAV:', 'name' => "resourcetype", 'val' => "collection"); $info["props"][] = array('ns' => 'DAV:', 'name' => "getcontenttype", 'val' => "httpd/unix-directory"); $info["props"][] = array('ns' => 'DAV:', 'name' => "creationdate", 'val' => isset($arr["DATE_CREATE_UNIX"]) ? $arr["DATE_CREATE_UNIX"] : MakeTimeStamp($arr["DATE_CREATE"])); $info["props"][] = array('ns' => 'DAV:', 'name' => "getlastmodified", 'val' => isset($arr["TIMESTAMP_X_UNIX"]) ? $arr["TIMESTAMP_X_UNIX"] : MakeTimeStamp($arr["TIMESTAMP_X"])); $info["props"][] = array('ns' => 'DAV:', 'name' => "iscollection", 1); $info["props"][] = $this->_get_lock_prop(); } if ($this->_parse_webdav_info($arr) && is_array($arr["PROPS"])) { foreach ($arr["PROPS"] as $ns_name => $ns_props) { foreach ($ns_props as $prop_name => $prop_val) { if (is_scalar($prop_val)) { if ($ns_name == "BX:" && $prop_name == "UNDELETE") { $arr["SHOW"]["EDIT"] = "N"; if ($this->permission > "W") { $arr["SHOW"]["DELETE"] = "Y"; $arr["SHOW"]["UNDELETE"] = "Y"; } else { $arr["SHOW"]["DELETE"] = "N"; } $arr["UNDELETE"] = $prop_val; } $info["props"][] = CWebDavBase::_mkprop($ns_name, $prop_name, $prop_val); } } } } if ($this->e_rights) { $bSuperUser = $GLOBALS['USER']->CanDoOperation('webdav_change_settings'); $arShow = array('PERMISSIONS' => 'section_edit', 'EDIT' => 'section_edit', 'DELETE' => 'section_edit', 'UNDELETE' => 'section_delete', "RIGHTS" => "element_rights_edit"); foreach ($arShow as $action => $right) { if (!isset($arr['E_RIGHTS'][$right]) && !$bSuperUser) { $arr['SHOW'][$action] = 'N'; } } $arr['SHOW']['SHARED'] = $arr['SHARED']; } return $info; }