/** * Utility method, used in tests * @return \WorkflowDefinition */ protected function createDefinition() { $definition = new WorkflowDefinition(); $definition->Title = "Dummy Workflow Definition"; $definition->write(); $stepOne = new WorkflowAction(); $stepOne->Title = "Step One"; $stepOne->WorkflowDefID = $definition->ID; $stepOne->write(); $stepTwo = new WorkflowAction(); $stepTwo->Title = "Step Two"; $stepTwo->WorkflowDefID = $definition->ID; $stepTwo->write(); $transitionOne = new WorkflowTransition(); $transitionOne->Title = 'Step One T1'; $transitionOne->ActionID = $stepOne->ID; $transitionOne->NextActionID = $stepTwo->ID; $transitionOne->write(); return $definition; }
/** * @param array $record * @param array $columnMap * @param BulkLoader_Result $results * @param boolean $preview * @return number */ protected function processRecord($record, $columnMap, &$results, $preview = false) { $posted = Controller::curr()->getRequest()->postVars(); $default = WorkflowDefinitionExporter::$export_filename_prefix . '0.yml'; $filename = isset($posted['_CsvFile']['name']) ? $posted['_CsvFile']['name'] : $default; // @todo is this the best way to extract records (nested array keys)?? $struct = $record['Injector']['ExportedWorkflow']; $name = $struct['constructor'][0]; $import = $this->createImport($name, $filename, $record); $template = Injector::inst()->createWithArgs('WorkflowTemplate', $struct['constructor']); $template->setStructure($struct['properties']['structure']); $def = WorkflowDefinition::create(); $def->workflowService = singleton('WorkflowService'); $def->Template = $template->getName(); $obj = $def->workflowService->defineFromTemplate($def, $def->Template); $results->addCreated($obj, ''); $objID = $obj->ID; // Update the import $import->DefinitionID = $objID; $import->write(); $obj->destroy(); unset($obj); return $objID; }
public function getSubmissionWorkflow() { if ($this->WorkflowID) { return WorkflowDefinition::get()->byID($this->WorkflowID); } }
/** * Start a workflow based on a particular definition for a particular object. * * The object is optional; if not specified, it is assumed that this workflow * is simply a task based checklist type of workflow. * * @param WorkflowDefinition $definition * @param DataObject $for */ public function beginWorkflow(WorkflowDefinition $definition, DataObject $for = null) { if (!$this->ID) { $this->write(); } if ($for && ($for->hasExtension('WorkflowApplicable') || $for->hasExtension('FileWorkflowApplicable'))) { $this->TargetClass = ClassInfo::baseDataClass($for); $this->TargetID = $for->ID; } // lets create the first WorkflowActionInstance. $action = $definition->getInitialAction()->getInstanceForWorkflow(); $action->WorkflowID = $this->ID; $action->write(); $title = $for && $for->hasField('Title') ? sprintf(_t('WorkflowInstance.TITLE_FOR_DO', '%s - %s'), $definition->Title, $for->Title) : sprintf(_t('WorkflowInstance.TITLE_STUB', 'Instance #%s of %s'), $this->ID, $definition->Title); $this->Title = $title; $this->DefinitionID = $definition->ID; $this->CurrentActionID = $action->ID; $this->InitiatorID = Member::currentUserID(); $this->write(); $this->Users()->addMany($definition->Users()); $this->Groups()->addMany($definition->Groups()); }
private function setWorkflowDefinitions() { $workflow_defs = DataObject::get('WorkflowDefinition'); self::$workflow_defs = $workflow_defs->map()->toArray(); }
/** * 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(); }
/** * Reorders actions within a definition * * @param WorkflowDefinition|WorkflowAction $objects * The objects to be reordered * @param array $newOrder * An array of IDs of the actions in the order they should be. */ public function reorder($objects, $newOrder) { $sortVals = array_values($objects->map('ID', 'Sort')->toArray()); sort($sortVals); // save the new ID values - but only use existing sort values to prevent // conflicts with items not in the table foreach ($newOrder as $key => $id) { if (!$id) { continue; } $object = $objects->find('ID', $id); $object->Sort = $sortVals[$key]; $object->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(); }