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]);