You are here

public function ContentEntityBase::hasTranslationChanges in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/lib/Drupal/Core/Entity/ContentEntityBase.php \Drupal\Core\Entity\ContentEntityBase::hasTranslationChanges()

Determines if the current translation of the entity has unsaved changes.

If the entity is translatable only translatable fields will be checked for changes.

Return value

bool TRUE if the current translation of the entity has changes.

Overrides ContentEntityInterface::hasTranslationChanges

File

core/lib/Drupal/Core/Entity/ContentEntityBase.php, line 1127
Contains \Drupal\Core\Entity\ContentEntityBase.

Class

ContentEntityBase
Implements Entity Field API specific enhancements to the Entity class.

Namespace

Drupal\Core\Entity

Code

public function hasTranslationChanges() {
  if ($this
    ->isNew()) {
    return TRUE;
  }

  // $this->original only exists during save. See
  // \Drupal\Core\Entity\EntityStorageBase::save(). If it exists we re-use it
  // here for performance reasons.

  /** @var \Drupal\Core\Entity\ContentEntityBase $original */
  $original = $this->original ? $this->original : NULL;
  if (!$original) {
    $id = $this
      ->getOriginalId() !== NULL ? $this
      ->getOriginalId() : $this
      ->id();
    $original = $this
      ->entityManager()
      ->getStorage($this
      ->getEntityTypeId())
      ->loadUnchanged($id);
  }

  // If the current translation has just been added, we have a change.
  $translated = count($this->translations) > 1;
  if ($translated && !$original
    ->hasTranslation($this->activeLangcode)) {
    return TRUE;
  }

  // Compare field item current values with the original ones to determine
  // whether we have changes. If a field is not translatable and the entity is
  // translated we skip it because, depending on the use case, it would make
  // sense to mark all translations as changed or none of them. We skip also
  // computed fields as comparing them with their original values might not be
  // possible or be meaningless.

  /** @var \Drupal\Core\Entity\ContentEntityBase $translation */
  $translation = $original
    ->getTranslation($this->activeLangcode);
  foreach ($this
    ->getFieldDefinitions() as $field_name => $definition) {

    // @todo Avoid special-casing the following fields. See
    //    https://www.drupal.org/node/2329253.
    if ($field_name == 'revision_translation_affected' || $field_name == 'revision_id') {
      continue;
    }
    if (!$definition
      ->isComputed() && (!$translated || $definition
      ->isTranslatable())) {
      $items = $this
        ->get($field_name)
        ->filterEmptyItems();
      $original_items = $translation
        ->get($field_name)
        ->filterEmptyItems();
      if (!$items
        ->equals($original_items)) {
        return TRUE;
      }
    }
  }
  return FALSE;
}