public function testChangeStatusEventOnSaveFails() { $this->model->on(WorkflowEvent::beforeChangeStatus('Item04Workflow/A', 'Item04Workflow/B'), function ($event) { $this->eventsBefore[] = $event; $event->isValid = false; }); $this->model->on(WorkflowEvent::afterChangeStatus('Item04Workflow/A', 'Item04Workflow/B'), function ($event) { $this->eventsAfter[] = $event; }); $this->model->enterWorkflow(); verify('current status is set', $this->model->hasWorkflowStatus())->true(); verify('event handlers have never been called', count($this->eventsBefore) == 0 && count($this->eventsAfter) == 0)->true(); $this->model->status = 'Item04Workflow/B'; verify('save fails', $this->model->save())->false(); expect('model has not changed status', $this->model->getWorkflowStatus()->getId())->equals('Item04Workflow/A'); expect('beforeChangeStatus handler has been called', count($this->eventsBefore))->equals(1); expect('afterChangeStatus handler has not been called', count($this->eventsAfter))->equals(0); }
/** * Produces the following sequence when a model changes from status A to status B: * * - beforeLeaveStatus(A) * - beforeChangeStatus(A,B) * - beforeEnterStatus(B) * * - afterLeaveStatus(A) * - afterChangeStatus(A,B) * - afterEnterStatus(B) * @param Transition $transition * @param Object $sender * @return array|\yii\base\Event[] * @see \fproject\workflow\events\IEventSequenceScheme::createChangeStatusSequence() */ public function createChangeStatusSequence($transition, $sender) { return ['before' => [new WorkflowEvent(WorkflowEvent::beforeLeaveStatus($transition->getStartStatus()->getId()), ['start' => $transition->getStartStatus(), 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::beforeChangeStatus($transition->getStartStatus()->getId(), $transition->getEndStatus()->getId()), ['start' => $transition->getStartStatus(), 'end' => $transition->getEndStatus(), 'transition' => $transition, 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::beforeEnterStatus($transition->getEndStatus()->getId()), ['end' => $transition->getEndStatus(), 'sender' => $sender])], 'after' => [new WorkflowEvent(WorkflowEvent::afterLeaveStatus($transition->getStartStatus()->getId()), ['start' => $transition->getStartStatus(), 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::afterChangeStatus($transition->getStartStatus()->getId(), $transition->getEndStatus()->getId()), ['start' => $transition->getStartStatus(), 'end' => $transition->getEndStatus(), 'transition' => $transition, 'sender' => $sender]), new WorkflowEvent(WorkflowEvent::afterEnterStatus($transition->getEndStatus()->getId()), ['end' => $transition->getEndStatus(), 'sender' => $sender])]]; }