diff --git a/media_entity.install b/media_entity.install index d6c1c67..821caf7 100644 --- a/media_entity.install +++ b/media_entity.install @@ -177,6 +177,23 @@ function _media_entity_get_bundles_using_exif() { return $bundles; } +/** + * Gets all media base field overwrites. + * + * @return array[] + * The key is the field name where the overwrite belongs to and the value is + * an array of all bundles the field is used in. + */ +function _media_entity_get_base_field_overwrites() { + $fields = []; + $prefix = 'core.base_field_override.media.'; + foreach (\Drupal::configFactory()->listAll($prefix) as $override) { + list($bundle, $field) = explode('.', substr($override, strlen($prefix))); + $fields[$field][] = $bundle; + } + return $fields; +} + /** * Implements hook_requirements(). */ @@ -387,10 +404,20 @@ function media_entity_update_8201() { /** @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_overwrites = _media_entity_get_base_field_overwrites(); + foreach ($field_renames as $old_field => $new_field) { + $db->changeField('media_revision', $old_field, $new_field, $field_definitions[$new_field]->getColumns()[$field_definitions[$new_field]->getMainPropertyName()]); + if (!empty($field_overwrites[$old_field])) { + foreach ($field_overwrites[$old_field] as $bundle) { + $field_overwrite = $config_factory->getEditable('core.base_field_override.media.' . "$bundle.$old_field"); + $field_overwrite->set('id', "media.$bundle.$new_field"); + $field_overwrite->set('field_name', $new_field); + $field_overwrite->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. $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); diff --git a/tests/fixtures/core.base_field_override.testfor2933338.yml b/tests/fixtures/core.base_field_override.testfor2933338.yml new file mode 100644 index 0000000..60d3eab --- /dev/null +++ b/tests/fixtures/core.base_field_override.testfor2933338.yml @@ -0,0 +1,18 @@ +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 diff --git a/tests/src/Functional/CoreMediaUpdatePathTest.php b/tests/src/Functional/CoreMediaUpdatePathTest.php index 0b5a483..0baf527 100644 --- a/tests/src/Functional/CoreMediaUpdatePathTest.php +++ b/tests/src/Functional/CoreMediaUpdatePathTest.php @@ -3,6 +3,8 @@ namespace Drupal\Tests\media_entity\Functional; use Drupal\Core\Config\Entity\Query\QueryFactory; +use Drupal\Core\Database\Database; +use Drupal\Core\Serialization\Yaml; use Drupal\FunctionalTests\Update\UpdatePathTestBase; /** @@ -129,6 +131,31 @@ class CoreMediaUpdatePathTest extends UpdatePathTestBase { $this->assertEmpty($old_uuid_map); } + /** + * Test that field overwrites are also renamed. + */ + public function testFieldOverwrites() { + $field_overwrites[] = 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_overwrites[0]), + ]) + ->execute(); + + $this->runUpdates(); + + $this->assertTrue($this->config('core.base_field_override.media.image.revision_log')->isNew()); + $this->assertFalse($this->config('core.base_field_override.media.image.revision_log_message')->isNew()); + } + protected function assertFrontPageMedia($link, $assert_selectors) { $this->drupalGet(''); $this->clickLink($link);