static function CanUserOperateDocumentType($operation, $userId, $documentType, $parameters = array())
{
$documentType = trim($documentType);
if ($documentType == '')
return false;
if (self::isAdmin())
{
return true;
}
if(is_numeric($documentType))
$parameters["IBlockId"] = intval($documentType);
else
$parameters["IBlockId"] = intval(mb_substr($documentType, mb_strlen("iblock_")));
$parameters['sectionId'] = !empty($parameters['sectionId']) ? (int)$parameters['sectionId'] : 0;
if (!array_key_exists("IBlockRightsMode", $parameters))
$parameters["IBlockRightsMode"] = CIBlock::getArrayByID($parameters["IBlockId"], "RIGHTS_MODE");
if ($parameters["IBlockRightsMode"] === "E")
{
if ($operation === CBPCanUserOperateOperation::CreateWorkflow)
return CIBlockRights::userHasRightTo($parameters["IBlockId"], $parameters["IBlockId"], "iblock_rights_edit");
elseif ($operation === CBPCanUserOperateOperation::WriteDocument)
return CIBlockSectionRights::userHasRightTo($parameters["IBlockId"], $parameters["sectionId"], "section_element_bind");
elseif ($operation === CBPCanUserOperateOperation::ViewWorkflow
|| $operation === CBPCanUserOperateOperation::StartWorkflow)
{
if ($operation === CBPCanUserOperateOperation::ViewWorkflow)
{
return (
CIBlockRights::userHasRightTo($parameters["IBlockId"], 0, "element_read")
|| CIBlockRights::userHasRightTo($parameters["IBlockId"], $parameters["IBlockId"], "iblock_rights_edit")
);
}
if ($operation === CBPCanUserOperateOperation::StartWorkflow)
return CIBlockSectionRights::userHasRightTo($parameters["IBlockId"], $parameters['sectionId'], "section_element_bind");
$userId = intval($userId);
if (!array_key_exists("AllUserGroups", $parameters))
{
if (!array_key_exists("UserGroups", $parameters))
$parameters["UserGroups"] = CUser::getUserGroup($userId);
$parameters["AllUserGroups"] = $parameters["UserGroups"];
$parameters["AllUserGroups"][] = "Author";
}
if (!array_key_exists("DocumentStates", $parameters))
{
if ($operation === CBPCanUserOperateOperation::StartWorkflow)
$parameters["DocumentStates"] = CBPWorkflowTemplateLoader::getDocumentTypeStates(array("lists", get_called_class(), "iblock_".$parameters["IBlockId"]));
else
$parameters["DocumentStates"] = CBPDocument::getDocumentStates(
array("lists", get_called_class(), "iblock_".$parameters["IBlockId"]),
null
);
}
if (array_key_exists($parameters["WorkflowId"], $parameters["DocumentStates"]))
$parameters["DocumentStates"] = array($parameters["WorkflowId"] => $parameters["DocumentStates"][$parameters["WorkflowId"]]);
else
return false;
$allowableOperations = CBPDocument::getAllowableOperations(
$userId,
$parameters["AllUserGroups"],
$parameters["DocumentStates"],
true
);
if (!is_array($allowableOperations))
return false;
if (($operation === CBPCanUserOperateOperation::ViewWorkflow) && in_array("read", $allowableOperations)
|| ($operation === CBPCanUserOperateOperation::StartWorkflow) && in_array("write", $allowableOperations))
return true;
$chop = ($operation === CBPCanUserOperateOperation::ViewWorkflow) ? "element_read" : "section_element_bind";
$tasks = self::getRightsTasks();
foreach ($allowableOperations as $op)
{
if (isset($tasks[$op]))
$op = $tasks[$op]['ID'];
$ar = CTask::getOperations($op, true);
if (in_array($chop, $ar))
return true;
}
}
return false;
}
if (!array_key_exists("IBlockPermission", $parameters))
{
if(CModule::includeModule('lists'))
$parameters["IBlockPermission"] = CLists::getIBlockPermission($parameters["IBlockId"], $userId);
else
$parameters["IBlockPermission"] = CIBlock::getPermission($parameters["IBlockId"], $userId);
}
if ($parameters["IBlockPermission"] <= "R")
return false;
elseif ($parameters["IBlockPermission"] >= "W")
return true;
$userId = intval($userId);
if (!array_key_exists("AllUserGroups", $parameters))
{
if (!array_key_exists("UserGroups", $parameters))
$parameters["UserGroups"] = CUser::getUserGroup($userId);
$parameters["AllUserGroups"] = $parameters["UserGroups"];
$parameters["AllUserGroups"][] = "Author";
}
if (!array_key_exists("DocumentStates", $parameters))
{
$parameters["DocumentStates"] = CBPDocument::getDocumentStates(
array("lists", get_called_class(), "iblock_".$parameters["IBlockId"]),
null
);
}
if (array_key_exists("WorkflowId", $parameters))
{
if (array_key_exists($parameters["WorkflowId"], $parameters["DocumentStates"]))
$parameters["DocumentStates"] = array($parameters["WorkflowId"] => $parameters["DocumentStates"][$parameters["WorkflowId"]]);
else
return false;
}
$allowableOperations = CBPDocument::getAllowableOperations(
$userId,
$parameters["AllUserGroups"],
$parameters["DocumentStates"]
);
if (!is_array($allowableOperations))
return false;
$r = false;
switch ($operation)
{
case CBPCanUserOperateOperation::ViewWorkflow:
$r = in_array("read", $allowableOperations);
break;
case CBPCanUserOperateOperation::StartWorkflow:
$r = in_array("write", $allowableOperations);
break;
case CBPCanUserOperateOperation::CreateWorkflow:
$r = in_array("write", $allowableOperations);
break;
case CBPCanUserOperateOperation::WriteDocument:
$r = in_array("write", $allowableOperations);
break;
case CBPCanUserOperateOperation::ReadDocument:
$r = false;
break;
default:
$r = false;
}
return $r;
}