From dbd3e25da93d86e0af5084b3e098e06c6716a5c4 Mon Sep 17 00:00:00 2001
From: heddn <lucashedding@1463982.no-reply.drupal.org>
Date: Sat, 7 Jun 2014 09:47:09 -0600
Subject: [PATCH] Issue #2005434 by heddn, swentel: Let 3rd party modules store
 extra configuration in EntityDisplay.

---
 .../field/tests/modules/field_test/field_test.module        |  6 ++++--
 core/modules/field_ui/src/DisplayOverviewBase.php           | 13 ++++++++++++-
 core/modules/field_ui/src/Tests/ManageDisplayTest.php       |  4 ++--
 3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module
index 45a0c0d..7a5a06a 100644
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ b/core/modules/field/tests/modules/field_test/field_test.module
@@ -159,10 +159,11 @@ function field_test_query_efq_metadata_test_alter(&$query) {
  * Implements hook_field_widget_settings_form_alter().
  */
 function field_test_field_widget_settings_form_alter(&$element, &$form_state, $context) {
+  $extra = $context['widget']->getSetting('extra');
   $element['field_test_widget_settings_form_alter'] = array(
     '#type' => 'textfield',
     '#title' => t('Widget settings form alter'),
-    '#default_value' => $context['widget']->getSetting('field_test_widget_settings_form_alter'),
+    '#default_value' => $extra['field_test_widget_settings_form_alter'],
   );
 }
 
@@ -178,10 +179,11 @@ function field_test_field_widget_settings_summary_alter(&$summary, $context) {
  * Implements hook_field_formatter_settings_form_alter().
  */
 function field_test_field_formatter_settings_form_alter(&$element, &$form_state, $context) {
+  $extra = $context['formatter']->getSetting('extra');
   $element['field_test_formatter_settings_form_alter'] = array(
     '#type' => 'textfield',
     '#title' => t('Formatter settings form alter'),
-    '#default_value' => $context['formatter']->getSetting('field_test_formatter_settings_form_alter'),
+    '#default_value' => $extra['field_test_formatter_settings_form_alter'],
   );
 }
 
diff --git a/core/modules/field_ui/src/DisplayOverviewBase.php b/core/modules/field_ui/src/DisplayOverviewBase.php
index 2a6f46f..de1cc4f 100644
--- a/core/modules/field_ui/src/DisplayOverviewBase.php
+++ b/core/modules/field_ui/src/DisplayOverviewBase.php
@@ -348,7 +348,14 @@ protected function buildFieldRow(FieldDefinitionInterface $field_definition, Ent
       if ($plugin) {
         // Generate the settings form and allow other modules to alter it.
         $settings_form = $plugin->settingsForm($form, $form_state);
-        $this->alterSettingsForm($settings_form, $plugin, $field_definition, $form, $form_state);
+        $extra_settings_form = array();
+        $this->alterSettingsForm($extra_settings_form, $plugin, $field_definition, $form, $form_state);
+        if (!empty($extra_settings_form)) {
+          $settings_form['extra'] = array(
+            '#type' => 'container',
+          );
+          $settings_form['extra'][$field_definition->getProvider()] += $extra_settings_form;
+        }
 
         if ($settings_form) {
           $field_row['plugin']['#cell_attributes'] = array('colspan' => 3);
@@ -524,7 +531,11 @@ public function submitForm(array &$form, array &$form_state) {
 
         // Only save settings actually used by the selected plugin.
         $default_settings = $this->pluginManager->getDefaultSettings($values['type']);
+        $extra_settings = !empty($settings['extra']) ? $settings['extra'] : array();
         $settings = array_intersect_key($settings, $default_settings);
+        if (!empty($extra_settings)) {
+          $settings['extra'] = $extra_settings;
+        }
 
         // Default component values.
         $component_values = array(
diff --git a/core/modules/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
index c98d52d..1d7ff48 100644
--- a/core/modules/field_ui/src/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
@@ -101,7 +101,7 @@ function testFormatterUI() {
 
     // Assert that the field added in
     // field_test_field_formatter_settings_form_alter() is present.
-    $fieldname = 'fields[field_test][settings_edit_form][settings][field_test_formatter_settings_form_alter]';
+    $fieldname = 'fields[field_test][settings_edit_form][settings][extra][field_test][field_test_formatter_settings_form_alter]';
     $this->assertField($fieldname, 'The field added in hook_field_formatter_settings_form_alter() is present on the settings form.');
     $edit = array($fieldname => 'foo');
     $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
@@ -194,7 +194,7 @@ public function testWidgetUI() {
 
     // Assert that the field added in
     // field_test_field_widget_settings_form_alter() is present.
-    $fieldname = 'fields[field_test][settings_edit_form][settings][field_test_widget_settings_form_alter]';
+    $fieldname = 'fields[field_test][settings_edit_form][settings][extra][field_test][field_test_widget_settings_form_alter]';
     $this->assertField($fieldname, 'The field added in hook_field_widget_settings_form_alter() is present on the settings form.');
     $edit = array($fieldname => 'foo');
     $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update");
-- 
1.8.3.2

