📄 workflowutil.inc.php.svn-base
字号:
<?php/** * $Id$ * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * Contributor( s): ______________________________________ * */require_once(KT_LIB_DIR . '/workflow/workflow.inc.php');require_once(KT_LIB_DIR . '/workflow/workflowstate.inc.php');require_once(KT_LIB_DIR . '/workflow/workflowtransition.inc.php');require_once(KT_LIB_DIR . '/workflow/workflowtrigger.inc.php');require_once(KT_LIB_DIR . '/workflow/workflowtriggerinstance.inc.php');require_once(KT_LIB_DIR . '/permissions/permissionutil.inc.php');require_once(KT_LIB_DIR . '/groups/GroupUtil.php');require_once(KT_LIB_DIR . '/documentmanagement/DocumentTransaction.inc');require_once(KT_LIB_DIR . '/search/searchutil.inc.php');require_once(KT_LIB_DIR . '/roles/roleallocation.inc.php');require_once(KT_LIB_DIR . '/groups/Group.inc');require_once(KT_LIB_DIR . '/users/User.inc');require_once(KT_LIB_DIR . '/roles/Role.inc');require_once(KT_LIB_DIR . '/dashboard/Notification.inc.php');class KTWorkflowUtil { // {{{ saveTransitionsFrom /** * Saves which workflow transitions are available to be chosen from * this workflow state. * * Workflow transitions have only destination workflow states, and * it is up to the workflow state to decide which workflow * transitions it wants to allow to leave its state. */ function saveTransitionsFrom($oState, $aTransitionIds) { $sTable = KTUtil::getTableName('workflow_state_transitions'); $aQuery = array( "DELETE FROM $sTable WHERE state_id = ?", array($oState->getId()), ); $res = DBUtil::runQuery($aQuery); if (PEAR::isError($res)) { return $res; } $aOptions = array('noid' => true); if (empty($aTransitionIds)) { return; // don't fail if there are no transitions. } foreach ($aTransitionIds as $iTransitionId) { $res = DBUtil::autoInsert($sTable, array( 'state_id' => $oState->getId(), 'transition_id' => $iTransitionId, ), $aOptions); if (PEAR::isError($res)) { return $res; } } return; } // }}} // {{{ getTransitionsFrom /** * Gets which workflow transitions are available to be chosen from * this workflow state. * * Workflow transitions have only destination workflow states, and * it is up to the workflow state to decide which workflow * transitions it wants to allow to leave its state. * * This function optionally will return the database id numbers of * the workflow transitions using the 'ids' option. */ function getTransitionsFrom($oState, $aOptions = null) { $bIds = KTUtil::arrayGet($aOptions, 'ids'); $sTable = KTUtil::getTableName('workflow_state_transitions'); $aQuery = array( "SELECT transition_id FROM $sTable WHERE state_id = ?", array($oState->getId()), ); $aTransitionIds = DBUtil::getResultArrayKey($aQuery, 'transition_id'); if (PEAR::isError($aTransitionIds)) { return $aTransitionIds; } if ($bIds) { return $aTransitionIds; } $aRet = array(); foreach ($aTransitionIds as $iId) { $aRet[] =& KTWorkflowTransition::get($iId); } return $aRet; } // }}} /* WILL NOT RESET THE WORKFLOW if changing to the -same- workflow */ function changeWorkflowOnDocument($oWorkflow, $oDocument) { $oDocument =& KTUtil::getObject('Document', $oDocument); // fix for 1049: workflows reset on document move. // this was the original purpose of "changeWorkflowOnDocument". if (is_null($oWorkflow)) { if ($oDocument->getWorkflowId() == null) { return true; // no definition. } } else { if ($oDocument->getWorkflowId() == $oWorkflow->getId()) { return true; // bail out, essentially. } } return KTWorkflowUtil::startWorkflowOnDocument($oWorkflow, $oDocument); } // {{{ startWorkflowOnDocument /** * Starts the workflow process on a document, placing it into the * starting workflow state for the given workflow. */ function startWorkflowOnDocument ($oWorkflow, $oDocument) { $oDocument =& KTUtil::getObject('Document', $oDocument); $iDocumentId = $oDocument->getId(); $oUser = User::get($_SESSION['userID']); $iPreviousMetadataVersion = $oDocument->getMetadataVersionId(); $oDocument->startNewMetadataVersion($oUser); KTDocumentUtil::copyMetadata($oDocument, $iPreviousMetadataVersion); if (!empty($oWorkflow)) { $oWorkflow =& KTUtil::getObject('KTWorkflow', $oWorkflow); $iWorkflowId = $oWorkflow->getId(); // null workflow == remove workflow. if (is_null($oWorkflow) || PEAR::isError($oWorkflow) || ($oWorkflow == false)) { return true; // delete and no-act. } $iStartStateId = $oWorkflow->getStartStateId(); if (empty($iStartStateId)) { return PEAR::raiseError(_kt('Cannot assign workflow with no starting state set')); } $oDocument->setWorkflowId($iWorkflowId); $oDocument->setWorkflowStateId($iStartStateId); $sTransactionComments = sprintf(_kt("Workflow \"%s\" started."), $oWorkflow->getHumanName()); } else { $oDocument->setWorkflowId(null); $oDocument->setWorkflowStateId(null); $sTransactionComments = _kt('Workflow removed from document.'); } $res = $oDocument->update(); if (PEAR::isError($res)) { return $res; } // create the document transaction record $oDocumentTransaction = new DocumentTransaction($oDocument, $sTransactionComments, 'ktcore.transactions.workflow_state_transition'); $oDocumentTransaction->create(); // FIXME does this function as expected? KTPermissionUtil::updatePermissionLookup($oDocument); if (isset($iStartStateId)) { $oTargetState = KTWorkflowState::get($iStartStateId); KTWorkflowUtil::informUsersForState($oTargetState, KTWorkflowUtil::getInformedForState($oTargetState), $oDocument, $oUser, ''); } return $res; } // }}} // {{{ getControlledActionsForWorkflow /** * Gets the actions that are controlled by a workflow. * * 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. */ function getControlledActionsForWorkflow($oWorkflow) { $iWorkflowId = KTUtil::getId($oWorkflow); $sTable = KTUtil::getTableName('workflow_actions'); $aQuery = array( "SELECT action_name FROM $sTable WHERE workflow_id = ?", array($iWorkflowId), ); return DBUtil::getResultArrayKey($aQuery, 'action_name'); } // }}} // {{{ setControlledActionsForWorkflow /** * Sets the actions that are controlled by a workflow. * * 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. */ function setControlledActionsForWorkflow($oWorkflow, $aActions) { $iWorkflowId = KTUtil::getId($oWorkflow); $sTable = KTUtil::getTableName('workflow_actions'); $aQuery = array( "DELETE FROM $sTable WHERE workflow_id = ?", array($iWorkflowId), ); $res = DBUtil::runQuery($aQuery); if (PEAR::isError($res)) { return $res; } $aOptions = array('noid' => true); if (!empty($aActions)) { foreach ($aActions as $sAction) { $res = DBUtil::autoInsert($sTable, array( 'workflow_id' => $iWorkflowId, 'action_name' => $sAction, ), $aOptions); if (PEAR::isError($res)) { return $res; } } } return; } // }}} // FIXME DEPRECATED // {{{ setEnabledActionsForState /** * Sets 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 setEnabledActionsForState($oState, $aActions) { $iStateId = KTUtil::getId($oState); $sTable = KTUtil::getTableName('workflow_state_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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -