コード例 #1
0
 /**
  * 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;
 }
コード例 #2
0
 /**
  * @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);
     }
 }
コード例 #4
0
 /**
  * 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());
 }
コード例 #5
0
 private function setWorkflowDefinitions()
 {
     $workflow_defs = DataObject::get('WorkflowDefinition');
     self::$workflow_defs = $workflow_defs->map()->toArray();
 }
コード例 #6
0
 /**
  * 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();
 }
コード例 #7
0
 /**
  * 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();
     }
 }
コード例 #8
0
 /**
  * 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();
 }