multiversion-8.x-1.0-beta34/src/EntityReferenceRevisionsItem.php

src/EntityReferenceRevisionsItem.php
<?php

namespace Drupal\multiversion;

use Drupal\entity_reference_revisions\EntityNeedsSaveInterface;
use Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem as ContribEntityReferenceRevisionsItem;

/**
 * Alternative entity reference revisions base field item type class.
 */
class EntityReferenceRevisionsItem extends ContribEntityReferenceRevisionsItem {

  use EntityReferenceFieldTrait {
    preSave as entityReferencePreSave;
  }

  /**
   * Change the logic around saving auto-created entities.
   *
   * @see \Drupal\multiversion\EntityReferenceFieldTrait::preSave()
   * @see \Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem::preSave()
   */
  public function preSave() {
    if (!$this->parentIsEnabledEntityType()) {
      // Call source class method if parent entity isn't supported by Multiversion.
      parent::preSave();
      return;
    }

    $has_new = $this->hasNewEntity();

    // If it is a new entity, parent will save it.
    $this->entityReferencePreSave();

    if (!$has_new) {
      // Create a new revision if it is a composite entity in a host with a new
      // revision.
      $host = $this->getEntity();
      $needs_save = $this->entity instanceof EntityNeedsSaveInterface && $this->entity->needsSave();
      if (!$host->isNew() && $host->isNewRevision() && $this->entity && $this->entity->getEntityType()->get('entity_revision_parent_id_field')) {
        $this->entity->setNewRevision();
        if ($host->isDefaultRevision()) {
          $this->entity->isDefaultRevision(TRUE);
        }
        $needs_save = TRUE;
      }
      if ($needs_save) {
        // Delete the paragraph when the host entity is deleted.
        if ($host->_deleted->value == TRUE) {
          $this->entity->delete();
        }
        // We need special handling for entities with paragraphs fields during
        // replication (when $host->_rev->new_edit is FALSE).
        elseif ($host->_rev->new_edit == FALSE) {
          /** @var \Drupal\multiversion\MultiversionManagerInterface $multiversion_manager */
          $multiversion_manager = \Drupal::service('multiversion.manager');
          $entity_type = $this->entity->getEntityType();
          if ($multiversion_manager->isEnabledEntityType($entity_type)) {
            /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
            $entity_type_manager = \Drupal::service('entity_type.manager');
            /** @var \Drupal\multiversion\Entity\Storage\ContentEntityStorageInterface $storage */
            $storage = $entity_type_manager->getStorage($this->entity->getEntityTypeId());
            $entities = $storage->loadByProperties(['uuid' => $this->entity->uuid()]);
            $entity = reset($entities);
            if ($entity) {
              $parent_id = $this->entity->getEntityType()->get('entity_revision_parent_id_field');
              $entity->set($parent_id, $this->entity->id());
              $entity->setNewRevision(FALSE);
              $this->entity = $entity;
            }
            $storage->saveWithoutForcingNewRevision($this->entity);
          }
        }
        else {
          $this->entity->save();
        }
      }
    }
    if ($this->entity) {
      $this->target_revision_id = $this->entity->getRevisionId();
    }
  }

  /**
   * Change the logic around revisions handling.
   *
   * By default multiversion storage forces new revision on entity save.
   * But this should be not done on "postSave" call, as we will finish the save
   * process only after this method call.
   *
   * @see \Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem::postSave()
   * @see \Drupal\multiversion\Entity\Storage\ContentEntityStorageTrait::saveWithoutForcingNewRevision()
   */
  public function postSave($update) {
    $needs_save = FALSE;
    // If any of entity, parent type or parent id is missing then return.
    if (!$this->entity
      || !$this->entity->getEntityType()->get('entity_revision_parent_type_field')
      || !$this->entity->getEntityType()->get('entity_revision_parent_id_field')) {
      return;
    }

    if (!$this->parentIsEnabledEntityType()) {
      // Call source class method if parent entity isn't supported by Multiversion.
      parent::postSave($update);
      return;
    }

    $entity = $this->entity;
    $parent_entity = $this->getEntity();

    // If the entity has a parent field name get the key.
    if ($entity->getEntityType()->get('entity_revision_parent_field_name_field')) {
      $parent_field_name = $entity->getEntityType()->get('entity_revision_parent_field_name_field');

      // If parent field name has changed then set it.
      if ($entity->get($parent_field_name)->value != $this->getFieldDefinition()->getName()) {
        $entity->set($parent_field_name, $this->getFieldDefinition()->getName());
        $needs_save = TRUE;
      }
    }

    $parent_type = $entity->getEntityType()->get('entity_revision_parent_type_field');
    $parent_id = $entity->getEntityType()->get('entity_revision_parent_id_field');

    // If the parent type has changed then set it.
    if ($entity->get($parent_type)->value != $parent_entity->getEntityTypeId()) {
      $entity->set($parent_type, $parent_entity->getEntityTypeId());
      $needs_save = TRUE;
    }
    // If the parent id has changed then set it.
    if ($entity->get($parent_id)->value != $parent_entity->id()) {
      $entity->set($parent_id, $parent_entity->id());
      $needs_save = TRUE;
    }

    if ($needs_save) {
      // Check if any of the keys has changed, save it, do not create a new
      // revision.
      $entity->setNewRevision(FALSE);
      /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
      $entity_type_manager = \Drupal::service('entity_type.manager');
      /** @var \Drupal\multiversion\MultiversionManagerInterface $multiversion_manager */
      $multiversion_manager = \Drupal::service('multiversion.manager');
      $entity_type_id = $entity->getEntityTypeId();
      $entity_type = $entity_type_manager->getDefinition($entity_type_id);

      if ($multiversion_manager->isEnabledEntityType($entity_type)) {
        /** @var \Drupal\multiversion\Entity\Storage\ContentEntityStorageInterface $storage */
        $storage = $entity_type_manager->getStorage($entity_type_id);
        $storage->saveWithoutForcingNewRevision($entity);
      }
    }
  }

  /**
   * Checks whether parent entity is supported by Multiversion or not.
   *
   * @return bool
   *   TRUE if parent entity is supported by Multiversion, FALSE otherwise.
   */
  protected function parentIsEnabledEntityType() {
    $parent_entity = $this->getEntity();
    $parent_entity_type = $parent_entity->getEntityType();
    if (\Drupal::service('multiversion.manager')->isEnabledEntityType($parent_entity_type)) {
      return TRUE;
    }

    return FALSE;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc