function EntityChangedConstraintValidator::validate

Same name in other branches
  1. 9 core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityChangedConstraintValidator::validate()
  2. 10 core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityChangedConstraintValidator::validate()
  3. 11.x core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityChangedConstraintValidator::validate()

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;
                    }
                }
            }
        }
    }
}

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