diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml index 2fc9d2c..174925d 100644 --- a/core/config/schema/core.entity.schema.yml +++ b/core/config/schema/core.entity.schema.yml @@ -366,6 +366,18 @@ field.formatter.settings.entity_reference_inline_settings: type: mapping label: 'Entity reference inline formatter display format settings' mapping: + field_name: + label: 'Machine name of the field' + type: string + type: + label: 'Machine name of the formatter' + type: string + settings: + label: 'Formatter settings' + type: field.formatter.settings.[%parent.type] + label: + label: 'Target field label visibility setting' + type: string show_basefields: type: boolean label: 'Whether basefields should be visible on the formatter settings' diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceInlineSettingsFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceInlineSettingsFormatter.php index eadefcf..b87d62b 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceInlineSettingsFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceInlineSettingsFormatter.php @@ -3,6 +3,7 @@ namespace Drupal\Core\Field\Plugin\Field\FieldFormatter; use Drupal\Core\Entity\Entity\EntityViewDisplay; +use Drupal\Core\Entity\EntityTypeBundleInfoInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\Core\Field\BaseFieldDefinition; @@ -58,6 +59,13 @@ class EntityReferenceInlineSettingsFormatter extends EntityReferenceFormatterBas protected $entityTypeManager; /** + * The entity type bundle info. + * + * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface + */ + protected $entityTypeBundleInfo; + + /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { @@ -71,7 +79,8 @@ public static function create(ContainerInterface $container, array $configuratio $configuration['third_party_settings'], $container->get('entity_field.manager'), $container->get('plugin.manager.field.formatter'), - $container->get('entity_type.manager') + $container->get('entity_type.manager'), + $container->get('entity_type.bundle.info') ); } @@ -98,20 +107,28 @@ public static function create(ContainerInterface $container, array $configuratio * The formatter plugin manager. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. + * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info + * The entity type bundle info. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityFieldManager $entity_field_manager, FormatterPluginManager $formatter_plugin_manager, EntityTypeManagerInterface $entity_type_manager) { + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityFieldManager $entity_field_manager, FormatterPluginManager $formatter_plugin_manager, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info) { parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); $this->entityFieldManager = $entity_field_manager; $this->formatterPluginManager = $formatter_plugin_manager; $this->entityTypeManager = $entity_type_manager; + $this->entityTypeBundleInfo = $entity_type_bundle_info; } /** * {@inheritdoc} */ public static function defaultSettings() { - - return parent::defaultSettings() + ['show_basefields' => FALSE]; + return [ + 'field_name' => '', + 'type' => '', + 'settings' => [], + 'label' => 'above', + 'show_basefields' => FALSE, + ]; } /** @@ -144,22 +161,19 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** * Gets a list of supported fields. * - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The form state. + * @param bool $show_basefields + * If FALSE, all basefields except for the label will be skipped. * * @return array * List of fields that are supported keyed by field machine name. */ - protected function getAvailableFieldNames(FormStateInterface $form_state) { + protected function getAvailableFieldNames($show_basefields) { $entity_type_id = $this->fieldDefinition->getSetting('target_type'); // We always show the entity label as an option to be selected. $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); $label_key = $entity_type->getKey('label'); $field_names = [$label_key => $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id)[$label_key]->getLabel()]; - /** @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface $bundle_info */ - $bundle_info = \Drupal::service('entity_type.bundle.info'); - $target_bundles = $this->fieldDefinition->getSetting('handler_settings')['target_bundles'] === NULL ? array_keys($bundle_info->getBundleInfo($entity_type_id)) : $this->fieldDefinition->getSetting('handler_settings')['target_bundles']; - $show_basefields = $this->getSettingFromFormState($form_state, 'show_basefields'); + $target_bundles = $this->fieldDefinition->getSetting('handler_settings')['target_bundles'] === NULL ? array_keys($this->entityTypeBundleInfo->getBundleInfo($entity_type_id)) : $this->fieldDefinition->getSetting('handler_settings')['target_bundles']; foreach ($target_bundles as $value) { $bundle_field_names = array_map( function (FieldDefinitionInterface $field_definition) use ($show_basefields) { @@ -184,7 +198,7 @@ public static function isApplicable(FieldDefinitionInterface $field_definition) } /** - * Get all available formatters for a field storage definition.. + * Get all available formatters for a field storage definition. * * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $field_storage_definition * The field storage definition. @@ -277,11 +291,11 @@ public static function rebuildSubmit(array $form, FormStateInterface $form_state public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); $target_entity_type_id = $this->fieldDefinition->getSetting('target_type'); - $field_name_options = $this->getAvailableFieldNames($form_state); + $show_basefields = $this->getSettingFromFormState($form_state, 'show_basefields'); + $field_name_options = $this->getAvailableFieldNames($show_basefields); $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($target_entity_type_id); // Field on the target entity this formatter is currently displaying. $selected_field_name = $this->getSettingFromFormState($form_state, 'field_name'); - $show_basefields = $this->getSettingFromFormState($form_state, 'show_basefields'); if (!$selected_field_name) { // The first field is used as default in case of no value set. $selected_field_name = key($field_name_options); @@ -314,7 +328,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { $form['show_basefields'] = [ '#type' => 'checkbox', '#title' => $this->t('Show all fields'), - '#description' => $this->t('Allows basefields to be selected, such as author, language, creation date, etc.'), + '#description' => $this->t('Allows default fields to be selected, such as author, language, creation date, etc.'), '#default_value' => $show_basefields, '#ajax' => [ 'callback' => [static::class, 'onShowBasefieldsChange'], @@ -428,17 +442,29 @@ protected function createFormatterEntityViewDisplay($bundle_id) { */ public function settingsSummary() { $summary = parent::settingsSummary(); + $field_storage_definitions = NULL; if ($field_name = $this->getSetting('field_name')) { $summary[] = $this->t('Field %field_name displayed.', ['%field_name' => $field_name]); } else { - $summary[] = $this->t('Field not configured. The entity label will be used.'); + $show_basefields = $this->getSetting('show_basefields'); + $field_name_options = $this->getAvailableFieldNames($show_basefields); + $target_entity_type_id = $this->fieldDefinition->getSetting('target_type'); + $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($target_entity_type_id); + $field_name = key($field_name_options); + $summary[] = $this->t('The field %field_name will be used by default.', ['%field_name' => $field_name]); } if ($type = $this->getSetting('type')) { $summary[] = $this->t('Formatter %type used.', ['%type' => $type]); } + elseif ($field_storage_definitions) { + $field_storage = $field_storage_definitions[$field_name]; + $formatter_options = $this->getAvailableFormatterOptions($field_storage); + $formatter_type = key($formatter_options); + $summary[] = $this->t('The %type formatter will be used by default.', ['%type' => $formatter_type]); + } else { $summary[] = $this->t('Formatter not configured. The first formatter will be used.'); } @@ -450,6 +476,7 @@ public function settingsSummary() { * Wrapper around ::getSetting() to carry over values from the form state. * * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state. * @param string $setting * The setting name. *