function ModerationStateConstraintValidator::validate

Same name and namespace 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.