diff --git a/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php b/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php index ae6771b118..315f3b3fff 100644 --- a/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php +++ b/core/modules/layout_builder/src/Plugin/Derivative/FieldBlockDeriver.php @@ -5,6 +5,7 @@ use Drupal\Component\Plugin\Derivative\DeriverBase; use Drupal\Component\Plugin\PluginBase; use Drupal\Core\Entity\EntityFieldManagerInterface; +use Drupal\Core\Entity\EntityTypeBundleInfoInterface; use Drupal\Core\Entity\EntityTypeRepositoryInterface; use Drupal\Core\Field\FieldConfigInterface; use Drupal\Core\Field\FieldTypePluginManagerInterface; @@ -51,6 +52,13 @@ class FieldBlockDeriver extends DeriverBase implements ContainerDeriverInterface */ protected $formatterManager; + /** + * The bundle info manager. + * + * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface + */ + protected $bundleInfoManager; + /** * Constructs new FieldBlockDeriver. * @@ -62,12 +70,15 @@ class FieldBlockDeriver extends DeriverBase implements ContainerDeriverInterface * The field type manager. * @param \Drupal\Core\Field\FormatterPluginManager $formatter_manager * The formatter manager. + * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $bundle_info_manager + * The bundle info manager. */ - public function __construct(EntityTypeRepositoryInterface $entity_type_repository, EntityFieldManagerInterface $entity_field_manager, FieldTypePluginManagerInterface $field_type_manager, FormatterPluginManager $formatter_manager) { + public function __construct(EntityTypeRepositoryInterface $entity_type_repository, EntityFieldManagerInterface $entity_field_manager, FieldTypePluginManagerInterface $field_type_manager, FormatterPluginManager $formatter_manager, EntityTypeBundleInfoInterface $bundle_info_manager) { $this->entityTypeRepository = $entity_type_repository; $this->entityFieldManager = $entity_field_manager; $this->fieldTypeManager = $field_type_manager; $this->formatterManager = $formatter_manager; + $this->bundleInfoManager = $bundle_info_manager; } /** @@ -78,7 +89,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) { $container->get('entity_type.repository'), $container->get('entity_field.manager'), $container->get('plugin.manager.field.field_type'), - $container->get('plugin.manager.field.formatter') + $container->get('plugin.manager.field.formatter'), + $container->get('entity_type.bundle.info') ); } @@ -88,6 +100,21 @@ public static function create(ContainerInterface $container, $base_plugin_id) { public function getDerivativeDefinitions($base_plugin_definition) { $entity_type_labels = $this->entityTypeRepository->getEntityTypeLabels(); foreach ($this->entityFieldManager->getFieldMap() as $entity_type_id => $entity_field_map) { + // Complete the field map with extra bundle field info. + $entity_type_bundles_list = $this->bundleInfoManager->getBundleInfo($entity_type_id); + $entity_field_map_extra = []; + foreach ($entity_type_bundles_list as $bundle_id => $bundle_label) { + if ($bundle_id != 'default') { + $bundle_field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle_id); + foreach ($bundle_field_definitions as $bundle_field_name => $bundle_field_definition) { + if (!isset($entity_field_map[$bundle_field_name])) { + $entity_field_map_extra[$bundle_field_name]['type'] = $bundle_field_definition->getType(); + $entity_field_map_extra[$bundle_field_name]['bundles'][$bundle_id] = $bundle_id; + } + } + } + } + $entity_field_map = array_merge($entity_field_map, $entity_field_map_extra); foreach ($entity_field_map as $field_name => $field_info) { // Skip fields without any formatters. $options = $this->formatterManager->getOptions($field_info['type']);