entityTypeRepository = $entity_type_repository; $this->entityFieldManager = $entity_field_manager; $this->fieldTypeManager = $field_type_manager; $this->formatterManager = $formatter_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, $base_plugin_id) { return new static( $container->get('entity_type.repository'), $container->get('entity_field.manager'), $container->get('plugin.manager.field.field_type'), $container->get('plugin.manager.field.formatter') ); } /** * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { $entity_type_labels = $this->entityTypeRepository->getEntityTypeLabels(); foreach ($this->entityFieldManager->getFieldMap() as $entity_type_id => $entity_field_map) { foreach ($entity_field_map as $field_name => $field_info) { // Skip fields without any formatters. $options = $this->formatterManager->getOptions($field_info['type']); if (empty($options)) { continue; } foreach ($field_info['bundles'] as $bundle) { $derivative = $base_plugin_definition; $field_definition = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle)[$field_name]; // Store the default formatter on the definition. $derivative['default_formatter'] = ''; $field_type_definition = $this->fieldTypeManager->getDefinition($field_info['type']); if (isset($field_type_definition['default_formatter'])) { $derivative['default_formatter'] = $field_type_definition['default_formatter']; } $derivative['category'] = $this->t('@entity', ['@entity' => $entity_type_labels[$entity_type_id]]); $derivative['admin_label'] = $field_definition->getLabel(); // Add a dependency on the field if it is configurable. if ($field_definition instanceof FieldConfigInterface) { $derivative['config_dependencies'][$field_definition->getConfigDependencyKey()][] = $field_definition->getConfigDependencyName(); } // For any field that is not display configurable, mark it as // unavailable to place in the block UI. $derivative['_block_ui_hidden'] = !$field_definition->isDisplayConfigurable('view'); $context_definition = EntityContextDefinition::fromEntityTypeId($entity_type_id)->setLabel($entity_type_labels[$entity_type_id]); $context_definition->addConstraint('Bundle', [$bundle]); $derivative['context'] = [ 'entity' => $context_definition, ]; $derivative_id = $entity_type_id . PluginBase::DERIVATIVE_SEPARATOR . $bundle . PluginBase::DERIVATIVE_SEPARATOR . $field_name; $this->derivatives[$derivative_id] = $derivative; } } } return $this->derivatives; } }