function ModerationStateConstraintValidator::validate

Same name in other branches
  1. 9 core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php \Drupal\content_moderation\Plugin\Validation\Constraint\ModerationStateConstraintValidator::validate()
  2. 8.9.x core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php \Drupal\content_moderation\Plugin\Validation\Constraint\ModerationStateConstraintValidator::validate()
  3. 10 core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php \Drupal\content_moderation\Plugin\Validation\Constraint\ModerationStateConstraintValidator::validate()

File

core/modules/content_moderation/src/Plugin/Validation/Constraint/ModerationStateConstraintValidator.php, line 82

Class

ModerationStateConstraintValidator
Checks if a moderation state transition is valid.

Namespace

Drupal\content_moderation\Plugin\Validation\Constraint

Code

public function validate($value, Constraint $constraint) : void {
    
    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
    $entity = $value->getEntity();
    // Ignore entities that are not subject to moderation anyway.
    if (!$this->moderationInformation
        ->isModeratedEntity($entity)) {
        return;
    }
    // If the entity is moderated and the item list is empty, ensure users see
    // the same required message as typical NotNull constraints.
    if ($value->isEmpty()) {
        $this->context
            ->addViolation((new NotNullConstraint())->message);
        return;
    }
    $workflow = $this->moderationInformation
        ->getWorkflowForEntity($entity);
    if (!$workflow->getTypePlugin()
        ->hasState($entity->moderation_state->value)) {
        // If the state we are transitioning to doesn't exist, we can't validate
        // the transitions for this entity further.
        $this->context
            ->addViolation($constraint->invalidStateMessage, [
            '%state' => $entity->moderation_state->value,
            '%workflow' => $workflow->label(),
        ]);
        return;
    }
    $new_state = $workflow->getTypePlugin()
        ->getState($entity->moderation_state->value);
    $original_state = $this->moderationInformation
        ->getOriginalState($entity);
    // If a new state is being set and there is an existing state, validate
    // there is a valid transition between them.
    if (!$original_state->canTransitionTo($new_state->id())) {
        $this->context
            ->addViolation($constraint->message, [
            '%from' => $original_state->label(),
            '%to' => $new_state->label(),
        ]);
    }
    else {
        // If we're sure the transition exists, make sure the user has permission
        // to use it.
        if (!$this->stateTransitionValidation
            ->isTransitionValid($workflow, $original_state, $new_state, $this->currentUser, $entity)) {
            $this->context
                ->addViolation($constraint->invalidTransitionAccess, [
                '%original_state' => $original_state->label(),
                '%new_state' => $new_state->label(),
            ]);
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.