/** * Update a workflow definition * * @param WorkflowDefinition $definition * The definition to update */ public function updateDefinition(WorkflowDefinition $definition) { $existingActions = array(); $existing = $definition->Actions()->column('Title'); $structure = array_keys($this->structure); $removeNames = array_diff($existing, $structure); foreach ($definition->Actions() as $action) { if (in_array($action->Title, $removeNames)) { $action->delete(); continue; } $existingActions[$action->Title] = $action; } $actions = array(); $transitions = new ArrayObject(); $sort = 1; // now, go through the structure and create/realign things foreach ($this->structure as $actionName => $actionTemplate) { $action = null; if (isset($existingActions[$actionName])) { $action = $existingActions[$actionName]; } else { $action = $this->createAction($actionName, $actionTemplate, $definition, $transitions); } // add a sort value in! $action->Sort = $sort++; $action->write(); $actions[$actionName] = $action; $newTransitions = $this->updateActionTransitions($actionTemplate, $action); foreach ($newTransitions as $t) { $transitions->append($t); } } foreach ($transitions as $transition) { if (isset($actions[$transition->Target])) { $transition->NextActionID = $actions[$transition->Target]->ID; } $transition->write(); } $definition->TemplateVersion = $this->getVersion(); $definition->write(); }
/** * Update a workflow definition * * @param WorkflowDefinition $definition * The definition to update */ public function updateDefinition(WorkflowDefinition $definition) { $existingActions = array(); $existing = $definition->Actions()->column('Title'); $structure = array_keys($this->structure); $removeNames = array_diff($existing, $structure); foreach ($definition->Actions() as $action) { if (in_array($action->Title, $removeNames)) { $action->delete(); continue; } $existingActions[$action->Title] = $action; } $actions = array(); $transitions = new ArrayObject(); $sort = 1; // now, go through the structure and create/realign things foreach ($this->structure as $relationName => $relationTemplate) { $isAction = isset($relationTemplate['type']); $isUsers = $relationName == 'users'; $isGroups = $relationName == 'groups'; if ($isAction) { $action = null; if (isset($existingActions[$relationName])) { $action = $existingActions[$relationName]; } else { $action = $this->createAction($relationName, $relationTemplate, $definition, $transitions); } // add a sort value in! $action->Sort = $sort++; $action->write(); $actions[$relationName] = $action; $newTransitions = $this->updateActionTransitions($relationTemplate, $action); foreach ($newTransitions as $t) { $transitions->append($t); } } // Process users on WorkflowDefinition from the template if ($isUsers) { $this->createUsers($relationTemplate, $definition, true); } // Process groups on WorkflowDefinition from the template if ($isGroups) { $this->createGroups($relationTemplate, $definition, true); } } foreach ($transitions as $transition) { if (isset($actions[$transition->Target])) { $transition->NextActionID = $actions[$transition->Target]->ID; } $transition->write(); } // Set the version and do the write at the end so that we don't trigger an infinite loop!! $definition->Description = $this->getDescription(); $definition->TemplateVersion = $this->getVersion(); $definition->RemindDays = $this->getRemindDays(); $definition->Sort = $this->getSort(); $definition->write(); }