You are here

function multiversion_entity_type_alter in Multiversion 8.2

Same name and namespace in other branches
  1. 8 multiversion.module \multiversion_entity_type_alter()

Implements hook_entity_type_alter().

Parameters

\Drupal\Core\Entity\EntityTypeInterface[] $entity_types:

File

./multiversion.module, line 31

Code

function multiversion_entity_type_alter(array &$entity_types) {

  /** @var \Drupal\multiversion\MultiversionManagerInterface $manager */
  $manager = \Drupal::service('multiversion.manager');
  foreach ($entity_types as $entity_type) {
    if ($manager
      ->allowToAlter($entity_type)) {
      $entity_keys = $entity_type
        ->getKeys();

      // Add the 'published' entity key to the entity type.
      if (empty($entity_keys['published'])) {
        $entity_keys['published'] = 'status';
        $entity_type
          ->set('entity_keys', $entity_keys);
      }

      // Make all content entity types revisionable.
      if (!$entity_type
        ->isRevisionable()) {

        // We only need to set the revision key to make an entity type
        // revisionable. The table names will be handled by the storage class.
        // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout
        $entity_keys['revision'] = 'revision_id';
        $entity_type
          ->set('entity_keys', $entity_keys);
        if ($entity_type
          ->getRevisionTable() === null) {
          $entity_type
            ->set('revision_table', $entity_type
            ->id() . '_revision');
        }
        if ($entity_type
          ->getRevisionDataTable() === null) {
          $entity_type
            ->set('revision_data_table', $entity_type
            ->id() . '_field_revision');
        }
      }
      $namespace = 'Drupal\\multiversion\\Entity\\Storage\\Sql';
      $original_storage_class = $entity_type
        ->getHandlerClass('storage');
      $entity_type
        ->setHandlerClass('original_storage', $original_storage_class);
      switch ($entity_type
        ->id()) {
        case 'node':
          $entity_type
            ->setHandlerClass('storage', "{$namespace}\\NodeStorage");
          break;
        case 'taxonomy_term':
          $entity_type
            ->setHandlerClass('storage', "{$namespace}\\TermStorage");
          break;
        case 'comment':
          $entity_type
            ->setHandlerClass('storage', "{$namespace}\\CommentStorage");
          break;
        case 'menu_link_content':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\MenuLinkContent');
          $entity_type
            ->setHandlerClass('storage', "{$namespace}\\MenuLinkContentStorage");
          break;
        case 'file':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\File');
          $entity_type
            ->setHandlerClass('storage', "{$namespace}\\FileStorage");
          break;
        case 'media':
          $entity_type
            ->setHandlerClass('storage', "{$namespace}\\MediaStorage");
          break;
        case 'shortcut':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\Shortcut');
          if (in_array($original_storage_class, [
            NULL,
            'Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage',
          ])) {
            $entity_type
              ->setHandlerClass('storage', "{$namespace}\\ContentEntityStorage");
          }
          break;
        case 'entity_test':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\EntityTest');
          if (in_array($original_storage_class, [
            NULL,
            'Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage',
          ])) {
            $entity_type
              ->setHandlerClass('storage', "{$namespace}\\ContentEntityStorage");
          }
          break;
        case 'entity_test_mul':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\EntityTestMul');
          if (in_array($original_storage_class, [
            NULL,
            'Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage',
          ])) {
            $entity_type
              ->setHandlerClass('storage', "{$namespace}\\ContentEntityStorage");
          }
          break;
        case 'entity_test_rev':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\EntityTestRev');
          if (in_array($original_storage_class, [
            NULL,
            'Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage',
          ])) {
            $entity_type
              ->setHandlerClass('storage', "{$namespace}\\ContentEntityStorage");
          }
          break;
        case 'entity_test_mulrev':
          $entity_type
            ->setClass('Drupal\\multiversion\\Entity\\EntityTestMulRev');
          if (in_array($original_storage_class, [
            NULL,
            'Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage',
          ])) {
            $entity_type
              ->setHandlerClass('storage', "{$namespace}\\ContentEntityStorage");
          }
          break;
        default:
          $storage_class = $entity_type
            ->getHandlerClass('storage');

          // We can only override the storage handler for entity types we know
          // what to expect of.
          if (in_array($storage_class, [
            NULL,
            'Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage',
          ])) {
            $entity_type
              ->setHandlerClass('storage', "{$namespace}\\ContentEntityStorage");
          }
          break;
      }
    }
  }
  if (isset($entity_types['block_content']) && $manager
    ->allowToAlter($entity_types['block_content'])) {
    $entity_types['block']
      ->setHandlerClass('storage', 'Drupal\\multiversion\\Entity\\Storage\\Sql\\BlockStorage');
  }
}