function put_commit(&$options) { if (!empty($options["IBLOCK_SECTION_ID"])) { $sectionData = $this->getSectionDataForLinkAnalyze($options["IBLOCK_SECTION_ID"], $this->getObject(array('section_id' => $options["IBLOCK_SECTION_ID"]))); //simple detect link list($contextType, $contextEntityId) = $this->getContextData(); $isSymlink = !$this->_symlinkMode && CWebDavSymlinkHelper::isLink($contextType, $contextEntityId, $sectionData); if ($isSymlink) { $symlinkSectionData = CWebDavSymlinkHelper::getLinkData($contextType, $contextEntityId, $sectionData); if ($symlinkSectionData) { $linkWebdav = new self($symlinkSectionData[self::UF_LINK_IBLOCK_ID], $this->base_url . $this->_path, array_merge($this->_originalParams, array('ROOT_SECTION_ID' => $symlinkSectionData[self::UF_LINK_SECTION_ID], 'symlinkMode' => true, 'symlinkSectionData' => $symlinkSectionData, 'symlinkRealRootSectionData' => $this->arRootSection))); $options = array_merge($options, array('IBLOCK_ID' => $symlinkSectionData[self::UF_LINK_IBLOCK_ID], 'IBLOCK_SECTION_ID' => $sectionData['ID'])); return $linkWebdav->put_commit($options); } } } $ID = intVal($options["ELEMENT_ID"]); $arError = array(); $arFile = array("name" => $options["FILE_NAME"], "size" => $options["content_length"], "tmp_name" => $options["TMP_FILE"], "type" => "", "error" => 0); if (!empty($options['HEIGHT'])) { $arFile['HEIGHT'] = $options['HEIGHT']; } if (!empty($options['WIDTH'])) { $arFile['WIDTH'] = $options['WIDTH']; } if (is_set($options, "arFile")) { $arFile = $options["arFile"]; } if (isset($arFile['tmp_name']) && is_file($arFile['tmp_name'])) { if (intval($arFile["size"]) <= 0) { $arFile["size"] = filesize($arFile["tmp_name"]); } if ($arFile['type'] == '' && $arFile["size"] > 0) { $arFile["type"] = CFile::GetContentType($arFile['tmp_name'], true); } if ($arFile['type'] == '' || $arFile['type'] == 'application/zip') { $arFile['type'] = $this->get_mime_type($arFile['name']); } } if (isset($arFile['tmp_name']) && strlen($arFile["type"]) <= 0) { $arFile["type"] = $this->get_mime_type($options["FILE_NAME"]); } $bDropped = isset($options['dropped']) ? $options['dropped'] : false; @set_time_limit(1000); if (is_set($options, "~path") && $_SESSION["WEBDAV_DATA"]["PUT_MAC_OS"] == $options["~path"]) { // "For Mac OS"; if ($options["new"]) { $arr = array("ACTIVE" => "N", "IBLOCK_ID" => $this->IBLOCK_ID, "IBLOCK_SECTION_ID" => $options["IBLOCK_SECTION_ID"], "NAME" => $options["FILE_NAME"], "MODIFIED_BY" => $GLOBALS["USER"]->GetID(), "PROPERTY_VALUES" => array($this->file_prop => $arFile, "WEBDAV_SIZE" => $arFile['size'])); if ($arFile["size"] <= 0) { unset($arr["PROPERTY_VALUES"]); } $ID = $this->_ib_elm_add($arr, false, false, false); if (!$ID) { return false; } else { $this->arParams["changed_element_id"] = $ID; } } else { $arr = array("MODIFIED_BY" => $GLOBALS["USER"]->GetID(), "PROPERTY_VALUES" => array($this->file_prop => $arFile, "WEBDAV_SIZE" => $arFile['size'])); $res = $this->_ib_elm_update($options["ELEMENT_ID"], $arr, false); if (!$res) { return false; } } } elseif (is_set($options, "~path") && $this->workflow && !$options["set_now"] && $_SESSION["WEBDAV_DATA"]["PUT_EMPTY"] == $options["~path"]) { $arr = array("MODIFIED_BY" => $GLOBALS["USER"]->GetID(), "PROPERTY_VALUES" => array($this->file_prop => $arFile, "WEBDAV_SIZE" => $arFile['size'])); $res = $this->_ib_elm_update($options["ELEMENT_ID"], $arr, $this->workflow == 'workflow'); if (!$res) { return false; } //if ($this->workflow == 'bizproc_limited' || $this->workflow == 'bizproc') //{ /** * Update history comments */ //$documentId = array($this->wfParams['DOCUMENT_TYPE'][0], $this->wfParams['DOCUMENT_TYPE'][1], $options["ELEMENT_ID"]); //$history = new CBPHistoryService(); //$db_res = $history->GetHistoryList( //array("ID" => "DESC"), //array("DOCUMENT_ID" => $documentId), //false, //false, //array("ID", "DOCUMENT", "NAME") //); //if ($db_res && $arr = $db_res->Fetch()) //{ //$fullpath = $_SERVER["DOCUMENT_ROOT"].$arr["DOCUMENT"]["PROPERTIES"][$this->file_prop]["VALUE"]; //if (!file_exists($fullpath) || filesize($fullpath) <= 0) //CBPHistoryService::Delete($arr["ID"], $documentId); //CBPDocument::AddDocumentToHistory($documentId, $arr["NAME"], $GLOBALS["USER"]->GetID()); //} //} $_SESSION["WEBDAV_DATA"] = array(); WDPackCookie(); } else { if ($this->workflow == "workflow" && $this->permission < "W") { $fw_status_id = is_set($options, "WF_STATUS_ID") ? $options["WF_STATUS_ID"] : false; $arStatusesPermission = array(); $db_res = CWorkflowStatus::GetDropDownList("N", "desc"); while ($db_res && ($res = $db_res->Fetch())) { $perm = CIBlockElement::WF_GetStatusPermission($res["REFERENCE_ID"]); if ($perm < 1) { continue; } $arStatusesPermission[intVal($res["REFERENCE_ID"])] = $perm; if ($fw_status_id === false && $perm >= 2 || $fw_status_id == $res["REFERENCE_ID"]) { $fw_status_id = $res["REFERENCE_ID"]; break; } } if (empty($arStatusesPermission)) { $this->LAST_ERROR = GetMessage("WD_FILE_ERROR_EMPTY_STATUSES"); return false; } elseif ($options["WF_STATUS_ID"] == $fw_status_id && !array_key_exists($fw_status_id, $arStatusesPermission)) { $res = array_flip($arStatusesPermission); $fw_status_id = isset($res[2]) ? $res[2] : reset($res); } $options["WF_STATUS_ID"] = $fw_status_id; } elseif ($this->workflow == 'bizproc' && !$bDropped) { $arDocumentStates = array(); if (is_set($options, "arDocumentStates")) { $arDocumentStates = $options["arDocumentStates"]; } elseif (is_set($this->wfParams, "arDocumentStates")) { $arDocumentStates = $this->wfParams["arDocumentStates"]; } else { $arDocumentStates = CBPDocument::GetDocumentStates($this->wfParams['DOCUMENT_TYPE'], $options["ELEMENT_ID"] > 0 ? array($this->wfParams['DOCUMENT_TYPE'][0], $this->wfParams['DOCUMENT_TYPE'][1], $options["ELEMENT_ID"]) : null); } foreach ($arDocumentStates as $key => $arDocumentState) { if (strlen($arDocumentState["ID"]) <= 0 && is_array($arDocumentState["TEMPLATE_PARAMETERS"])) { $templateId = $arDocumentState["TEMPLATE_ID"]; foreach ($arDocumentState["TEMPLATE_PARAMETERS"] as $key => $arWorkflowParameters) { $_REQUEST["bizproc" . $templateId . "_" . $key] = array_key_exists("bizproc" . $templateId . "_" . $key, $_REQUEST) ? $_REQUEST["bizproc" . $templateId . "_" . $key] : $arWorkflowParameters["Default_printable"]; } } } $arBizProcParametersValues = $arErrors = array(); if (!CIBlockDocumentWebdav::StartWorkflowsParametersValidate($this->wfParams["DOCUMENT_TYPE"], $arDocumentStates, $arBizProcParametersValues, $arErrors)) { $e = new CAdminException($arErrors); $this->LAST_ERROR = $e->GetString(); return false; } } /** * Add or update or clone elements */ if ($options["clone"]) { $arr = array("CREATED_BY" => $GLOBALS["USER"]->GetID(), "MODIFIED_BY" => $GLOBALS["USER"]->GetID(), "PROPERTY_VALUES" => array($this->file_prop => $arFile, "WEBDAV_SIZE" => $arFile['size'], static::PROPERTY_VERSION => 1)); foreach (array("NAME", "TAGS", "PREVIEW_TEXT", "PREVIEW_TEXT_TYPE", "ACTIVE", "WF_COMMENTS", "WF_STATUS_ID") as $key) { if (is_set($options, $key)) { $arr[$key] = $options[$key]; } } if ($arFile["size"] <= 0) { unset($arr["PROPERTY_VALUES"]); } $options["ELEMENT_ID"] = $ID = call_user_func_array(array($this->wfParams['DOCUMENT_TYPE'][1], "CloneElement"), array($options["PARENT_ELEMENT_ID"], $arr)); CIBlockElement::SetPropertyValues($options["ELEMENT_ID"], $this->IBLOCK_ID, array(0), "FORUM_MESSAGE_CNT"); CIBlockElement::SetPropertyValues($options["ELEMENT_ID"], $this->IBLOCK_ID, array(0), "FORUM_TOPIC_ID"); } elseif ($options["new"]) { $arr = array("ACTIVE" => "Y", "IBLOCK_ID" => $this->IBLOCK_ID, "IBLOCK_SECTION_ID" => $options["IBLOCK_SECTION_ID"], "NAME" => $options["FILE_NAME"], "TAGS" => $options["TAGS"], "MODIFIED_BY" => $GLOBALS["USER"]->GetID(), "PREVIEW_TEXT_TYPE" => "html", "PREVIEW_TEXT" => $options["PREVIEW_TEXT"], "WF_COMMENTS" => !empty($options["WF_COMMENTS"]) ? $options["WF_COMMENTS"] : GetMessage("WD_FILE_IS_CREATED"), "PROPERTY_VALUES" => array($this->file_prop => $arFile, "WEBDAV_SIZE" => $arFile['size'], static::PROPERTY_VERSION => 1)); if (isset($options['USER_FIELDS'])) { $arr["USER_FIELDS"] = $options['USER_FIELDS']; } if ($this->workflow == 'workflow' && isset($options["WF_STATUS_ID"])) { $arr["WF_STATUS_ID"] = $options["WF_STATUS_ID"]; } else { $arr["WF_STATUS_ID"] = 1; } if ($this->workflow == 'bizproc') { $arr["BP_PUBLISHED"] = $this->wfParams["AUTO_PUBLISH"] == "Y" || $bDropped ? "Y" : "N"; } $options["ELEMENT_ID"] = $ID = $this->_ib_elm_add($arr, ($_SERVER['REQUEST_METHOD'] != "LOCK" || $this->workflow != "workflow") && $this->workflow != false, $arFile['size'] > 0, false); if (!$ID) { return false; } else { $this->arParams["changed_element_id"] = $ID; } } else { $arUpdateType = array(); $arr = array("MODIFIED_BY" => $GLOBALS["USER"]->GetID(), "WF_COMMENTS" => GetMessage("WD_FILE_IS_MODIFIED")); if (isset($options['USER_FIELDS'])) { $arr["USER_FIELDS"] = $options['USER_FIELDS']; } if (!empty($arFile)) { $arr["PROPERTY_VALUES"] = array($this->file_prop => $arFile, "WEBDAV_SIZE" => $arFile['size']); $arUpdateType[] = 'FILE'; } $element = $this->GetObject(array('element_id' => $options["ELEMENT_ID"])); foreach (array("NAME", "TAGS", "PREVIEW_TEXT", "ACTIVE", "IBLOCK_SECTION_ID", "WF_COMMENTS", "WF_STATUS_ID") as $key) { if (is_set($options, $key)) { $arr[$key] = $options[$key]; if (isset($element['element_array'][$key]) && $element['element_array'][$key] != $options[$key]) { $arUpdateType[] = $key; } } } //if ($arFile["size"] <= 0) //unset($arr["PROPERTY_VALUES"]); if (is_set($arr, "PREVIEW_TEXT")) { $arr["PREVIEW_TEXT_TYPE"] = 'html'; } if (is_set($arr, "IBLOCK_SECTION_ID")) { $arr["IBLOCK_SECTION_ID"] = intval($arr["IBLOCK_SECTION_ID"]); if ($this->arRootSection && $arr["IBLOCK_SECTION_ID"] <= 0) { $arr["IBLOCK_SECTION_ID"] = $this->arRootSection["ID"]; } } if ($_SERVER['REQUEST_METHOD'] != "LOCK" && !$options["clone"] && ($this->workflow == 'bizproc_limited' || $this->workflow == 'bizproc')) { if (empty($arr["PROPERTY_VALUES"])) { $arr["PROPERTY_VALUES"] = array(); } if (empty($element['element_array']['PROPERTY_' . static::PROPERTY_VERSION . '_VALUE'])) { //+1 - version from HEAD $countAlreadyInHistory = (int) $this->countHistoryDocumentByFileId($options["ELEMENT_ID"]) + 1; } else { $countAlreadyInHistory = $element['element_array']['PROPERTY_' . static::PROPERTY_VERSION . '_VALUE']; } $arr["PROPERTY_VALUES"][static::PROPERTY_VERSION] = $countAlreadyInHistory + 1; $options['THROUGH_VERSION'] = $arr["PROPERTY_VALUES"][static::PROPERTY_VERSION]; $this->AddDocumentToHistory($ID, $options['FILE_NAME']); } $res = $this->_ib_elm_update($options["ELEMENT_ID"], $arr, $this->workflow == "workflow"); if (!$res) { return false; } $ID = $options["ELEMENT_ID"]; $this->_onEvent('Update', $ID, 'FILE', array('UPDATE_TYPE' => $arUpdateType)); if ($this->workflow == 'bizproc' && is_set($arr, "IBLOCK_SECTION_ID")) { $db_res2 = CIBlockElement::GetList(array(), array("WF_PARENT_ELEMENT_ID" => $options["ELEMENT_ID"], "SHOW_HISTORY" => "Y"), false, false, array("ID")); if ($db_res2 && ($res2 = $db_res2->Fetch())) { do { $ar = array("IBLOCK_SECTION_ID" => $arr["IBLOCK_SECTION_ID"]); $res = $this->_ib_elm_update($res2["ID"], $ar, false); } while ($res2 = $db_res2->Fetch()); } } } $documentId = $this->wfParams["DOCUMENT_TYPE"]; $documentId[2] = $ID; if ($this->workflow == 'bizproc' && !$bDropped) { if (!CIBlockDocumentWebdav::StartWorkflowsExecuting($documentId, $arDocumentStates, $arBizProcParametersValues, $options["arUserGroups"], $arErrors)) { $e = new CAdminException($arErrors); $this->LAST_ERROR = $e->GetString(); } } } $this->CACHE['CWebDavIblock::GetObject'] = array(); return true; }