Example #1
0
 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;
 }
Example #2
0
 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"]);
     }
 }