Commit cc4374d0 authored by Christian Fritsch's avatar Christian Fritsch Committed by Christian Fritsch
Browse files

Issue #2933338 by chr.fritsch, phenaproxima, alexpott: Media Entity upgrade...

Issue #2933338 by chr.fritsch, phenaproxima, alexpott: Media Entity upgrade path does not revert overridden base fields
parent 091de415
Loading
Loading
Loading
Loading
+39 −5
Original line number Diff line number Diff line
@@ -177,6 +177,23 @@ function _media_entity_get_bundles_using_exif() {
  return $bundles;
}

/**
 * Gets all media base field overrides.
 *
 * @return array[]
 *   The key is the field name where the override belongs to and the value is
 *   an array of all bundles the field is used in.
 */
function _media_entity_get_base_field_overrides() {
  $fields = [];
  $prefix = 'core.base_field_override.media.';
  foreach (\Drupal::configFactory()->listAll($prefix) as $override) {
    list($bundle, $field) = explode('.', mb_substr($override, mb_strlen($prefix)));
    $fields[$field][] = $bundle;
  }
  return $fields;
}

/**
 * Implements hook_requirements().
 */
@@ -384,14 +401,31 @@ function media_entity_update_8201() {
  }
  unset($snapshots);

  // Fix the schema.
  // Renames the revision fields in the media_revision table and ensures that
  // overrides of these fields are also changed properly.
  /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $field_definitions */
  $field_definitions = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions('media');
  $db = Database::getConnection()->schema();
  $db->changeField('media_revision', 'revision_uid', 'revision_user', $field_definitions['revision_user']->getColumns()[$field_definitions['revision_user']->getMainPropertyName()]);
  $db->changeField('media_revision', 'revision_timestamp', 'revision_created', $field_definitions['revision_created']->getColumns()[$field_definitions['revision_created']->getMainPropertyName()]);
  $db->changeField('media_revision', 'revision_log', 'revision_log_message', $field_definitions['revision_log_message']->getColumns()[$field_definitions['revision_log_message']->getMainPropertyName()]);

  $field_renames = [
    'revision_uid' => 'revision_user',
    'revision_timestamp' => 'revision_created',
    'revision_log' => 'revision_log_message',
  ];
  $field_overrides = _media_entity_get_base_field_overrides();
  foreach ($field_renames as $old_field => $new_field) {
    $field_columns = $field_definitions[$new_field]->getColumns();
    $field_property_name = $field_definitions[$new_field]->getMainPropertyName();
    $db->changeField('media_revision', $old_field, $new_field, $field_columns[$field_property_name]);
    if (!empty($field_overrides[$old_field])) {
      foreach ($field_overrides[$old_field] as $bundle) {
        $config_factory->getEditable("core.base_field_override.media.$bundle.$old_field")
          ->set('id', "media.$bundle.$new_field")
          ->set('field_name', $new_field)
          ->save(TRUE);
        $config_factory->rename("core.base_field_override.media.$bundle.$old_field", "core.base_field_override.media.$bundle.$new_field");
      }
    }
  }
  // Delete file/image media types automatically created by core media and
  // associated fields.
  foreach ($prefixes as $prefix) {
+18 −0
Original line number Diff line number Diff line
uuid: a217bb4a-0bfe-4616-87af-e1ea1f18dbf9
langcode: en
status: true
dependencies:
  config:
    - media_entity.bundle.image
id: media.image.revision_log
field_name: revision_log
entity_type: media
bundle: image
label: 'Revision Log'
description: 'The log entry explaining the changes in this revision.'
required: false
translatable: true
default_value: {  }
default_value_callback: ''
settings: {  }
field_type: string_long
+29 −0
Original line number Diff line number Diff line
@@ -171,6 +171,35 @@ class CoreMediaUpdatePathTest extends UpdatePathTestBase {
    $this->assertArraySubset($this->config('core.entity_view_mode.media.full')->get('dependencies'), ['module' => ['media']]);
  }

  /**
   * Test that field overrides are also renamed.
   */
  public function testFieldOverrides() {
    $field_overrides = Yaml::decode(file_get_contents(__DIR__ . '/../../fixtures/core.base_field_override.testfor2933338.yml'));
    $connection = Database::getConnection();
    $connection->insert('config')
      ->fields([
        'collection',
        'name',
        'data',
      ])
      ->values([
        'collection' => '',
        'name' => 'core.base_field_override.media.image.revision_log',
        'data' => serialize($field_overrides),
      ])
      ->execute();

    $this->runUpdates();

    $this->assertTrue($this->config('core.base_field_override.media.image.revision_log')->isNew());
    $new_field_config = $this->config('core.base_field_override.media.image.revision_log_message');
    $this->assertFalse($new_field_config->isNew());
    $this->assertArraySubset($new_field_config->get('dependencies'), ['config' => ['media.type.image']]);
    $this->assertSame('media.image.revision_log_message', $new_field_config->get('id'));
    $this->assertSame('revision_log_message', $new_field_config->get('field_name'));
  }

  /**
   * Clicks a link on the front page and checks for some selectors.
   *