/** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $value->getEntity(); // Ignore entities that are not subject to moderation anyway. if (!$this->moderationInformation->isModeratableEntity($entity)) { return; } // Ignore entities that are being created for the first time. if ($entity->isNew()) { return; } // Ignore entities that are being moderated for the first time, such as // when they existed before moderation was enabled for this entity type. if ($this->isFirstTimeModeration($entity)) { return; } $original_entity = $this->moderationInformation->getLatestRevision($entity->getEntityTypeId(), $entity->id()); $next_moderation_state_id = $entity->moderation_state->target_id; $original_moderation_state_id = $original_entity->moderation_state->target_id; if (!$this->validation->isTransitionAllowed($original_moderation_state_id, $next_moderation_state_id)) { $this->context->addViolation($constraint->message, ['%from' => $original_entity->moderation_state->entity->label(), '%to' => $entity->moderation_state->entity->label()]); } }
/** * @covers ::isTransitionAllowed * @covers ::calculatePossibleTransitions */ public function testIsTransitionAllowedWithInValidTransition() { $state_transition_validation = new StateTransitionValidation($this->setupEntityTypeManager(), $this->setupQueryFactory()); $this->assertFalse($state_transition_validation->isTransitionAllowed('published', 'needs_review')); $this->assertFalse($state_transition_validation->isTransitionAllowed('published', 'staging')); $this->assertFalse($state_transition_validation->isTransitionAllowed('staging', 'needs_review')); $this->assertFalse($state_transition_validation->isTransitionAllowed('staging', 'staging')); $this->assertFalse($state_transition_validation->isTransitionAllowed('needs_review', 'published')); }