diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFieldFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFieldFormatter.php index 0e38d33..defc70a 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFieldFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceFieldFormatter.php @@ -267,15 +267,9 @@ public static function rebuildOnSubmit(array &$form, FormStateInterface $form_st 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->getAvailableFieldOptions(); $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($target_entity_type_id); // Field on the target entity this formatter is currently displaying. - $selected_field_name = $this->getSetting('field_name', $form_state); - if (!$selected_field_name) { - // The first field is used as default in case of no value set. - $selected_field_name = array_keys($field_name_options)[0]; - } - $field_storage = $field_storage_definitions[$selected_field_name]; + $selected_field_name = $this->getFieldName($form_state)['machine_name']; $form['#prefix'] = '
'; $form['#suffix'] = '
'; @@ -284,7 +278,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#type' => 'select', '#title' => $this->t('Field name'), '#default_value' => $selected_field_name, - '#options' => $field_name_options, + '#options' => $this->getAvailableFieldOptions(), '#ajax' => [ 'callback' => [static::class, 'onFieldNameChange'], 'wrapper' => 'field-formatter-ajax', @@ -302,13 +296,10 @@ public function settingsForm(array $form, FormStateInterface $form_state) { ]; if ($selected_field_name) { + $field_storage = $field_storage_definitions[$selected_field_name]; $formatter_options = $this->getAvailableFormatterOptions($field_storage); - $formatter_type = $this->getSetting('type', $form_state); - $settings = $this->getSetting('settings', $form_state); - if (!isset($formatter_options[$formatter_type])) { - $formatter_type = array_keys($formatter_options)[0]; - $settings = []; - } + $formatter_type = $this->getFormatterType($selected_field_name, $form_state); + $settings = $this->getSetting('settings', $form_state) ?: []; $form['type'] = [ '#type' => 'select', @@ -402,6 +393,9 @@ public function getSetting($key, FormStateInterface $form_state = NULL) { /** * Gets the field to be used in this formatter. * + * @param \Drupal\Core\Form\FormStateInterface $form_state + * (optional) The form state object. + * * @return array * An associative array containing: * - machine_name: The field machine name. @@ -411,9 +405,9 @@ public function getSetting($key, FormStateInterface $form_state = NULL) { * * @see \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceReferencedEntityFieldFormatter::getAvailableFieldOptions() */ - protected function getFieldName() { + protected function getFieldName(FormStateInterface $form_state = NULL) { $field_name_options = $this->getAvailableFieldOptions(); - if (!$field_name = $this->getSetting('field_name')) { + if (!$field_name = $this->getSetting('field_name', $form_state)) { $field_name = array_keys($field_name_options)[0]; } $field['machine_name'] = $field_name; @@ -426,6 +420,8 @@ protected function getFieldName() { * * @param string $field_name * The machine name of the target field. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * (optional) The form state object. * * @return array * An associative array containing: @@ -436,12 +432,12 @@ protected function getFieldName() { * * @see \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceReferencedEntityFieldFormatter::getAvailableFormatterOptions() */ - protected function getFormatterType($field_name) { + protected function getFormatterType($field_name, FormStateInterface $form_state = NULL) { $formatter = [ 'machine_name' => NULL, 'label' => NULL, ]; - if (!$formatter_type = $this->getSetting('type')) { + if (!$formatter_type = $this->getSetting('type', $form_state)) { $target_entity_type_id = $this->fieldDefinition->getSetting('target_type'); $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($target_entity_type_id); $formatter_options = $this->getAvailableFormatterOptions($field_storage_definitions[$field_name]);