workflowutil.inc.php
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 886 行 · 第 1/3 页
PHP
886 行
$aOptions = array('noid' => true);
foreach ($aActions as $sAction) {
$res = DBUtil::autoInsert($sTable, array(
'state_id' => $iStateId,
'action_name' => $sAction,
), $aOptions);
if (PEAR::isError($res)) {
return $res;
}
}
return;
}
// }}}
function setDisabledActionsForState($oState, $aActions) {
$iStateId = KTUtil::getId($oState);
$sTable = KTUtil::getTableName('workflow_state_disabled_actions');
$aQuery = array(
"DELETE FROM $sTable WHERE state_id = ?",
array($iStateId),
);
$res = DBUtil::runQuery($aQuery);
if (PEAR::isError($res)) {
return $res;
}
if(!is_array($aActions)) return;
$aOptions = array('noid' => true);
foreach ($aActions as $sAction) {
$res = DBUtil::autoInsert($sTable, array(
'state_id' => $iStateId,
'action_name' => $sAction,
), $aOptions);
if (PEAR::isError($res)) {
return $res;
}
}
return;
}
// {{{ getEnabledActionsForState
/**
* Gets the actions that are enabled by this workflow state.
*
* A controlled action is one that can be enabled or disabled by a
* workflow state attached to this workflow. This allows for
* actions such as "Delete" to not be allowed to occur during the
* workflow, or for special actions such as "Publish" to only occur
* when a particular workflow state is reached.
*
* Only the enabled actions are tracked. Any actions controlled by
* the workflow but not explicitly enabled are disabled.
*/
function getEnabledActionsForState($oState) {
$iStateId = KTUtil::getId($oState);
$sTable = KTUtil::getTableName('workflow_state_actions');
$aQuery = array(
"SELECT action_name FROM $sTable WHERE state_id = ?",
array($iStateId),
);
return DBUtil::getResultArrayKey($aQuery, 'action_name');
}
// }}}
function getDisabledActionsForState($oState) {
$iStateId = KTUtil::getId($oState);
$sTable = KTUtil::getTableName('workflow_state_disabled_actions');
$aQuery = array(
"SELECT action_name FROM $sTable WHERE state_id = ?",
array($iStateId),
);
return DBUtil::getResultArrayKey($aQuery, 'action_name');
}
// {{{ actionEnabledForDocument
/**
* Checks if a particular action is enabled to occur on a document
* by virtue of its workflow and workflow state.
*
* A controlled action is one that can be enabled or disabled by a
* workflow state attached to this workflow. This allows for
* actions such as "Delete" to not be allowed to occur during the
* workflow, or for special actions such as "Publish" to only occur
* when a particular workflow state is reached.
*
* Only the enabled actions are tracked. Any actions controlled by
* the workflow but not explicitly enabled are disabled.
*/
function actionEnabledForDocument($oDocument, $sName) {
$oWorkflow =& KTWorkflow::getByDocument($oDocument);
if (is_null($oWorkflow)) {
return true;
}
// FIXME: The workflow_actions table that the method below uses is always empty!
// It seems the new method was never followed though to completion.
//if (!in_array($sName, KTWorkflowUtil::getControlledActionsForWorkflow($oWorkflow))) {
// return true;
//}
$oState =& KTWorkflowState::getByDocument($oDocument);
if (in_array($sName, KTWorkflowUtil::getDisabledActionsForState($oState))) {
return false;
}
return true;
}
// }}}
// {{{ getWorkflowForDocument
/**
* Gets the workflow that applies to the given document, returning
* null if there is no workflow assigned.
*/
function getWorkflowForDocument ($oDocument, $aOptions = null) {
$ids = KTUtil::arrayGet($aOptions, 'ids', false);
if (is_a($oDocument, 'KTDocumentCore')) {
$oDocument = $oDocument->getId();
}
$oDocument = KTUtil::getObject('Document', $oDocument);
$iWorkflowId = $oDocument->getWorkflowId();
if (PEAR::isError($iWorkflowId)) {
return $iWorkflowId;
}
if (is_null($iWorkflowId)) {
return $iWorkflowId;
}
if ($ids) {
return $iWorkflowId;
}
return KTWorkflow::get($iWorkflowId);
}
// }}}
// {{{ getWorkflowStateForDocument
/**
* Gets the workflow state that applies to the given document,
* returning null if there is no workflow assigned.
*/
function getWorkflowStateForDocument ($oDocument, $aOptions = null) {
$ids = KTUtil::arrayGet($aOptions, 'ids', false);
if (is_a($oDocument, 'KTDocumentCore')) {
$oDocument = $oDocument->getId();
}
$oDocument = KTUtil::getObject('Document', $oDocument);
$iWorkflowStateId = $oDocument->getWorkflowStateId();
if (PEAR::isError($iWorkflowStateId)) {
return $iWorkflowStateId;
}
if (is_null($iWorkflowStateId)) {
return $iWorkflowStateId;
}
if ($ids) {
return $iWorkflowStateId;
}
return KTWorkflowState::get($iWorkflowStateId);
}
// }}}
// {{{ getTransitionsForDocumentUser
/**
* Gets the transitions that are available for a document by virtue
* of its workflow state, and also by virtue of the user that wishes
* to perform the transition.
*
* In other words, ensures that the guard permission, role, group,
* and/or user are met for the given user.
*/
function getTransitionsForDocumentUser($oDocument, $oUser) {
$oState = KTWorkflowUtil::getWorkflowStateForDocument($oDocument);
if (is_null($oState) || PEAR::isError($oState)) {
return $oState;
}
$aTransitions = KTWorkflowUtil::getTransitionsFrom($oState);
$aEnabledTransitions = array();
foreach ($aTransitions as $oTransition) {
// keeping this around to make coding the replacements easier.
/*
$iPermissionId = $oTransition->getGuardPermissionId();
if ($iPermissionId) {
$oPermission =& KTPermission::get($iPermissionId);
if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPermission, $oDocument)) {
continue;
}
}
$iGroupId = $oTransition->getGuardGroupId();
if ($iGroupId) {
$oGroup =& Group::get($iGroupId);
$res = GroupUtil::getMembershipReason($oUser, $oGroup);
if (!is_string($res)) {
continue;
}
}
$iRoleId = $oTransition->getGuardRoleId();
if ($iRoleId) {
$oRoleAllocation = RoleAllocation::getAllocationsForFolderAndRole($oDocument->getFolderID(), $iRoleId);
if ($oRoleAllocation == null) { // no role allocation, no fulfillment.
continue;
}
if (!$oRoleAllocation->hasMember($oUser)) {
continue;
}
}
$iConditionId = $oTransition->getGuardConditionId();
if ($iConditionId) {
if (!KTSearchUtil::testConditionOnDocument($iConditionId, $oDocument)) {
continue;
}
}
*/
$aGuardTriggers = KTWorkflowUtil::getGuardTriggersForTransition($oTransition);
if (PEAR::isError($aGuardTriggers)) {
return $aGuardTriggers; // error out?
}
$bBreak = false;
foreach ($aGuardTriggers as $oTrigger) {
if (!$oTrigger->allowTransition($oDocument, $oUser)) {
$bBreak = true;
break;
}
}
if ($bBreak) { continue; }
$aEnabledTransitions[] = $oTransition;
}
return $aEnabledTransitions;
}
// }}}
// {{{ performTransitionOnDocument
/**
* Performs a workflow transition on a document, changing it from
* one workflow state to another, with potential side effects (user
* scripts, and so forth).
*
* This function currently assumes that the user in question is
* allowed to perform the transition and that all the guard
* functionality on the transition has passed.
*/
function performTransitionOnDocument($oTransition, $oDocument, $oUser, $sComments) {
$oWorkflow =& KTWorkflow::getByDocument($oDocument);
if (empty($oWorkflow)) {
return PEAR::raiseError(_kt("Document has no workflow"));
}
if (PEAR::isError($oWorkflow)) {
return $oWorkflow;
}
$oSourceState =& KTWorkflowUtil::getWorkflowStateForDocument($oDocument);
// walk the action triggers.
$aActionTriggers = KTWorkflowUtil::getActionTriggersForTransition($oTransition);
if (PEAR::isError($aActionTriggers)) {
return $aActionTriggers; // error out?
}
foreach ($aActionTriggers as $oTrigger) {
$res = $oTrigger->precheckTransition($oDocument, $oUser);
if (PEAR::isError($res)) {
return $res;
}
}
$iPreviousMetadataVersion = $oDocument->getMetadataVersionId();
$oDocument->startNewMetadataVersion($oUser);
KTDocumentUtil::copyMetadata($oDocument, $iPreviousMetadataVersion);
$iStateId = $oTransition->getTargetStateId();
$oDocument->setWorkflowStateId($iStateId);
$res = $oDocument->update();
if (PEAR::isError($res)) {
return $res;
}
$oTargetState =& KTWorkflowState::get($iStateId);
$sSourceState = $oSourceState->getName();
$sTargetState = $oTargetState->getName();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?