You are here

public function EntityChangedConstraintValidator::validate in Drupal 10

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityChangedConstraintValidator::validate()
  2. 9 core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityChangedConstraintValidator::validate()
1 call to EntityChangedConstraintValidator::validate()
BlockContentEntityChangedConstraintValidator::validate in core/modules/block_content/src/Plugin/Validation/Constraint/BlockContentEntityChangedConstraintValidator.php
1 method overrides EntityChangedConstraintValidator::validate()
BlockContentEntityChangedConstraintValidator::validate in core/modules/block_content/src/Plugin/Validation/Constraint/BlockContentEntityChangedConstraintValidator.php

File

core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php, line 16

Class

EntityChangedConstraintValidator
Validates the EntityChanged constraint.

Namespace

Drupal\Core\Entity\Plugin\Validation\Constraint

Code

public function validate($entity, Constraint $constraint) {
  if (isset($entity)) {

    /** @var \Drupal\Core\Entity\EntityInterface $entity */
    if (!$entity
      ->isNew()) {
      $saved_entity = \Drupal::entityTypeManager()
        ->getStorage($entity
        ->getEntityTypeId())
        ->loadUnchanged($entity
        ->id());

      // Ensure that all the entity translations are the same as or newer
      // than their current version in the storage in order to avoid
      // reverting other changes. In fact the entity object that is being
      // saved might contain an older entity translation when different
      // translations are being concurrently edited.
      if ($saved_entity) {
        $common_translation_languages = array_intersect_key($entity
          ->getTranslationLanguages(), $saved_entity
          ->getTranslationLanguages());
        foreach (array_keys($common_translation_languages) as $langcode) {

          // Merely comparing the latest changed timestamps across all
          // translations is not sufficient since other translations may have
          // been edited and saved in the meanwhile. Therefore, compare the
          // changed timestamps of each entity translation individually.
          if ($saved_entity
            ->getTranslation($langcode)
            ->getChangedTime() > $entity
            ->getTranslation($langcode)
            ->getChangedTime()) {
            $this->context
              ->addViolation($constraint->message);
            break;
          }
        }
      }
    }
  }
}