function WF_UnLock($LAST_ID, $bWorkFlow = true) { global $DB, $USER; $LAST_ID = intval($LAST_ID); $USER_ID = is_object($USER) ? intval($USER->GetID()) : 0; if ($bWorkFlow === true) { $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tWF_PARENT_ELEMENT_ID,\n\t\t\t\t\tWF_LOCKED_BY\n\t\t\t\tFROM\n\t\t\t\t\tb_iblock_element\n\t\t\t\tWHERE\n\t\t\t\t\tID = " . $LAST_ID . "\n\t\t\t"; $z = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br>LINE: " . __LINE__); $zr = $z->Fetch(); if ($zr && ($zr["WF_LOCKED_BY"] == $USER_ID || CModule::IncludeModule('workflow') && CWorkflow::IsAdmin())) { $PARENT_ID = intval($zr["WF_PARENT_ELEMENT_ID"]); $DB->Query("\n\t\t\t\t\tUPDATE b_iblock_element\n\t\t\t\t\tSET\n\t\t\t\t\t\tWF_DATE_LOCK = null,\n\t\t\t\t\t\tWF_LOCKED_BY = null\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tID in (" . $LAST_ID . ", " . $PARENT_ID . ")\n\t\t\t\t\t\tOR WF_PARENT_ELEMENT_ID = " . $PARENT_ID . "\n\t\t\t\t", false, "FILE: " . __FILE__ . "<br>LINE: " . __LINE__); } } else { $DB->Query("\n\t\t\t\tUPDATE b_iblock_element\n\t\t\t\tSET\n\t\t\t\t\tWF_DATE_LOCK = null,\n\t\t\t\t\tWF_LOCKED_BY = null\n\t\t\t\tWHERE\n\t\t\t\t\tID = " . $LAST_ID, false, "FILE: " . __FILE__ . "<br>LINE: " . __LINE__); } }
$STATUS_PERMISSION = 2; else $STATUS_PERMISSION = CIBlockElement::WF_GetStatusPermission($arRes["WF_STATUS_ID"]); $intMinPerm = 2; $arUnLock = Array( "ICON" => "unlock", "TEXT" => GetMessage("IBLIST_A_UNLOCK"), "TITLE" => GetMessage("IBLIST_A_UNLOCK_ALT"), "ACTION" => "if(confirm('".GetMessageJS("IBLIST_A_UNLOCK_CONFIRM")."')) ".$lAdmin->ActionDoGroup($f_TYPE.$arRes_orig['ID'], "unlock", $sThisSectionUrl), ); if ($arRes_orig['LOCK_STATUS']=="red") { if (CWorkflow::IsAdmin()) $arActions[] = $arUnLock; } else { /* * yellow unlock * edit * copy * history * view (?) * edit_orig (?) * delete */ if ( CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $f_ID, "element_edit")
public static function WF_GetStatusPermission($STATUS_ID, $ID = false) { global $DB, $USER; $result = false; if (CModule::IncludeModule("workflow")) { if (CWorkflow::IsAdmin()) { return 2; } else { $ID = intval($ID); if ($ID) { $arStatus = array(); $arSql = array("ID='" . $ID . "'", "WF_PARENT_ELEMENT_ID='" . $ID . "'"); foreach ($arSql as $where) { $strSql = "SELECT ID, WF_STATUS_ID FROM b_iblock_element WHERE " . $where; $rs = $DB->Query($strSql); while ($ar = $rs->Fetch()) { $arStatus[$ar["WF_STATUS_ID"]] = $ar["WF_STATUS_ID"]; } } } else { $arStatus = array(intval($STATUS_ID) => intval($STATUS_ID)); } $arGroups = $USER->GetUserGroupArray(); if (!is_array($arGroups)) { $arGroups[] = 2; } $groups = implode(",", $arGroups); foreach ($arStatus as $STATUS_ID) { $strSql = "SELECT max(G.PERMISSION_TYPE) as MAX_PERMISSION " . "FROM b_workflow_status2group G " . "WHERE G.STATUS_ID = " . $STATUS_ID . " " . "\tAND G.GROUP_ID in (" . $groups . ") "; $rs = $DB->Query($strSql); $ar = $rs->Fetch(); $ar["MAX_PERMISSION"] = intval($ar["MAX_PERMISSION"]); if ($result === false || $result > $ar["MAX_PERMISSION"]) { $result = $ar["MAX_PERMISSION"]; } } } } return $result; }
function GetList(&$by, &$order, $arFilter = array(), &$is_filtered) { $err_mess = CWorkflow::err_mess() . "<br>Function: GetList<br>Line: "; global $DB, $USER, $APPLICATION; $arSqlSearch = array(); $strSqlSearch = ""; $MAX_LOCK = intval(COption::GetOptionString("workflow", "MAX_LOCK_TIME", "60")); $arGroups = $USER->GetUserGroupArray(); if (!is_array($arGroups)) { $arGroups[] = 2; } $groups = implode(",", $arGroups); $uid = intval($USER->GetID()); if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if (strlen($val) <= 0 || "{$val}" == "NOT_REF") { continue; } if (is_array($val) && count($val) <= 0) { continue; } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter) ? true : false; $key = strtoupper($key); switch ($key) { case "ID": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "N" ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("D.ID", $val, $match); break; case "DATE_MODIFY_1": if (CheckDateTime($val)) { $arSqlSearch[] = "D.DATE_MODIFY >= " . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_MODIFY_2": if (CheckDateTime($val)) { $arSqlSearch[] = "D.DATE_MODIFY < " . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "MODIFIED_BY": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "Y" ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.MODIFIED_BY, UM.LOGIN, UM.NAME, UM.LAST_NAME", $val, $match); break; case "MODIFIED_USER_ID": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "N" ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("D.MODIFIED_BY", $val, $match); break; case "LOCK_STATUS": $arSqlSearch[] = "\n\t\t\t\t\t\tif (D.DATE_LOCK is null, 'green',\n\t\t\t\t\t\t\tif(DATE_ADD(D.DATE_LOCK, interval {$MAX_LOCK} MINUTE)<now(), 'green',\n\t\t\t\t\t\t\t\tif(D.LOCKED_BY={$uid}, 'yellow', 'red'))) = '" . $DB->ForSql($val) . "'"; break; case "STATUS": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "Y" ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.STATUS_ID, S.TITLE", $val, $match); break; case "STATUS_ID": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "N" ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("D.STATUS_ID", $val, $match); break; case "SITE_ID": case "TITLE": case "BODY": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "Y" ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D." . $key, $val, $match); break; case "FILENAME": $match = $match_value_set && $arFilter[$key . "_EXACT_MATCH"] == "Y" ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.FILENAME", $val, $match, array("/", "\\", ".", "_")); break; } } } if ($by == "s_id") { $strSqlOrder = "ORDER BY D.ID"; } elseif ($by == "s_lock_status") { $strSqlOrder = "ORDER BY LOCK_STATUS"; } elseif ($by == "s_date_modify") { $strSqlOrder = "ORDER BY D.DATE_MODIFY"; } elseif ($by == "s_modified_by") { $strSqlOrder = "ORDER BY D.MODIFIED_BY"; } elseif ($by == "s_filename") { $strSqlOrder = "ORDER BY D.FILENAME"; } elseif ($by == "s_title") { $strSqlOrder = "ORDER BY D.TITLE"; } elseif ($by == "s_site_id") { $strSqlOrder = "ORDER BY D.SITE_ID"; } elseif ($by == "s_status") { $strSqlOrder = "ORDER BY D.STATUS_ID"; } else { $by = "s_date_modify"; $strSqlOrder = "ORDER BY D.DATE_MODIFY"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); if (CWorkflow::IsAdmin()) { $strSql = "\n\t\t\t\tSELECT DISTINCT\n\t\t\t\t\tD.*,\n\t\t\t\t\t" . $DB->DateToCharFunction("D.DATE_ENTER") . " DATE_ENTER,\n\t\t\t\t\t" . $DB->DateToCharFunction("D.DATE_MODIFY") . " DATE_MODIFY,\n\t\t\t\t\t" . $DB->DateToCharFunction("D.DATE_LOCK") . " DATE_LOCK,\n\t\t\t\t\tconcat('(',UM.LOGIN,') ',ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,'')) MUSER_NAME,\n\t\t\t\t\tconcat('(',UE.LOGIN,') ',ifnull(UE.NAME,''),' ',ifnull(UE.LAST_NAME,'')) EUSER_NAME,\n\t\t\t\t\tS.TITLE STATUS_TITLE,\n\t\t\t\t\tif (D.DATE_LOCK is null, 'green',\n\t\t\t\t\t\tif(DATE_ADD(D.DATE_LOCK, interval {$MAX_LOCK} MINUTE)<now(), 'green',\n\t\t\t\t\t\t\tif(D.LOCKED_BY={$uid}, 'yellow', 'red'))) LOCK_STATUS\n\t\t\t\tFROM\n\t\t\t\t\tb_workflow_document D\n\t\t\t\t\tLEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID)\n\t\t\t\t\tLEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY)\n\t\t\t\t\tLEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY)\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\t{$strSqlOrder}\n\t\t\t\t"; } else { $strSql = "\n\t\t\t\tSELECT DISTINCT\n\t\t\t\t\tD.*,\n\t\t\t\t\t" . $DB->DateToCharFunction("D.DATE_ENTER") . " DATE_ENTER,\n\t\t\t\t\t" . $DB->DateToCharFunction("D.DATE_MODIFY") . " DATE_MODIFY,\n\t\t\t\t\t" . $DB->DateToCharFunction("D.DATE_LOCK") . " DATE_LOCK,\n\t\t\t\t\tconcat('(',UM.LOGIN,') ',ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,'')) MUSER_NAME,\n\t\t\t\t\tconcat('(',UE.LOGIN,') ',ifnull(UE.NAME,''),' ',ifnull(UE.LAST_NAME,'')) EUSER_NAME,\n\t\t\t\t\tS.TITLE STATUS_TITLE,\n\t\t\t\t\tif (D.DATE_LOCK is null, 'green',\n\t\t\t\t\t\tif(DATE_ADD(D.DATE_LOCK, interval {$MAX_LOCK} MINUTE)<now(), 'green',\n\t\t\t\t\t\t\tif(D.LOCKED_BY={$uid}, 'yellow', 'red'))) LOCK_STATUS\n\t\t\t\tFROM\n\t\t\t\t\tb_workflow_document D\n\t\t\t\t\tINNER JOIN b_workflow_status2group G ON (G.STATUS_ID = D.STATUS_ID)\n\t\t\t\t\tLEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID)\n\t\t\t\t\tLEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY)\n\t\t\t\t\tLEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY)\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tand G.GROUP_ID in ({$groups})\n\t\t\t\tand G.PERMISSION_TYPE >= '2'\n\t\t\t\t{$strSqlOrder}\n\t\t\t\t"; } $rs = $DB->Query($strSql, false, $err_mess . __LINE__); $is_filtered = IsFiltered($strSqlSearch); $arr = array(); while ($ar = $rs->Fetch()) { if ($USER->CanDoFileOperation('fm_edit_in_workflow', array($ar["SITE_ID"], $ar["FILENAME"]))) { $arr[] = $ar; } } $rs = new CDBResult(); $rs->InitFromArray($arr); return $rs; }
function GetDropDownList($SHOW_ALL = "N", $strOrder = "desc", $arFilter = array()) { global $USER; if (strtolower($strOrder) != "asc") { $strOrder = "desc"; } else { $strOrder = "asc"; } $arFilter["!=ACTIVE"] = "N"; if (!(CWorkflow::IsAdmin() || $SHOW_ALL == "Y")) { $arGroups = $USER->GetUserGroupArray(); if (!is_array($arGroups)) { $arGroups = array(2); } $arFilter["GROUP_ID"] = $arGroups; $arFilter["PERMISSION_TYPE_1"] = 1; } return CWorkflowStatus::GetList($by = "s_c_sort", $strOrder, $arFilter, $is_filtered, array("REFERENCE_ID", "REFERENCE", "IS_FINAL", "C_SORT")); }
} if (!empty($arParams["SHOW_NOTE"])) { ?> <br /> <div class="wd-help-list selected" id="wd_list_note"><?php echo $arParams["~SHOW_NOTE"]; ?> </div> <?php } if ($arParams["WORKFLOW"] == "workflow" && $arParams["PERMISSION"] >= "U" && $arParams["SHOW_WORKFLOW"] != "N") { ?> <br /> <div class="wd-help-list selected"> <?php if ($arParams["PERMISSION"] >= "W" && CWorkflow::IsAdmin()) { echo GetMessage("WD_WF_COMMENT1"); ?> <br /><?php } elseif (!in_array(2, $arResult["WF_STATUSES_PERMISSION"])) { echo GetMessage("WD_WF_COMMENT2"); ?> <br /><?php } else { foreach ($arResult["WF_STATUSES_PERMISSION"] as $key => $val) { if ($val == 2) { $arr[] = $arResult["WF_STATUSES"][$key]; } } if (count($arr) == 1) { echo str_replace("#STATUS#", $arr[0], GetMessage("WD_WF_ATTENTION2"));
function CheckFields() { global $DB, $strError, $FILENAME, $APPLICATION, $ID, $BODY, $USER, $SITE_ID, $STATUS_ID, $DOC_ROOT; $str = ""; $arMsg = array(); $SCRIPT_FILE_TYPE = GetFileType($FILENAME); $FILENAME = trim($FILENAME); $FILENAME = "/" . ltrim(_normalizePath($FILENAME), "/"); $io = CBXVirtualIo::GetInstance(); if (strlen($FILENAME) <= 0) { $arMsg[] = array("id" => "FILENAME", "text" => GetMessage("FLOW_FORGOT_FILENAME")); } elseif (!$io->ValidatePathString($FILENAME)) { $arMsg[] = array("id" => "FILENAME", "text" => GetMessage("FLOW_FILE_NAME_NOT_VALID")); } elseif ($SCRIPT_FILE_TYPE != "SOURCE") { $arMsg[] = array("id" => "FILENAME", "text" => GetMessage("FLOW_INCORRECT_FILETYPE")); } else { $SITE_ID = CWorkflow::__CheckSite($SITE_ID); if (!$SITE_ID) { $SITE_ID = CSite::GetSiteByFullPath($_SERVER['DOCUMENT_ROOT'] . $FILENAME); } if (!$USER->CanDoFileOperation('fm_edit_in_workflow', array($SITE_ID, $FILENAME))) { $s = str_replace("#FILENAME#", "{$FILENAME}", GetMessage("FLOW_ACCESS_DENIED")); $arMsg[] = array("id" => "FILENAME", "text" => $s . ": " . GetMessage("FLOW_MIN_RIGHTS")); } elseif ($STATUS_ID == 1 && !($USER->CanDoFileOperation('fm_edit_existent_file', array($SITE_ID, $FILENAME)) && $USER->CanDoFileOperation('fm_create_new_file', array($SITE_ID, $FILENAME)))) { $arMsg[] = array("id" => "FILENAME", "text" => GetMessage("FLOW_ACCESS_DENIED_FOR_FILE_WRITE", array("#FILENAME#" => $FILENAME))); } else { $z = CWorkflow::GetByFilename($FILENAME, $SITE_ID); if ($zr = $z->Fetch()) { if ($zr["ID"] != $ID && $zr["STATUS_ID"] != 1) { $arMsg[] = array("id" => "FILENAME", "text" => str_replace("#FILENAME#", $FILENAME, GetMessage("FLOW_FILENAME_EXIST"))); } } } } if (!CWorkflow::IsAdmin()) { $arGroups = $USER->GetUserGroupArray(); if (!is_array($arGroups)) { $arGroups = array(2); } $arFilter = array("GROUP_ID" => $arGroups, "PERMISSION_TYPE_1" => 1, "ID_EXACT_MATCH" => "Y", "ID" => $STATUS_ID); $rsStatuses = CWorkflowStatus::GetList($by = "s_c_sort", $strOrder, $arFilter, $is_filtered, array("ID")); if (!$rsStatuses->Fetch()) { $arMsg[] = array("id" => "STATUS_ID", "text" => GetMessage("FLOW_ERROR_WRONG_STATUS")); } } $bIsPhp = IsPHP($BODY); if ($bIsPhp) { if ($USER->CanDoFileOperation('fm_lpa', array($SITE_ID, $FILENAME)) && !$USER->CanDoOperation('edit_php')) { if (CModule::IncludeModule("fileman")) { $old_res = CFileman::ParseFileContent($APPLICATION->GetFileContent($DOC_ROOT . $FILENAME), true); $old_BODY = $old_res["CONTENT"]; $BODY = CMain::ProcessLPA($BODY, $old_BODY); } else { $arMsg[] = array("id" => "BODY", "text" => "Error! Fileman is not included!"); } } else { if (!$USER->CanDoOperation('edit_php')) { $arMsg[] = array("id" => "BODY", "text" => GetMessage("FLOW_PHP_IS_NOT_AVAILABLE")); } } } if (!empty($arMsg)) { $e = new CAdminException($arMsg); $GLOBALS["APPLICATION"]->ThrowException($e); return false; } return true; }
function _get_file_info_arr(&$res, $arParams = array()) { global $USER; static $arFiles = array(); static $arBPTemplateStates = array(); static $arBPParamRequired = array(); $trashID = $this->GetMetaID('TRASH'); if ($this->workflow == 'bizproc') { if (!isset($arBPParamRequired[$this->IBLOCK_ID])) { $arBPParamRequired[$this->IBLOCK_ID] = $this->IsBpParamRequired(); } } $info = array(); if (!in_array($res["ID"], $arFiles)) { $res["SHOW"] = array(); $res["PERMISSION"] = $this->permission; $res['SHOW']['SHARED'] = $res['SHARED']; $res["~NAME"] = $res["NAME"]; $res['USER_FIELDS'] = $this->GetUfFields($res['ID']); if ($this->permission >= "U") { $res["SHOW"]["RIGHTS"] = $this->e_rights && (isset($res['E_RIGHTS']['element_rights_edit']) || $GLOBALS['USER']->CanDoOperation('webdav_change_settings')) ? "Y" : "N"; if ($this->workflow == 'workflow') { $original = $res; $LAST_ID = CIBlockElement::WF_GetLast($res['ID']); if ($LAST_ID != $res['ID']) { $db_res = CIBlockElement::GetList(array(), array("ID" => $LAST_ID, "SHOW_HISTORY" => "Y"), false, array("nTopCount" => 1), $this->wfParams["selected_fields"]); $res = $db_res->GetNext(); $res["FILE"]["FILE_SIZE"] = $this->GetFileSize($res); if ($this->e_rights) { $res['E_RIGHTS'] = $this->GetPermission('ELEMENT', $res['ID']); } } $res["ORIGINAL"] = $original; $res["PERMISSION"] = $original["PERMISSION"]; $res["REAL_ID"] = $res["ID"]; $res["ID"] = $original["ID"]; $res["PROPERTY_WEBDAV_INFO_VALUE"] = $original["PROPERTY_WEBDAV_INFO_VALUE"]; $res["PROPERTY_WEBDAV_INFO_VALUE_ID"] = $original["PROPERTY_WEBDAV_INFO_VALUE_ID"]; $res["TAGS"] = $original["TAGS"]; $res["~TAGS"] = $original["~TAGS"]; $res["PREVIEW_TEXT"] = $original["PREVIEW_TEXT"]; $res["~PREVIEW_TEXT"] = $original["~PREVIEW_TEXT"]; $res["NAME"] = $original["NAME"]; $res["~NAME"] = $original["~NAME"]; $res["LOCK_STATUS"] = $original["LOCK_STATUS"]; $res["LOCKED_USER_NAME"] = $original["LOCKED_USER_NAME"]; $res["WF_LOCKED_BY"] = $original["WF_LOCKED_BY"]; $res["WF_DATE_LOCK"] = $original["WF_DATE_LOCK"]; $res["LAST_ID"] = $LAST_ID; $res["TYPE"] = "E"; $res["SHOW"]["COPY"] = "Y"; $res["STATUS_ID"] = CIBlockElement::WF_GetCurrentStatus($LAST_ID, $res["STATUS_TITLE"]); $res["STATUS_PERMISSION"] = CIBlockElement::WF_GetStatusPermission($res["STATUS_ID"]); if ($res["STATUS_PERMISSION"] >= 2 || ($this->e_rights ? isset($res['E_RIGHTS']['element_edit_any_wf_status']) : $this->permission >= "W")) { $res["SHOW"]["UNLOCK"] = $res['LOCK_STATUS'] == "yellow" || $res['LOCK_STATUS'] == "red" && CWorkflow::IsAdmin() ? "Y" : "N"; $res["SHOW"]["LOCK"] = $res['LOCK_STATUS'] == "green" ? "Y" : "N"; $res["PERMISSION"] = $res['LOCK_STATUS'] == "red" && !CWorkflow::IsAdmin() ? "R" : $res["PERMISSION"]; // Edit History Delete if ($res['ORIGINAL']['WF_NEW'] == "Y" || $res["WF_STATUS_ID"] <= 1) { $res["SHOW"]["HISTORY"] = $res["SHOW"]["DELETE"] = $res["SHOW"]["EDIT"] = $this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId() ? "N" : "Y"; } elseif ($res["WF_STATUS_ID"] > 1) { $res["SHOW"]["HISTORY"] = $res["SHOW"]["EDIT"] = $this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId() ? "N" : "Y"; $res["SHOW"]["DELETE"] = $res["SHOW"]["EDIT"] == "Y" && $res["PERMISSION"] > "U" ? "Y" : "N"; } if ($res["LOCK_STATUS"] == "red") { $res["SHOW"]["UNLOCK"] = CWorkflow::IsAdmin() ? "Y" : "N"; $res["SHOW"]["EDIT"] = "N"; $res["SHOW"]["DELETE"] = "N"; } elseif ($this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId()) { $res["SHOW"]["UNLOCK"] = "N"; $res["SHOW"]["LOCK"] = "N"; $res["SHOW"]["DELETE"] = "N"; $res["SHOW"]["EDIT"] = "N"; } } if ($res["STATUS_PERMISSION"] >= 2 || ($this->e_rights ? isset($res['E_RIGHTS']['element_delete']) : $this->permission >= "W")) { $res["PERMISSION"] = $res['LOCK_STATUS'] == "red" && !CWorkflow::IsAdmin() ? "R" : $res["PERMISSION"]; if ($res['ORIGINAL']['WF_NEW'] == "Y" || $res["WF_STATUS_ID"] <= 1) { $res["SHOW"]["DELETE"] = $this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId() ? "N" : "Y"; } elseif ($res["WF_STATUS_ID"] > 1) { $res["SHOW"]["DELETE"] = $this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId() && $res["PERMISSION"] > "U" ? "N" : "Y"; } } } elseif ($this->workflow == "bizproc") { if ($this->e_rights) { $res["PERMISSION"] = $res["E_RIGHTS"]; } if ($res['LOCK_STATUS'] != "red") { $res['LOCK_STATUS_BP'] = call_user_func(array($this->wfParams["DOCUMENT_TYPE"][1], "IsDocumentLocked"), $res["ID"] | $res["item_id"], "") ? "red" : "green"; $res['LOCK_STATUS'] = $res['LOCK_STATUS_BP'] == "red" ? "red" : $res['LOCK_STATUS']; } $res["PERMISSION"] = $res['LOCK_STATUS'] == "red" ? "R" : $res["PERMISSION"]; $res["USER_GROUPS"] = $this->USER["GROUPS"]; if ($res["CREATED_BY"] == $GLOBALS["USER"]->GetID()) { $res["USER_GROUPS"][] = "Author"; } $res["DOCUMENT_ID"] = $this->wfParams["DOCUMENT_TYPE"]; $res["DOCUMENT_ID"][2] = $res["ID"] | $res["item_id"]; $res["~arDocumentStates"] = CBPDocument::GetDocumentStates($this->wfParams["DOCUMENT_TYPE"], $res["DOCUMENT_ID"]); $res["arDocumentStates"] = array(); foreach ($res["~arDocumentStates"] as $key => $arDocumentState) { $res["~arDocumentStates"][$key]["ViewWorkflow"] = CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::ViewWorkflow, $GLOBALS["USER"]->GetID(), $res["DOCUMENT_ID"], array("DocumentType" => $this->wfParams["DOCUMENT_TYPE"], "AllUserGroups" => $res["USER_GROUPS"], "DocumentStates" => $res["~arDocumentStates"], "WorkflowId" => $key)); if (strlen($arDocumentState["ID"]) > 0 && $res["~arDocumentStates"][$key]["ViewWorkflow"]) { $res["arDocumentStates"][$key] = $arDocumentState; $res["PERMISSION"] = "U"; } } if ($res['LOCK_STATUS'] != "red") { if (CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::WriteDocument, $GLOBALS["USER"]->GetID(), $res["DOCUMENT_ID"], array("DocumentType" => $this->wfParams["DOCUMENT_TYPE"], "IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $res["USER_GROUPS"], "DocumentStates" => $res["~arDocumentStates"]))) { $res["PERMISSION"] = "W"; } elseif (!CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::ReadDocument, $GLOBALS["USER"]->GetID(), $res["DOCUMENT_ID"], array("DocumentType" => $this->wfParams["DOCUMENT_TYPE"], "IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $res["USER_GROUPS"], "DocumentStates" => $res["~arDocumentStates"]))) { $res["PERMISSION"] = "D"; } } if ($this->CheckRight($res["PERMISSION"], 'element_read') > "D") { if ($arParams["get_clones"] == "Y" && intVal($res["WF_PARENT_ELEMENT_ID"]) <= 0) { $arFilter = array("WF_PARENT_ELEMENT_ID" => $res["ID"], "SHOW_HISTORY" => "Y"); $db_rs = CIBlockElement::GetList(array("ID" => "ASC"), $arFilter); if ($db_rs && ($rs = $db_rs->Fetch())) { $res["CHILDREN"] = array(); do { if ($rs["IBLOCK_SECTION_ID"] == $trashID) { continue; } $rs["SHOW"] = array(); $rs["PERMISSION"] = "R"; $rs["DOCUMENT_ID"] = $res["DOCUMENT_ID"]; $rs["DOCUMENT_ID"][2] = $rs["ID"]; $rs["~arDocumentStates"] = CBPDocument::GetDocumentStates($this->wfParams["DOCUMENT_TYPE"], $rs["DOCUMENT_ID"]); $USER_GROUPS = $this->USER["GROUPS"]; if ($rs["CREATED_BY"] == $GLOBALS["USER"]->GetID()) { $USER_GROUPS[] = "Author"; } if (!CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::ReadDocument, $GLOBALS["USER"]->GetID(), $rs["DOCUMENT_ID"], array("DocumentType" => $this->wfParams["DOCUMENT_TYPE"], "IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $USER_GROUPS, "DocumentStates" => $rs["~arDocumentStates"]))) { continue; } if (CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::WriteDocument, $GLOBALS["USER"]->GetID(), $rs["DOCUMENT_ID"], array("DocumentType" => $this->wfParams["DOCUMENT_TYPE"], "IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $USER_GROUPS, "DocumentStates" => $rs["~arDocumentStates"]))) { $rs["PERMISSION"] = "W"; } $rs["arDocumentStates"] = array(); foreach ($rs["~arDocumentStates"] as $key => $arDocumentState) { if (CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::ViewWorkflow, $GLOBALS["USER"]->GetID(), $rs["DOCUMENT_ID"], array("DocumentType" => $this->wfParams["DOCUMENT_TYPE"], "IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $USER_GROUPS, "DocumentStates" => $rs["~arDocumentStates"], "WorkflowId" => $key))) { $rs["arDocumentStates"][$key] = $arDocumentState; $rs["PERMISSION"] = empty($rs["PERMISSION"]) ? "U" : $rs["PERMISSION"]; } } if ($rs["PERMISSION"] >= "U") { if (CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::StartWorkflow, $USER->GetID(), $rs["DOCUMENT_ID"], array("IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $USER_GROUPS, "DocumentStates" => $rs["~arDocumentStates"]))) { $rs["SHOW"]["BP_START"] = "Y"; } $rs["SHOW"]["BP_VIEW"] = !empty($rs["arDocumentStates"]) ? "Y" : "N"; $rs["SHOW"]["EDIT"] = $rs["PERMISSION"] >= "W" ? "Y" : "N"; $rs["SHOW"]["BP"] = $rs["SHOW"]["BP_VIEW"] == "Y" || $rs["SHOW"]["BP_START"] == "Y" ? "Y" : "N"; $rs["SHOW"]["EDIT"] = $rs["PERMISSION"] >= "W" && intVal($rs["WF_PARENT_ELEMENT_ID"]) > 0 || $this->permission >= "W" ? "Y" : "N"; if ($rs["BP_LOCK_STATUS"] == "red") { $rs["SHOW"]["UNLOCK"] = CBPDocument::IsAdmin() ? "Y" : "N"; $rs["SHOW"]["EDIT"] = "N"; } elseif ($rs["LOCK_STATUS"] == "red" && $this->permission > "U") { $rs["SHOW"]["UNLOCK"] = "Y"; $rs["SHOW"]["EDIT"] = "N"; } elseif ($this->check_creator && $rs["CREATED_BY"] != $GLOBALS["USER"]->GetId()) { $rs["SHOW"]["UNLOCK"] = "N"; $rs["SHOW"]["LOCK"] = "N"; $rs["SHOW"]["DELETE"] = "N"; $rs["SHOW"]["EDIT"] = "N"; } else { $rs["SHOW"]["UNLOCK"] = $rs['LOCK_STATUS'] == "yellow" ? "Y" : "N"; $rs["SHOW"]["LOCK"] = $rs['LOCK_STATUS'] == "green" ? "Y" : "N"; $rs["SHOW"]["DELETE"] = $rs["SHOW"]["HISTORY"] = $rs["PERMISSION"] > "U" ? "Y" : "N"; } } $res["CHILDREN"][$rs["ID"]] = $rs; } while ($rs = $db_rs->Fetch()); } } if (CBPDocument::CanUserOperateDocument(CBPCanUserOperateOperation::StartWorkflow, $USER->GetID(), $res["DOCUMENT_ID"], array("IBlockId" => $this->IBLOCK_ID, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $res["USER_GROUPS"], "DocumentStates" => $res["~arDocumentStates"]))) { $res["SHOW"]["BP_START"] = "Y"; } $res["SHOW"]["BP_VIEW"] = !empty($res["arDocumentStates"]) ? "Y" : "N"; if ($this->workflow == 'bizproc') { $res["SHOW"]["BP_VERSIONS"] = intVal($res["WF_PARENT_ELEMENT_ID"]) <= 0 ? "Y" : "N"; $res["SHOW"]["BP_CLONE"] = intVal($res["WF_PARENT_ELEMENT_ID"]) <= 0 ? "Y" : "N"; $res["SHOW"]["COPY"] = intVal($res["WF_PARENT_ELEMENT_ID"]) <= 0 ? "Y" : "N"; } else { $res["SHOW"]["BP_VERSIONS"] = $res["SHOW"]["BP_CLONE"] = $res["SHOW"]["COPY"] = 'N'; } if ($this->CheckRight($res['PERMISSION'], 'element_edit_any_wf_status') < "W" && intVal($res["WF_PARENT_ELEMENT_ID"]) <= 0 || $res["WF_PARENT_ELEMENT_ID"] == $res["ID"]) { $arDocumentStates = CBPDocument::GetDocumentStates($this->wfParams["DOCUMENT_TYPE"], null); if (!empty($arDocumentStates)) { CBPDocument::CanUserOperateDocumentType(CBPCanUserOperateOperation::WriteDocument, $GLOBALS["USER"]->GetID(), $this->wfParams["DOCUMENT_TYPE"], array("IBlockId" => $this->IBLOCK_ID, "IBlockPermission" => $this->permission, "UserGroups" => $this->USER["GROUPS"], "AllUserGroups" => $res["USER_GROUPS"], "DocumentStates" => $arDocumentStates)); } else { $res["SHOW"]["BP_CLONE"] = "N"; } } $res["SHOW"]["BP"] = $res["SHOW"]["BP_VIEW"] == "Y" || $res["SHOW"]["BP_START"] == "Y" ? "Y" : "N"; $res["SHOW"]["EDIT"] = $this->CheckRight($res["PERMISSION"], "element_edit_any_wf_status") >= "W" ? "Y" : "N"; if ($res["LOCK_STATUS"] == "red") { $res["SHOW"]["UNLOCK"] = CBPDocument::IsAdmin() || $this->CheckRight($res['PERMISSION'], "element_edit") > "W" ? "Y" : "N"; $res["SHOW"]["LOCK"] = "N"; $res["SHOW"]["HISTORY"] = $this->CheckRight($res['PERMISSION'], 'element_edit') > "U" ? "Y" : "N"; $res["SHOW"]["DELETE"] = "N"; $res["SHOW"]["EDIT"] = "N"; } elseif ($this->InTrash($res)) { $bRightsEdit_gt_W = $this->CheckRight($res['PERMISSION'], 'element_rights_edit') > "W"; $res["SHOW"]["EDIT"] = $bRightsEdit_gt_W ? "Y" : "N"; $res["SHOW"]["HISTORY"] = $bRightsEdit_gt_W ? "Y" : "N"; $res["SHOW"]["DELETE"] = $bRightsEdit_gt_W ? "Y" : "N"; $res["SHOW"]["UNLOCK"] = "N"; $res["SHOW"]["LOCK"] = "N"; $res["SHOW"]["BP_START"] = "N"; $res["SHOW"]["BP_VIEW"] = $bRightsEdit_gt_W ? "Y" : "N"; $res["SHOW"]["BP_VERSIONS"] = $bRightsEdit_gt_W ? "Y" : "N"; $res["SHOW"]["BP_CLONE"] = $bRightsEdit_gt_W ? "Y" : "N"; $res["SHOW"]["COPY"] = intVal($res["WF_PARENT_ELEMENT_ID"]) <= 0 ? "Y" : "N"; } elseif ($this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId()) { $res["SHOW"]["UNLOCK"] = "N"; $res["SHOW"]["LOCK"] = "N"; $res["SHOW"]["DELETE"] = "N"; $res["SHOW"]["EDIT"] = "N"; } else { $bElementEdit_gt_U = $this->CheckRight($res['PERMISSION'], 'element_rights_edit') > 'U'; $res["SHOW"]["HISTORY"] = $bElementEdit_gt_U ? "Y" : "N"; $res["SHOW"]["DELETE"] = $bElementEdit_gt_U ? "Y" : "N"; $res["SHOW"]["UNLOCK"] = $bElementEdit_gt_U && $res["LOCK_STATUS"] == "yellow" ? "Y" : "N"; $res["SHOW"]["LOCK"] = $bElementEdit_gt_U && $res["LOCK_STATUS"] == "green" ? "Y" : "N"; } if ($arBPParamRequired[$this->IBLOCK_ID]) { $res["SHOW"]["COPY"] = "N"; } } } else { $res["SHOW"]["UNLOCK"] = $res['LOCK_STATUS'] == "yellow" || $res['LOCK_STATUS'] == "red" && $res["PERMISSION"] > 'W' ? "Y" : "N"; $res["SHOW"]["LOCK"] = $res['LOCK_STATUS'] == "green" ? "Y" : "N"; $res["SHOW"]["COPY"] = "Y"; $res["SHOW"]["HISTORY"] = $res["SHOW"]["DELETE"] = $res["SHOW"]["EDIT"] = $this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId() ? "N" : "Y"; $res["SHOW"]["HISTORY"] = $res["SHOW"]["HISTORY"] == "Y" && $this->workflow == "bizproc_limited" ? "Y" : "N"; if ($this->check_creator && $res["CREATED_BY"] != $GLOBALS["USER"]->GetId()) { $res["SHOW"]["UNLOCK"] = "N"; $res["SHOW"]["LOCK"] = "N"; $res["SHOW"]["DELETE"] = "N"; $res["SHOW"]["EDIT"] = "N"; } elseif ($res["LOCK_STATUS"] == "red" && $res["PERMISSION"] < 'X') { $res["SHOW"]["DELETE"] = "N"; $res["SHOW"]["EDIT"] = "N"; } if ($this->e_rights) { $arShow = array("COPY" => "element_edit", "DELETE" => "element_delete", "UNDELETE" => "element_no_prems", "EDIT" => "element_edit", "HISTORY" => "element_edit", "LOCK" => "element_edit", "UNLOCK" => "element_edit", "RIGHTS" => "element_rights_edit"); $bInTrash = $this->InTrash($res); foreach ($arShow as $action => $right) { if ($res['LOCK_STATUS'] == 'red' || $bInTrash) { $right = "element_rights_edit"; } if (!isset($res['E_RIGHTS'][$right])) { $res['SHOW'][$action] = 'N'; } } } } } else { $res["PERMISSION"] = $res["WF_NEW"] == "Y" || intVal($res["WF_PARENT_ELEMENT_ID"]) > 0 && $res["WF_PARENT_ELEMENT_ID"] != $res['ID'] ? "D" : $this->permission; if ($res["PERMISSION"] > "D" && $this->workflow == "bizproc") { $res["PERMISSION"] = $res["BP_PUBLISHED"] == "Y" ? $this->permission : "D"; } } $res["SHOW"]["UNDELETE"] = "N"; $secPath = "/" . implode("/", $this->GetNavChain(array("section_id" => $res["IBLOCK_SECTION_ID"]), false)); $res["SECTION_PATH"] = str_replace("//", "/", $secPath); $res["PATH"] = str_replace("//", "/", $secPath . "/" . $res["~NAME"]); $arFiles[$res["ID"]] = $res; } else { $res = array_merge($res, $arFiles[$res["ID"]]); } if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') { $info["path"] = $res['PATH']; $info["path"] = SITE_CHARSET != "UTF-8" ? $GLOBALS["APPLICATION"]->ConvertCharset($info["path"], SITE_CHARSET, "UTF-8") : $info["path"]; $info["props"] = array(); $info["props"][] = array('ns' => 'DAV:', 'name' => "creationdate", 'val' => isset($res["DATE_CREATE_UNIX"]) ? $res["DATE_CREATE_UNIX"] : MakeTimeStamp($res["DATE_CREATE"])); $info["props"][] = array('ns' => 'DAV:', 'name' => "getlastmodified", 'val' => isset($res["TIMESTAMP_X_UNIX"]) ? $res["TIMESTAMP_X_UNIX"] : MakeTimeStamp($res["TIMESTAMP_X"])); $info["props"][] = array('ns' => 'DAV:', 'name' => "creationdate", 'val' => MakeTimeStamp($res["DATE_CREATE"])); $info["props"][] = array('ns' => 'DAV:', 'name' => "getlastmodified", 'val' => MakeTimeStamp($res["TIMESTAMP_X"])); $info["props"][] = array('ns' => 'DAV:', 'name' => "getcontenttype", 'val' => $res["FILE"]["CONTENT_TYPE"]); $info["props"][] = array('ns' => 'DAV:', 'name' => "getcontentlength", 'val' => $res["FILE"]["FILE_SIZE"]); $info["props"][] = array('ns' => 'DAV:', 'name' => "isreadonly", 'val' => $res["PERMISSION"] >= "W" ? "false" : "true"); $info["props"][] = array('ns' => 'DAV:', 'name' => "ishidden", 'val' => $res["ACTIVE"] == "Y" ? "false" : "true"); $info["props"][] = array('ns' => 'DAV:', 'name' => "iscollection", 'val' => 0); $info["props"][] = array('ns' => 'DAV:', 'name' => "resourcetype", 'val' => ''); // required by RFC && LibreOffice $info["props"][] = $this->_get_lock_prop(); } if ($this->InTrash($res)) { if ($this->workflow != "bizproc") { $res["SHOW"]["EDIT"] = "N"; $res["SHOW"]["LOCK"] = "N"; $res["SHOW"]["UNLOCK"] = "N"; $bAdmin = false; if ($GLOBALS['USER']->CanDoOperation('webdav_change_settings')) { $bAdmin = true; } elseif ($this->e_rights && isset($res['E_RIGHTS']['element_rights_edit'])) { $bAdmin = true; } elseif (!$this->e_rights && $this->permission > "W") { $bAdmin = true; } $res["SHOW"]["DELETE"] = $bAdmin ? "Y" : "N"; $res["SHOW"]["UNDELETE"] = $bAdmin ? "Y" : "N"; } } if ($this->_parse_webdav_info($res)) { if (is_array($res["PROPS"])) { foreach ($res["PROPS"] as $ns_name => $ns_props) { foreach ($ns_props as $prop_name => $prop_val) { if (is_scalar($prop_val)) { if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') { $info["props"][] = CWebDavBase::_mkprop($ns_name, $prop_name, $prop_val); } } } } } } return $info; }
public static function GetList(&$by, &$order, $arFilter=Array(), &$is_filtered) { $err_mess = (CWorkflow::err_mess())."<br>Function: GetList<br>Line: "; global $DB, $USER, $APPLICATION; $arSqlSearch = Array(); $strSqlSearch = ""; $MAX_LOCK = intval(COption::GetOptionString("workflow","MAX_LOCK_TIME","60")); $arGroups = $USER->GetUserGroupArray(); if (!is_array($arGroups)) $arGroups[] = 2; $groups = implode(",",$arGroups); $uid = intval($USER->GetID()); if (is_array($arFilter)) { $filter_keys = array_keys($arFilter); for ($i=0; $i<count($filter_keys); $i++) { $key = $filter_keys[$i]; $val = $arFilter[$filter_keys[$i]]; if (strlen($val)<=0 || "$val"=="NOT_REF") continue; if (is_array($val) && count($val)<=0) continue; $match_value_set = (in_array($key."_EXACT_MATCH", $filter_keys)) ? true : false; $key = strtoupper($key); switch($key) { case "ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("D.ID",$val,$match); break; case "DATE_MODIFY_1": if (CheckDateTime($val)) $arSqlSearch[] = "D.DATE_MODIFY >= ".$DB->CharToDateFunction($val, "SHORT"); break; case "DATE_MODIFY_2": if (CheckDateTime($val)) $arSqlSearch[] = "D.DATE_MODIFY < ".$DB->CharToDateFunction($val, "SHORT")." + INTERVAL 1 DAY"; break; case "MODIFIED_BY": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.MODIFIED_BY, UM.LOGIN, UM.NAME, UM.LAST_NAME", $val, $match); break; case "MODIFIED_USER_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("D.MODIFIED_BY",$val,$match); break; case "LOCK_STATUS": $arSqlSearch[] = " if (D.DATE_LOCK is null, 'green', if(DATE_ADD(D.DATE_LOCK, interval $MAX_LOCK MINUTE)<now(), 'green', if(D.LOCKED_BY=$uid, 'yellow', 'red'))) = '".$DB->ForSql($val)."'"; break; case "STATUS": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.STATUS_ID, S.TITLE",$val,$match); break; case "STATUS_ID": $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("D.STATUS_ID",$val,$match); break; case "SITE_ID": case "TITLE": case "BODY": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.".$key,$val,$match); break; case "FILENAME": $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("D.FILENAME",$val,$match, array("/", "\\", ".", "_")); break; } } } if ($by == "s_id") $strSqlOrder = "ORDER BY D.ID"; elseif ($by == "s_lock_status") $strSqlOrder = "ORDER BY LOCK_STATUS"; elseif ($by == "s_date_modify") $strSqlOrder = "ORDER BY D.DATE_MODIFY"; elseif ($by == "s_modified_by") $strSqlOrder = "ORDER BY D.MODIFIED_BY"; elseif ($by == "s_filename") $strSqlOrder = "ORDER BY D.FILENAME"; elseif ($by == "s_title") $strSqlOrder = "ORDER BY D.TITLE"; elseif ($by == "s_site_id") $strSqlOrder = "ORDER BY D.SITE_ID"; elseif ($by == "s_status") $strSqlOrder = "ORDER BY D.STATUS_ID"; else { $by = "s_date_modify"; $strSqlOrder = "ORDER BY D.DATE_MODIFY"; } if ($order!="asc") { $strSqlOrder .= " desc "; $order="desc"; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); if (CWorkflow::IsAdmin()) { $strSql = " SELECT DISTINCT D.*, ".$DB->DateToCharFunction("D.DATE_ENTER")." DATE_ENTER, ".$DB->DateToCharFunction("D.DATE_MODIFY")." DATE_MODIFY, ".$DB->DateToCharFunction("D.DATE_LOCK")." DATE_LOCK, concat('(',UM.LOGIN,') ',ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,'')) MUSER_NAME, concat('(',UE.LOGIN,') ',ifnull(UE.NAME,''),' ',ifnull(UE.LAST_NAME,'')) EUSER_NAME, S.TITLE STATUS_TITLE, if (D.DATE_LOCK is null, 'green', if(DATE_ADD(D.DATE_LOCK, interval $MAX_LOCK MINUTE)<now(), 'green', if(D.LOCKED_BY=$uid, 'yellow', 'red'))) LOCK_STATUS FROM b_workflow_document D LEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID) LEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY) LEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY) WHERE $strSqlSearch $strSqlOrder "; } else { $strSql = " SELECT DISTINCT D.*, ".$DB->DateToCharFunction("D.DATE_ENTER")." DATE_ENTER, ".$DB->DateToCharFunction("D.DATE_MODIFY")." DATE_MODIFY, ".$DB->DateToCharFunction("D.DATE_LOCK")." DATE_LOCK, concat('(',UM.LOGIN,') ',ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,'')) MUSER_NAME, concat('(',UE.LOGIN,') ',ifnull(UE.NAME,''),' ',ifnull(UE.LAST_NAME,'')) EUSER_NAME, S.TITLE STATUS_TITLE, if (D.DATE_LOCK is null, 'green', if(DATE_ADD(D.DATE_LOCK, interval $MAX_LOCK MINUTE)<now(), 'green', if(D.LOCKED_BY=$uid, 'yellow', 'red'))) LOCK_STATUS FROM b_workflow_document D INNER JOIN b_workflow_status2group G ON (G.STATUS_ID = D.STATUS_ID) LEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID) LEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY) LEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY) WHERE $strSqlSearch and G.GROUP_ID in ($groups) and G.PERMISSION_TYPE >= '2' $strSqlOrder "; } //echo "<pre>".$strSql."</pre>"; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); $is_filtered = (IsFiltered($strSqlSearch)); $arr = array(); while($ar=$rs->Fetch()) { if($USER->CanDoFileOperation('fm_edit_in_workflow', Array($ar["SITE_ID"], $ar["FILENAME"]))) $arr[] = $ar; } $rs = new CDBResult; $rs->InitFromArray($arr); return $rs; }
<?php } ?> </select> </li> <?php if (!in_array(2, $arResult["WF_STATUSES_PERMISSION"])) { ?> <li class="wd-upload-form-propety"> <span class="comments"><?php echo GetMessage("WD_WF_ATTENTION1"); ?> </span> </li> <?php } elseif (!CWorkflow::IsAdmin()) { $arr = array(); foreach ($arResult["WF_STATUSES_PERMISSION"] as $key => $val) { if ($val == 2) { $arr[] = htmlspecialcharsEx($arResult["WF_STATUSES"][$key]); } } ?> <li class="wd-upload-form-propety"> <span class="comments"><?php echo count($arr) == 1 ? str_replace("#STATUS#", $arr[0], GetMessage("WD_WF_ATTENTION2")) : str_replace("#STATUS#", $arr[0], GetMessage("WD_WF_ATTENTION3")); ?> </span> </li><?php } } elseif ($arParams["USE_BIZPROC"] == "Y") {
$res["FILE_EXTENTION"] = strtolower(strrchr($res['NAME'], '.')); $res["~WF_STATUS_TITLE"] = CIBlockElement::WF_GetStatusTitle($res["WF_STATUS_ID"]); $res["WF_STATUS_TITLE"] = htmlspecialcharsEx($res["~WF_STATUS_TITLE"]); /************** Paths **********************************************/ $res["URL"] = array("DOWNLOAD" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_HISTORY_GET_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "~DOWNLOAD" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_HISTORY_GET_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "VIEW" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "~VIEW" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "EDIT" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "EDIT")), "~EDIT" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "EDIT")), "DELETE" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "DELETE")), "~DELETE" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "DELETE"))); $res["URL"]["DELETE"] = WDAddPageParams($res["URL"]["DELETE"], array("edit" => "y", "sessid" => bitrix_sessid(), 'back_url' => urlencode($APPLICATION->GetCurPageParam()))); $res["URL"]["~DELETE"] = WDAddPageParams($res["URL"]["~DELETE"], array("edit" => "y", "sessid" => bitrix_sessid(), 'back_url' => urlencode($APPLICATION->GetCurPageParam()))); /************** Permission *****************************************/ $arResult["ELEMENT"] = $res; $arResult["ELEMENT"]["PERMISSION"] = CIBlockDocumentWebdav::GetIBRights('ELEMENT', $arParams["IBLOCK_ID"], $arParams["ELEMENT_ID"]); if (CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_read") < "R") { ShowError(GetMessage("WD_ACCESS_DENIED")); return 0; } $res = array("UNLOCK" => "N", "EDIT" => CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_edit") >= "W" ? "Y" : "N", "DELETE" => CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_edit") >= "W" ? "Y" : "N", "HISTORY" => "Y"); if ($arResult["ELEMENT"]["LOCK_STATUS"] == "yellow" || $arResult["ELEMENT"]["LOCK_STATUS"] == "red" && (CWorkflow::IsAdmin() || $USER->CanDoOperation('webdav_change_settings'))) { $res["UNLOCK"] = "Y"; } if ($arResult["ELEMENT"]["LOCK_STATUS"] == "red") { $res["EDIT"] = "N"; } elseif (CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_bizproc_start") == "U") { $res["EDIT"] = $arResult["ELEMENT"]["WF_STATUS_ID"] > 1 && $arResult["WF_STATUSES_PERMISSION"][$arResult["ELEMENT"]["WF_STATUS_ID"]] < 2 ? "N" : "Y"; } $arResult["ELEMENT"]["SHOW"] = $res; /************** Last element ***************************************/ $arResult["ELEMENT"]["LAST"] = $arResult["ELEMENT"]; $LAST_ID = CIBlockElement::WF_GetLast($arResult["ELEMENT"]["ID"]); if ($LAST_ID != $arResult["ELEMENT"]["ID"]) { $db_res = CIBlockElement::GetByID($LAST_ID); if ($db_res && ($res = $db_res->Fetch())) { $arResult["ELEMENT"]["LAST"] = $res;
$row =& $lAdmin->AddRow($f_ID, $arRes); if (CWorkflow::IsHaveEditRights($f_DOCUMENT_ID) && $f_DOCUMENT_ID > 0) { $row->AddViewField("DOCUMENT_ID", '<a href="workflow_edit.php?lang=' . LANG . '&ID=' . $f_DOCUMENT_ID . '">' . $f_DOCUMENT_ID . '</a>'); } $row->AddViewField("MODIFIED_BY", '[<a title="' . GetMessage("FLOW_USER_ALT") . '" href="user_edit.php?ID=' . $f_MODIFIED_BY . '&lang=' . LANG . '">' . $f_MODIFIED_BY . '</a>] ' . $f_USER_NAME); $row->AddViewField("FILENAME", '<a href="' . $f_FILENAME . '">' . TruncateText($f_FILENAME, 45) . '</a>'); $row->AddViewField("STATUS_ID", '[<a title="' . GetMessage("FLOW_STATUS_ALT") . '" href="workflow_status_edit.php?ID=' . $f_STATUS_ID . '&lang=' . LANG . '">' . $f_STATUS_ID . '</a>] ' . $f_STATUS_TITLE); $arActions = array(array("ICON" => "view", "DEFAULT" => "Y", "TEXT" => GetMessage("FLOW_VIEW"), "ACTION" => $lAdmin->ActionRedirect("workflow_history_view.php?lang=" . LANG . "&ID=" . $f_ID))); if ($WORKFLOW_RIGHT > "R" && CWorkflow::IsAdmin()) { $arActions[] = array("SEPARATOR" => true); $arActions[] = array("ICON" => "delete", "TEXT" => GetMessage("FLOW_DELETE"), "ACTION" => "if(confirm('" . GetMessage('FLOW_DELETE_CONFIRM') . "')) " . $lAdmin->ActionDoGroup($f_ID, "delete")); } $row->AddActions($arActions); } $lAdmin->AddFooter(array(array("title" => GetMessage("MAIN_ADMIN_LIST_SELECTED"), "value" => $rsData->SelectedRowsCount()), array("counter" => true, "title" => GetMessage("MAIN_ADMIN_LIST_CHECKED"), "value" => "0"))); if ($WORKFLOW_RIGHT > "R" && CWorkflow::IsAdmin()) { $lAdmin->AddGroupActionTable(array("delete" => GetMessage("MAIN_ADMIN_LIST_DELETE"), array("action" => "Diff()", "value" => "compare", "type" => "button", "name" => GetMessage("FLOW_COMPARE")))); } $aMenu = array(array("ICON" => "btn_list", "TEXT" => GetMessage("FLOW_RECORDS_LIST"), "LINK" => "workflow_list.php?lang=" . LANGUAGE_ID, "TITLE" => GetMessage("FLOW_RECORDS_LIST"))); $lAdmin->AddAdminContextMenu($aMenu); $lAdmin->CheckListMode(); $APPLICATION->SetTitle(GetMessage("FLOW_PAGE_TITLE")); require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; ?> <script> function Diff() { var selection = new Array(); var j = 0;
public static function GetEditLink($FILENAME, &$status_id, &$status_title, $template = "", $lang = LANGUAGE_ID, $return_url = "") { $err_mess = CAllWorkflow::err_mess() . "<br>Function: GetEditLink<br>Line: "; global $DB, $APPLICATION, $USER; $link = ''; CMain::InitPathVars($SITE_ID, $FILENAME); if ($USER->CanDoFileOperation('fm_edit_in_workflow', array($SITE_ID, $FILENAME))) { //Check if user have access at least to one status if (!CWorkflow::IsAdmin()) { $arGroups = $USER->GetUserGroupArray(); if (!is_array($arGroups)) { $arGroups = array(2); } $arFilter = array("GROUP_ID" => $arGroups, "PERMISSION_TYPE_1" => 1); $rsStatuses = CWorkflowStatus::GetList($by = "s_c_sort", $strOrder, $arFilter, $is_filtered, array("ID")); if (!$rsStatuses->Fetch()) { return ""; } } $link = "/bitrix/admin/workflow_edit.php?lang=" . $lang . "&site=" . $SITE_ID . "&fname=" . $FILENAME; if (strlen($template) > 0) { $link .= "&template=" . urlencode($template); } if (strlen($return_url) > 0) { $link .= "&return_url=" . urlencode($return_url); } $z = CWorkflow::GetByFilename($FILENAME, $SITE_ID); if ($zr = $z->Fetch()) { $status_id = $zr["STATUS_ID"]; $status_title = $zr["STATUS_TITLE"]; if ($status_id != 1) { $DOCUMENT_ID = $zr["ID"]; if (CWorkflow::IsHaveEditRights($DOCUMENT_ID)) { $link .= "&ID=" . $DOCUMENT_ID; } else { return ""; } } } } return $link; }
if ($f_LOCK_STATUS == "green") { $lamp_alt = GetMessage("FLOW_GREEN_ALT"); } elseif ($f_LOCK_STATUS == "yellow") { $lamp_alt = GetMessage("FLOW_YELLOW_ALT"); } else { $lamp_alt = GetMessage("FLOW_RED_ALT"); } $str = '<div class="lamp-' . $f_LOCK_STATUS . '" title="' . $lamp_alt . '"></div>'; $row->AddViewField("LOCK_STATUS", $str); $row->AddViewField("FILENAME", '<a href="' . $f_FILENAME . '">' . $f_FILENAME . '</a>'); $row->AddSelectField("STATUS_ID", $arStatus); $str = '[<a href="user_edit.php?ID=' . $f_MODIFIED_BY . '&lang=' . LANG . '">' . $f_MODIFIED_BY . '</a>] ' . $f_MUSER_NAME; $row->AddViewField("MODIFIED_BY", $str); $arActions = array(); if ($f_LOCK_STATUS != "green") { if (CWorkflow::IsAdmin() || $f_LOCKED_BY == $USER->GetID()) { $arActions[] = array("ICON" => "unlock", "TEXT" => GetMessage("FLOW_UNLOCK"), "ACTION" => "if(confirm('" . GetMessage('FLOW_UNLOCK_CONFIRM') . "')) " . $lAdmin->ActionDoGroup($f_ID, "unlock")); $arActions[] = array("SEPARATOR" => true); } } if ($f_STATUS_ID != 1) { $arActions[] = array("DEFAULT" => "Y", "ICON" => "edit", "TEXT" => GetMessage("FLOW_EDIT"), "ACTION" => $lAdmin->ActionRedirect("workflow_edit.php?lang=" . LANG . "&ID=" . $f_ID)); } else { $arActions[] = array("ICON" => "view", "TEXT" => GetMessage("FLOW_VIEW"), "ACTION" => $lAdmin->ActionRedirect("workflow_edit.php?lang=" . LANG . "&ID=" . $f_ID)); } if ($f_STATUS_ID != 1) { $arActions[] = array("ICON" => "view", "TEXT" => GetMessage("FLOW_PREVIEW"), "ACTION" => $lAdmin->ActionRedirect("workflow_preview.php?lang=" . LANG . "&ID=" . $f_ID . "&" . bitrix_sessid_get())); } $arActions[] = array("ICON" => "view", "TEXT" => GetMessage("FLOW_HISTORY"), "ACTION" => $lAdmin->ActionRedirect("workflow_history_list.php?lang=" . LANG . "&find_document_id=" . $f_ID . "&find_document_id_exact_match=Y&set_filter=Y")); $arActions[] = array("ICON" => "view", "TEXT" => GetMessage("FLOW_HISTORY_FILE"), "ACTION" => $lAdmin->ActionRedirect("workflow_history_list.php?lang=" . LANG . "&find_filename=" . $f_FILENAME . "&find_filename_exact_match=Y&set_filter=Y")); if ($f_LOCK_STATUS != "red" && $WORKFLOW_RIGHT > "R") {