workflowutil.inc.php
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 886 行 · 第 1/3 页
PHP
886 行
<?php
/**
* $Id: workflowutil.inc.php 8387 2008-04-22 16:36:04Z kevin_fourie $
*
* 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 + =
减小字号Ctrl + -
显示快捷键?