You are here

entity_schema_test.module in Drupal 8

Test module for the entity API providing a bundle field.

File

core/modules/system/tests/modules/entity_schema_test/entity_schema_test.module
View source
<?php

/**
 * @file
 * Test module for the entity API providing a bundle field.
 */
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldDefinition;
use Drupal\entity_test\FieldStorageDefinition;
use Drupal\entity_test\Entity\EntityTestMulRev;

/**
 * Implements hook_entity_type_alter().
 */
function entity_schema_test_entity_type_alter(array &$entity_types) {

  // Allow a test to tell us whether or not to alter the entity type.
  if (\Drupal::state()
    ->get('entity_schema_update')) {
    $entity_type = $entity_types['entity_test_update'];
    if ($entity_type instanceof ContentEntityTypeInterface) {
      $entity_type
        ->set('translatable', TRUE);
      $entity_type
        ->set('data_table', 'entity_test_update_data');

      // Update the keys with a revision ID.
      $keys = $entity_type
        ->getKeys();
      $keys['revision'] = 'revision_id';
      $entity_type
        ->set('entity_keys', $keys);

      // We can't use getRevisionMetadataKeys() because it causes recursion.
      $revision_metadata_keys = $entity_type
        ->get('revision_metadata_keys');
      $revision_metadata_keys = array_merge($revision_metadata_keys, [
        'revision_log_message' => 'revision_log',
      ]);
      $entity_type
        ->set('revision_metadata_keys', $revision_metadata_keys);
    }
  }
}

/**
 * Implements hook_entity_base_field_info().
 */
function entity_schema_test_entity_base_field_info(EntityTypeInterface $entity_type) {
  if ($entity_type
    ->id() == 'entity_test_update') {
    $definitions['custom_base_field'] = BaseFieldDefinition::create('string')
      ->setName('custom_base_field')
      ->setLabel(t('A custom base field'));
    if (\Drupal::state()
      ->get('entity_schema_update')) {
      $definitions += EntityTestMulRev::baseFieldDefinitions($entity_type);

      // And add a revision log.
      $definitions['revision_log'] = BaseFieldDefinition::create('string_long')
        ->setLabel(t('Revision log message'))
        ->setDescription(t('The log entry explaining the changes in this revision.'))
        ->setRevisionable(TRUE);
    }
    return $definitions;
  }
}

/**
 * Implements hook_entity_field_storage_info().
 */
function entity_schema_test_entity_field_storage_info(EntityTypeInterface $entity_type) {
  if ($entity_type
    ->id() == 'entity_test_update') {
    $definitions['custom_bundle_field'] = FieldStorageDefinition::create('string')
      ->setName('custom_bundle_field')
      ->setLabel(t('A custom bundle field'))
      ->setRevisionable(TRUE)
      ->setTargetEntityTypeId($entity_type
      ->id());
    return $definitions;
  }
}

/**
 * Implements hook_entity_bundle_field_info().
 */
function entity_schema_test_entity_bundle_field_info(EntityTypeInterface $entity_type, $bundle) {
  if ($entity_type
    ->id() == 'entity_test_update' && $bundle == 'custom') {

    /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface $custom_bundle_field_storage */
    $custom_bundle_field_storage = entity_schema_test_entity_field_storage_info($entity_type)['custom_bundle_field'];
    $definitions[$custom_bundle_field_storage
      ->getName()] = FieldDefinition::createFromFieldStorageDefinition($custom_bundle_field_storage);
    return $definitions;
  }
}

/**
 * Implements hook_entity_bundle_create().
 */
function entity_schema_test_entity_bundle_create($entity_type_id, $bundle) {
  if ($entity_type_id == 'entity_test_update' && $bundle == 'custom') {
    $field_definitions = \Drupal::service('entity_field.manager')
      ->getFieldDefinitions($entity_type_id, $bundle);

    // Notify the entity storage that we just created a new field.
    \Drupal::service('field_definition.listener')
      ->onFieldDefinitionCreate($field_definitions['custom_bundle_field']);
  }
}

/**
 * Implements hook_entity_bundle_delete().
 */
function entity_schema_test_entity_bundle_delete($entity_type_id, $bundle) {
  if ($entity_type_id == 'entity_test_update' && $bundle == 'custom') {
    $field_definitions = \Drupal::service('entity_field.manager')
      ->getFieldDefinitions($entity_type_id, $bundle);

    // Notify the entity storage that our field is gone.
    \Drupal::service('field_definition.listener')
      ->onFieldDefinitionDelete($field_definitions['custom_bundle_field']);
    \Drupal::service('field_storage_definition.listener')
      ->onFieldStorageDefinitionDelete($field_definitions['custom_bundle_field']
      ->getFieldStorageDefinition());
  }
}