diff --git a/plugins/ktcore/admin/workflowsv2.php b/plugins/ktcore/admin/workflowsv2.php index d18114d..13fcd50 100644 --- a/plugins/ktcore/admin/workflowsv2.php +++ b/plugins/ktcore/admin/workflowsv2.php @@ -122,6 +122,198 @@ class KTWorkflowAdminV2 extends KTAdminDispatcher { return $oTemplate->render(); } + function do_branchConfirm() { + $submit = KTUtil::arrayGet($_REQUEST, 'submit' , array()); + if (array_key_exists('copy',$submit)) { + $selection = KTUtil::arrayGet($_REQUEST, 'workflowSelect' , array()); + if(empty($selection)){ + $this->errorRedirectToMain(_kt('No workflow selected.')); + } + return $this->do_copy(); + } + if (array_key_exists('confirmCopy',$submit)) { + $workflowId = KTUtil::arrayGet($_REQUEST, 'workflowId' , array()); + if(empty($workflowId)){ + $this->errorRedirectToMain(_kt('An unexpected error has occured.')); + } + return $this->do_confirmCopy(); + } + $this->errorRedirectToMain(_kt('No action specified.')); + } + + function do_copy() { + $this->aBreadcrumbs[] = array('url' => $_SERVER['PHP_SELF'], 'name' => _kt('Copy Workflow')); + $selection = KTUtil::arrayGet($_REQUEST, 'workflowSelect' , array()); + $this->oPage->setTitle('Copy Workflow'); + + // get selected workflow from database + $oSelWorkflow = KTWorkflow::get($selection); + + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('ktcore/workflow/admin/copy'); + $oTemplate->setData(array( + 'context' => $this, + 'workFlowName' => $oSelWorkflow->getName(), + 'workFlowId' => $oSelWorkflow->getId(), + + )); + return $oTemplate; + } + + function do_confirmCopy(){ + $oSelWorkflow = KTWorkflow::get(KTUtil::arrayGet($_REQUEST, 'workflowId' , array())); + $sWorkflowName = KTUtil::arrayGet($_REQUEST, 'workflowName' , array()); + // create the initial workflow + $oNewWorkflow = KTWorkflow::createFromArray(array( + 'name' => $sWorkflowName, + 'humanname' => $sWorkflowName, + 'enabled' => true, + )); + + // get selected workflow states from database + $oSelWorkflowStates = KTWorkflowState::getByWorkflow($oSelWorkflow); + + // array to store map of old and new states + $aStatesMap = array(); + + // create new states and build old-to-new map + foreach ($oSelWorkflowStates as $oOldState) { + $oNewState = KTWorkflowState::createFromArray(array( + 'workflowid' => $oNewWorkflow->getId(), + 'name' => $oOldState->getName(), + 'humanname' => $oOldState->getName(), + )); + $aStatesMap[oldId][] = $oOldState->getId(); + $aStatesMap[newId][] = $oNewState->getId(); + if (PEAR::isError($oNewState)) { + $oForm->errorRedirectToMain(sprintf(_kt("Unexpected failure cloning state: %s"), $oNewState->getMessage())); + } + + // Get all state permission assignments for old workflow transitions and copy for copied workflow state permission assignments + $aPermissionAssignments = KTWorkflowStatePermissionAssignment::getByState($oOldState); + if(count($aPermissionAssignments) > 0){ + foreach ($aPermissionAssignments as $oPermAssign) { + for($i=0;$igetStateId()){ + $iStateId = $aStatesMap[newId][$i]; + + $res = KTWorkflowStatePermissionAssignment::createFromArray(array( + 'iStateId' => $iStateId, + 'iPermissionId' => $oPermAssign->getPermissionId(), + 'iDescriptorId' => $oPermAssign->getDescriptorId(), + )); + + if (PEAR::isError($res)) { + return $this->errorRedirectToMain(sprintf(_kt("Unable to copy state permission assignment: %s"), $res->getMessage())); + } + } + } + } + } + + // Copy all disabled actions for states + $aDisabled = KTWorkflowUtil::getDisabledActionsForState($oOldState); + $res = KTWorkflowUtil::setDisabledActionsForState($oNewState, $aDisabled); + + // Copy all enabled actions for states + $aDisabled = KTWorkflowUtil::getEnabledActionsForState($oOldState); + $res = KTWorkflowUtil::setEnabledActionsForState($oNewState, $aDisabled); + + if (PEAR::isError($res)) { + return $this->errorRedirectToMain(sprintf(_kt("Unable to copy disabled state actions: %s"), $res->getMessage())); + } + } + + // update workflow and set initial state + for($i=0;$igetStartStateId() == $aStatesMap[oldId][$i]){ + $oNewWorkflow->setStartStateId($aStatesMap[newId][$i]); + $res = $oNewWorkflow->update(); + if (PEAR::isError($res)) { + $this->errorRedirectToMain(sprintf(_kt("Failed to update workflow: %s"), $res->getMessage())); + } + } + } + + // set controlled workflow actions + $aWFActions = KTWorkflowUtil::getControlledActionsForWorkflow($oSelWorkflow); + $res = KTWorkflowUtil::setControlledActionsForWorkflow($oNewWorkflow, $aWFActions); + if (PEAR::isError($res)) { + $this->errorRedirectToMain(sprintf(_kt("Failed to copy workflow controlled actions: %s"), $res->getMessage())); + } + + // get selected workflow transitions from database + $oSelWorkflowTransitions = KTWorkflowTransition::getByWorkflow($oSelWorkflow); + + // array to store map of old and new transitions + $aTransitionsMap = array(); + + // copy transitions for workflow + foreach ($oSelWorkflowTransitions as $oOldTransition) { + for($i=0;$igetTargetStateId() == $aStatesMap[oldId][$i]){ + $iDestState = $aStatesMap[newId][$i]; + } + } + $oNewTransition = KTWorkflowTransition::createFromArray(array( + 'workflowid' => $oNewWorkflow->getId(), + 'Name' => $oOldTransition->getName(), + 'HumanName' => $oOldTransition->getName(), + 'TargetStateId' => $iDestState, + 'GuardPermissionId' => null, + 'GuardGroupId' => null, + 'GuardRoleId' => null, + 'GuardConditionId' => null, + )); + + $aTransitionsMap[oldId][] = $oOldTransition->getId(); + $aTransitionsMap[newId][] = $oNewTransition->getId(); + + if (PEAR::isError($oNewTransition)) { + $this->errorRedirectToMain(sprintf(_kt("Failed to copy transition: %s"), $oTransition->getMessage())); + } + + // map source transitions onto states + $aOldTransitionSources = KTWorkflowAdminUtil::getSourceStates($oOldTransition); + $aSourceStates = array(); + for($j=0;$jgetId()){ + $aSourceStates[] = $aStatesMap[newId][$i]; + continue; + } + } + } + $res = KTWorkflowAdminUtil::saveTransitionSources($oNewTransition, $aSourceStates); + if (PEAR::isError($res)) { + $this->errorRedirectToMain(sprintf(_kt("Failed to set transition origins: %s"), $res->getMessage())); + } + + // Get all triggers for old workflow transitions and copy for copied workflow transitions + $aTriggers = KTWorkflowTriggerInstance::getByTransition($oOldTransition); + if(count($aTriggers) > 0){ + foreach ($aTriggers as $oTrigger) { + for($i=0;$igetTransitionId()){ + $iTransitionId = $aTransitionsMap[newId][$i]; + + $res = KTWorkflowTriggerInstance::createFromArray(array( + 'transitionid' => $iTransitionId, + 'namespace' => $oTrigger->getNamespace(), + 'config' => $oTrigger->getConfigArrayText(), + )); + + if (PEAR::isError($res)) { + return $this->errorRedirectToMain(sprintf(_kt("Unable to add trigger: %s"), $res->getMessage())); + } + } + } + } + } + } + return $this->successRedirectToMain(sprintf(_kt("%s successfully copied as %s"), $oSelWorkflow->getName(), $oNewWorkflow->getName())); + } + function do_newWorkflow() { // subdispatch this to the NewWorkflowWizard. require_once(dirname(__FILE__) . '/workflow/newworkflow.inc.php'); diff --git a/templates/ktcore/workflow/admin/copy.smarty b/templates/ktcore/workflow/admin/copy.smarty new file mode 100644 index 0000000..98d5a05 --- /dev/null +++ b/templates/ktcore/workflow/admin/copy.smarty @@ -0,0 +1,23 @@ +

{i18n}Copy Workflow{/i18n}

+

+{i18n}You are about to make a copy of {$workFlowName}. This will make and exact copy of the selected workflow, + including all associated permissions, actions and triggers. Enter the desired name for the resulting workflow + copy to continue.{/i18n} +

+ +

{i18n}New workflow information{/i18n}

+
+ + + + + + + + + + +
New workflow name:

+ + +
\ No newline at end of file diff --git a/templates/ktcore/workflow/admin/list.smarty b/templates/ktcore/workflow/admin/list.smarty index 2f410e7..fae46f9 100644 --- a/templates/ktcore/workflow/admin/list.smarty +++ b/templates/ktcore/workflow/admin/list.smarty @@ -9,10 +9,14 @@

{i18n}Existing workflows{/i18n}

{i18n}Select a workflow to modify. To enable a disabled workflow, edit it and set a proper starting state.{/i18n}

+
+ + + @@ -21,14 +25,21 @@ {foreach from=$workflows item=oWorkflow} - + {/foreach} + + + + + +
{i18n}Name{/i18n} {i18n}Status{/i18n} {i18n}Edit{/i18n}
{$oWorkflow->getName()} {if $oWorkflow->getIsFunctional()} {i18n}Enabled{/i18n} {else} {i18n}Disabled{/i18n} {/if} {i18n}Edit{/i18n}

+
{/if}