diff --git a/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php b/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php index ccbe1a9d262d29b448afdde2224961b88b2c2029..e4ba1d69f3ec56ef3deb51266964ae5dcce306f7 100644 --- a/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php +++ b/core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php @@ -9,6 +9,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\Field\EntityReferenceFieldItemList; /** * The media library opener for field widgets. @@ -95,7 +96,9 @@ public function checkAccess(MediaLibraryState $state, AccountInterface $account) $items = $entity->get($field_name); $field_definition = $items->getFieldDefinition(); - if ($field_definition->getType() !== 'entity_reference') { + // Check that the field is an entity reference, or subclass of it, since we + // need to check the target_type setting. + if (!$items instanceof EntityReferenceFieldItemList) { throw new \LogicException('Expected the media library to be opened by an entity reference field.'); } if ($field_definition->getFieldStorageDefinition()->getSetting('target_type') !== 'media') { diff --git a/core/modules/media_library/tests/modules/media_library_test/config/schema/media_library_test.yml b/core/modules/media_library/tests/modules/media_library_test/config/schema/media_library_test.yml new file mode 100644 index 0000000000000000000000000000000000000000..ac8f8c9fa2142bece995161d43e203ac2ee1d29a --- /dev/null +++ b/core/modules/media_library/tests/modules/media_library_test/config/schema/media_library_test.yml @@ -0,0 +1,7 @@ +field.storage_settings.entity_reference_subclass: + type: base_entity_reference_field_settings + label: 'Entity reference subclass field storage settings' + +field.field_settings.entity_reference_subclass: + type: field.field_settings.entity_reference + label: 'Entity reference subclass field settings' diff --git a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module index 20a285d53cac767d820c3c77ca3cf5005a74adf5..26d0362e17fb1a581c8a0a24e106986a747b2520 100644 --- a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module +++ b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module @@ -39,3 +39,10 @@ function media_library_test_entity_type_alter(array &$entity_types) { $entity_types['node']->setFormClass('edit', TestNodeFormOverride::class); } } + +/** + * Implements hook_field_widget_info_alter(). + */ +function media_library_test_field_widget_info_alter(array &$info) { + $info['media_library_widget']['field_types'][] = 'entity_reference_subclass'; +} diff --git a/core/modules/media_library/tests/modules/media_library_test/src/Plugin/Field/FieldType/EntityReferenceItemSubclass.php b/core/modules/media_library/tests/modules/media_library_test/src/Plugin/Field/FieldType/EntityReferenceItemSubclass.php new file mode 100644 index 0000000000000000000000000000000000000000..e065d3aed4fecff5c567e47fa9515c5161dd84af --- /dev/null +++ b/core/modules/media_library/tests/modules/media_library_test/src/Plugin/Field/FieldType/EntityReferenceItemSubclass.php @@ -0,0 +1,21 @@ +<?php + +namespace Drupal\media_library_test\Plugin\Field\FieldType; + +use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem; + +/** + * Plugin implementation of the 'entity_reference_subclass' field type. + * + * @FieldType( + * id = "entity_reference_subclass", + * label = @Translation("Entity reference subclass"), + * description = @Translation("An entity field containing an entity reference."), + * category = @Translation("Reference"), + * default_widget = "entity_reference_autocomplete", + * default_formatter = "entity_reference_label", + * list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList" + * ) + */ +class EntityReferenceItemSubclass extends EntityReferenceItem { +} diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php index b8fa3d268c2cf3ca97baf45e6e5059b01c3332a9..e61776238f042f642545c9bce34cd88804b4f4f0 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php @@ -256,12 +256,30 @@ public function testFieldWidgetEntityEditAccess() { $this->assertAccess($access_result, TRUE, NULL, Views::getView('media_library')->storage->getCacheTags(), ['url.query_args', 'user.permissions']); } + /** + * Data provider for ::testFieldWidgetEntityFieldAccess(). + * + * @return array[] + * Sets of arguments to pass to the test method. + */ + public function providerFieldWidgetEntityFieldAccess(): array { + return [ + ['entity_reference'], + ['entity_reference_subclass'], + ]; + } + /** * Tests that the field widget opener respects entity field-level access. + * + * @param string $field_type + * The field type. + * + * @dataProvider providerFieldWidgetEntityFieldAccess */ - public function testFieldWidgetEntityFieldAccess() { + public function testFieldWidgetEntityFieldAccess(string $field_type) { $field_storage = FieldStorageConfig::create([ - 'type' => 'entity_reference', + 'type' => $field_type, 'entity_type' => 'entity_test', // The media_library_test module will deny access to this field. // @see media_library_test_entity_field_access()