📄 workflowutil.inc.php.svn-base
字号:
$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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -