/** * Given a RedBeanModel, query workflow rules and process any beforeSave triggers for either on-save or * by-time workflows. Called from @see WokflowsObserver->processWorkflowBeforeSave * @param Item $model * @param User $triggeredByUser * @throws NotSupportedException if the workflow type is not valid */ public static function resolveBeforeSaveByModel(Item $model, User $triggeredByUser) { $savedWorkflows = SavedWorkflow::getActiveByModuleClassNameAndIsNewModel($model::getModuleClassName(), $model->getIsNewModel()); foreach ($savedWorkflows as $savedWorkflow) { $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow); if (WorkflowTriggersUtil::areTriggersTrueBeforeSave($workflow, $model)) { if ($workflow->getType() == Workflow::TYPE_BY_TIME) { $model->addWorkflowToProcessAfterSave($workflow); } elseif ($workflow->getType() == Workflow::TYPE_ON_SAVE) { WorkflowActionsUtil::processBeforeSave($workflow, $model, $triggeredByUser); $model->addWorkflowToProcessAfterSave($workflow); } else { throw new NotSupportedException(); } } } }
/** * @depends testGetWorkflowsMissingRequiredActionAttributesWhereActionIsMissingRequiredAttribute */ public function testProcessBeforeSave() { //Create workflow $workflow = new Workflow(); $workflow->setDescription('aDescription'); $workflow->setIsActive(true); $workflow->setOrder(5); $workflow->setModuleClassName('WorkflowsTestModule'); $workflow->setName('myFirstWorkflow'); $workflow->setTriggerOn(Workflow::TRIGGER_ON_NEW_AND_EXISTING); $workflow->setType(Workflow::TYPE_ON_SAVE); $workflow->setTriggersStructure('1'); //Add trigger $trigger = new TriggerForWorkflowForm('WorkflowsTestModule', 'WorkflowModelTestItem', $workflow->getType()); $trigger->attributeIndexOrDerivedType = 'string'; $trigger->value = 'aValue'; $trigger->operator = 'equals'; $workflow->addTrigger($trigger); //Add action $action = new ActionForWorkflowForm('WorkflowModelTestItem', Workflow::TYPE_ON_SAVE); $action->type = ActionForWorkflowForm::TYPE_UPDATE_SELF; $attributes = array('string' => array('shouldSetValue' => '1', 'type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => 'jason')); $action->setAttributes(array(ActionForWorkflowForm::ACTION_ATTRIBUTES => $attributes)); $workflow->addAction($action); //Create the saved Workflow $savedWorkflow = new SavedWorkflow(); SavedWorkflowToWorkflowAdapter::resolveWorkflowToSavedWorkflow($workflow, $savedWorkflow); $saved = $savedWorkflow->save(); $this->assertTrue($saved); //Confirm that the workflow processes and the attribute gets updated $model = new WorkflowModelTestItem(); $model->string = 'aValue'; WorkflowActionsUtil::processBeforeSave($workflow, $model, Yii::app()->user->userModel); $this->assertEquals('jason', $model->string); $this->assertTrue($model->id < 0); }