public function ContentEntityBase::hasTranslationChanges

public 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 1182

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

© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!ContentEntityBase.php/function/ContentEntityBase::hasTranslationChanges/8.1.x