diff -u b/core/lib/Drupal/Core/Field/FormatterPluginManager.php b/core/lib/Drupal/Core/Field/FormatterPluginManager.php --- b/core/lib/Drupal/Core/Field/FormatterPluginManager.php +++ b/core/lib/Drupal/Core/Field/FormatterPluginManager.php @@ -68,7 +68,7 @@ return $plugin_class::create(\Drupal::getContainer(), $configuration, $plugin_id, $plugin_definition); } - return new $plugin_class($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode']); + return new $plugin_class($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings']); } /** @@ -123,6 +123,7 @@ $configuration += array( 'field_definition' => $field_definition, 'view_mode' => $options['view_mode'], + 'third_party_settings' => array(), ); return $this->createInstance($plugin_id, $configuration); } @@ -143,6 +144,7 @@ $configuration += array( 'label' => 'above', 'settings' => array(), + 'third_party_settings' => array(), ); // If no formatter is specified, use the default formatter. if (!isset($configuration['type'])) { @@ -152,11 +154,6 @@ // Fill in default settings values for the formatter. $configuration['settings'] += $this->getDefaultSettings($configuration['type']); - // Remove empty third party settings. - if (empty($configuration['settings']['third_party'])) { - unset($configuration['settings']['third_party']); - } - return $configuration; } diff -u b/core/lib/Drupal/Core/Field/PluginSettingsBase.php b/core/lib/Drupal/Core/Field/PluginSettingsBase.php --- b/core/lib/Drupal/Core/Field/PluginSettingsBase.php +++ b/core/lib/Drupal/Core/Field/PluginSettingsBase.php @@ -24,6 +24,15 @@ protected $settings = array(); /** + * The plugin settings injected by third party modules. + * + * @see hooks + * + * @var array + */ + protected $thirdPartySettings = array(); + + /** * Whether default settings have been merged into the current $settings. * * @var bool @@ -34,7 +43,7 @@ * {@inheritdoc} */ public static function defaultSettings() { - return array('third_party' => array()); + return array(); } /** @@ -88,8 +97,8 @@ * {@inheritdoc} */ public function getThirdPartySetting($module, $key) { - if (isset($this->settings['third_party'][$module][$key])) { - return $this->settings['third_party'][$module][$key]; + if (isset($this->thirdPartySettings[$module][$key])) { + return $this->thirdPartySettings[$module][$key]; } return NULL; } @@ -98,7 +107,7 @@ * {@inheritdoc} */ public function setThirdPartySetting($module, $key, $value) { - $this->settings['third_party'][$module][$key] = $value; + $this->thirdPartySettings[$module][$key] = $value; return $this; } diff -u b/core/lib/Drupal/Core/Field/WidgetPluginManager.php b/core/lib/Drupal/Core/Field/WidgetPluginManager.php --- b/core/lib/Drupal/Core/Field/WidgetPluginManager.php +++ b/core/lib/Drupal/Core/Field/WidgetPluginManager.php @@ -108,6 +108,7 @@ $configuration += array( 'field_definition' => $field_definition, + 'third_party_settings' => array(), ); return $this->createInstance($plugin_id, $configuration); } @@ -124,7 +125,7 @@ return $plugin_class::create(\Drupal::getContainer(), $configuration, $plugin_id, $plugin_definition); } - return new $plugin_class($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings']); + return new $plugin_class($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['third_party_settings']); } @@ -143,6 +144,7 @@ // Fill in defaults for missing properties. $configuration += array( 'settings' => array(), + 'third_party_settings' => array(), ); // If no widget is specified, use the default widget. if (!isset($configuration['type'])) { @@ -152,11 +154,6 @@ // Fill in default settings values for the widget. $configuration['settings'] += $this->getDefaultSettings($configuration['type']); - // Remove empty third party settings. - if (empty($configuration['settings']['third_party'])) { - unset($configuration['settings']['third_party']); - } - return $configuration; } diff -u b/core/modules/entity/config/schema/entity.schema.yml b/core/modules/entity/config/schema/entity.schema.yml --- b/core/modules/entity/config/schema/entity.schema.yml +++ b/core/modules/entity/config/schema/entity.schema.yml @@ -115,39 +115,13 @@ # Default schema for entity display field with undefined type. entity_view_display.field.*: - type: mapping + type: entity_field_view_display_base label: 'Entity display default' - mapping: - visible: - type: boolean - label: 'Visibility' - weight: - type: integer - label: 'Weight' - settings: - type: mapping - label: 'Settings' - mapping: - third_party: - type: entity_view_display.third_party.[%key] # Default schema for entity form display field with undefined type. entity_form_display.field.*: - type: mapping + type: entity_field_form_display_base label: 'Entity form display default' - mapping: - visible: - type: boolean - label: 'Visibility' - weight: - type: integer - label: 'Weight' - settings: - type: mapping - label: 'Settings' - mapping: - third_party: - type: entity_form_display.third_party.[%key] entity_form_display.field.string: type: entity_field_form_display_base diff -u b/core/modules/entity/src/EntityDisplayBase.php b/core/modules/entity/src/EntityDisplayBase.php --- b/core/modules/entity/src/EntityDisplayBase.php +++ b/core/modules/entity/src/EntityDisplayBase.php @@ -178,8 +178,8 @@ $this->addDependency('module', $definition['provider']); } // Create dependencies on any modules providing third party settings. - if (isset($component['settings']['third_party'])) { - foreach($component['settings']['third_party'] as $module => $settings) { + if (isset($component['third_party_settings'])) { + foreach($component['third_party_settings'] as $module => $settings) { $this->addDependency('module', $module); } } @@ -303,6 +303,11 @@ $options = $this->pluginManager->prepareConfiguration($field_definition->getType(), $options); } + // Remove unnecessary empty third_party_settings. + if (empty($options['third_party_settings'])) { + unset($options['third_party_settings']); + } + $this->content[$name] = $options; unset($this->hidden[$name]); unset($this->plugins[$name]); diff -u b/core/modules/field_ui/src/DisplayOverview.php b/core/modules/field_ui/src/DisplayOverview.php --- b/core/modules/field_ui/src/DisplayOverview.php +++ b/core/modules/field_ui/src/DisplayOverview.php @@ -235,7 +235,7 @@ // field_formatter_third_party_settings_form handlers (if any): foreach ($this->moduleHandler->getImplementations('field_formatter_third_party_settings_form') as $module) { // Index the settings form by module name. - $settings_form['third_party'][$module] = $this->moduleHandler->invoke($module, 'field_formatter_third_party_settings_form', array( + $settings_form[$module] = $this->moduleHandler->invoke($module, 'field_formatter_third_party_settings_form', array( $plugin, $field_definition, $this->mode, diff -u b/core/modules/field_ui/src/DisplayOverviewBase.php b/core/modules/field_ui/src/DisplayOverviewBase.php --- b/core/modules/field_ui/src/DisplayOverviewBase.php +++ b/core/modules/field_ui/src/DisplayOverviewBase.php @@ -323,8 +323,11 @@ if (isset($form_state['values']['fields'][$field_name]['type'])) { $display_options['type'] = $form_state['values']['fields'][$field_name]['type']; } - if (isset($form_state['plugin_settings'][$field_name])) { - $display_options['settings'] = $form_state['plugin_settings'][$field_name]; + if (isset($form_state['plugin_settings'][$field_name]['settings'])) { + $display_options['settings'] = $form_state['plugin_settings'][$field_name]['settings']; + } + if (isset($form_state['plugin_settings'][$field_name]['third_party_settings'])) { + $display_options['third_party_settings'] = $form_state['plugin_settings'][$field_name]['third_party_settings']; } // Get the corresponding plugin object. @@ -349,11 +352,10 @@ if ($plugin) { // Generate the settings form and allow other modules to alter it. $settings_form = $plugin->settingsForm($form, $form_state); - $additional_settings_form = array(); - $this->alterSettingsForm($additional_settings_form, $plugin, $field_definition, $form, $form_state); - $settings_form += $additional_settings_form; + $third_party_settings_form = array(); + $this->alterSettingsForm($third_party_settings_form, $plugin, $field_definition, $form, $form_state); - if ($settings_form) { + if ($settings_form || $third_party_settings_form) { $field_row['plugin']['#cell_attributes'] = array('colspan' => 3); $field_row['plugin']['settings_edit_form'] = array( '#type' => 'container', @@ -363,6 +365,7 @@ '#markup' => $this->t('Plugin settings'), ), 'settings' => $settings_form, + 'third_party_settings' => $third_party_settings_form, 'actions' => array( '#type' => 'actions', 'save_settings' => $base_button + array( @@ -408,10 +411,9 @@ // Check selected plugin settings to display edit link or not. $settings_form = $plugin->settingsForm($form, $form_state); - $additional_settings_form = array(); - $this->alterSettingsForm($additional_settings_form, $plugin, $field_definition, $form, $form_state); - $settings_form += $additional_settings_form; - if (!empty($settings_form)) { + $third_party_settings_form = array(); + $this->alterSettingsForm($third_party_settings_form, $plugin, $field_definition, $form, $form_state); + if (!empty($settings_form) || !empty($third_party_settings_form)) { $field_row['settings_edit'] = $base_button + array( '#type' => 'image_button', '#name' => $field_name . '_settings_edit', @@ -522,12 +524,22 @@ if (isset($values['settings_edit_form']['settings'])) { $settings = $values['settings_edit_form']['settings']; } - elseif (isset($form_state['plugin_settings'][$field_name])) { - $settings = $form_state['plugin_settings'][$field_name]; + elseif (isset($form_state['plugin_settings'][$field_name]['settings'])) { + $settings = $form_state['plugin_settings'][$field_name]['settings']; } elseif ($current_options = $display->getComponent($field_name)) { $settings = $current_options['settings']; } + $third_party_settings = array(); + if (isset($values['settings_edit_form']['third_party_settings'])) { + $third_party_settings = $values['settings_edit_form']['third_party_settings']; + } + elseif (isset($form_state['plugin_settings'][$field_name]['third_party_settings'])) { + $third_party_settings = $form_state['plugin_settings'][$field_name]['third_party_settings']; + } + elseif (($current_options = $display->getComponent($field_name)) && isset($current_options['third_party_settings'])) { + $third_party_settings = $current_options['third_party_settings']; + } // Only save settings actually used by the selected plugin. $default_settings = $this->pluginManager->getDefaultSettings($values['type']); @@ -538,6 +550,7 @@ 'type' => $values['type'], 'weight' => $values['weight'], 'settings' => $settings, + 'third_party_settings' => $third_party_settings, ); // Only formatters have configurable label visibility. @@ -610,8 +623,8 @@ case 'update': // Store the saved settings, and set the field back to 'non edit' mode. $field_name = $trigger['#field_name']; - $values = $form_state['values']['fields'][$field_name]['settings_edit_form']['settings']; - $form_state['plugin_settings'][$field_name] = $values; + $form_state['plugin_settings'][$field_name]['settings'] = $form_state['values']['fields'][$field_name]['settings_edit_form']['settings']; + $form_state['plugin_settings'][$field_name]['third_party_settings'] = $form_state['values']['fields'][$field_name]['settings_edit_form']['third_party_settings']; unset($form_state['plugin_settings_edit']); break; diff -u b/core/modules/field_ui/src/FormDisplayOverview.php b/core/modules/field_ui/src/FormDisplayOverview.php --- b/core/modules/field_ui/src/FormDisplayOverview.php +++ b/core/modules/field_ui/src/FormDisplayOverview.php @@ -187,7 +187,7 @@ // field_widget_third_party_settings_form handlers (if any): foreach ($this->moduleHandler->getImplementations('field_widget_third_party_settings_form') as $module) { // Index the settings form by module name. - $settings_form['third_party'][$module] = $this->moduleHandler->invoke($module, 'field_widget_third_party_settings_form', array( + $settings_form[$module] = $this->moduleHandler->invoke($module, 'field_widget_third_party_settings_form', array( $plugin, $field_definition, $this->mode, diff -u b/core/modules/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php --- b/core/modules/field_ui/src/Tests/ManageDisplayTest.php +++ b/core/modules/field_ui/src/Tests/ManageDisplayTest.php @@ -104,7 +104,7 @@ // Assert that the field added in // field_test_field_formatter_third_party_settings_form() is present. - $fieldname = 'fields[field_test][settings_edit_form][settings][third_party][field_third_party_test][field_test_field_formatter_third_party_settings_form]'; + $fieldname = 'fields[field_test][settings_edit_form][third_party_settings][field_third_party_test][field_test_field_formatter_third_party_settings_form]'; $this->assertField($fieldname, 'The field added in hook_field_formatter_third_party_settings_form() is present on the settings form.'); $edit = array($fieldname => 'foo'); $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update"); @@ -212,7 +212,7 @@ // Assert that the field added in // field_test_field_widget_third_party_settings_form() is present. - $fieldname = 'fields[field_test][settings_edit_form][settings][third_party][field_third_party_test][field_test_widget_third_party_settings_form]'; + $fieldname = 'fields[field_test][settings_edit_form][third_party_settings][field_third_party_test][field_test_widget_third_party_settings_form]'; $this->assertField($fieldname, 'The field added in hook_field_widget_third_party_settings_form() is present on the settings form.'); $edit = array($fieldname => 'foo'); $this->drupalPostAjaxForm(NULL, $edit, "field_test_plugin_settings_update"); only in patch2: unchanged: --- a/core/lib/Drupal/Core/Config/Schema/SchemaCheckTrait.php +++ b/core/lib/Drupal/Core/Config/Schema/SchemaCheckTrait.php @@ -54,8 +54,9 @@ public function checkConfigSchema(TypedConfigManagerInterface $typed_config, $co } $definition = $typed_config->getDefinition($config_name); $this->schema = $typed_config->create($definition, $config_data); + $errors = array(); foreach ($config_data as $key => $value) { - $errors = $this->checkValue($key, $value); + $errors = array_merge($errors, $this->checkValue($key, $value)); } if (empty($errors)) { return TRUE; only in patch2: unchanged: --- a/core/lib/Drupal/Core/Field/FormatterBase.php +++ b/core/lib/Drupal/Core/Field/FormatterBase.php @@ -55,14 +55,17 @@ * The formatter label display setting. * @param string $view_mode * The view mode. + * @param array $third_party_settings + * Any third party settings settings. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode) { + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings) { parent::__construct(array(), $plugin_id, $plugin_definition); $this->fieldDefinition = $field_definition; $this->settings = $settings; $this->label = $label; $this->viewMode = $view_mode; + $this->thirdPartySettings = $third_party_settings; } /** only in patch2: unchanged: --- a/core/lib/Drupal/Core/Field/WidgetBase.php +++ b/core/lib/Drupal/Core/Field/WidgetBase.php @@ -43,11 +43,14 @@ * The definition of the field to which the widget is associated. * @param array $settings * The widget settings. + * @param array $third_party_settings + * Any third party settings settings. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings) { + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings) { parent::__construct(array(), $plugin_id, $plugin_definition); $this->fieldDefinition = $field_definition; $this->settings = $settings; + $this->thirdPartySettings = $third_party_settings; } /** only in patch2: unchanged: --- a/core/modules/entity/config/schema/entity.data_types.yml +++ b/core/modules/entity/config/schema/entity.data_types.yml @@ -13,6 +13,11 @@ entity_field_view_display_base: weight: type: integer label: 'Weight' + third_party_settings: + type: sequence + label: 'Third party settings' + sequence: + - type: entity_view_display.third_party.[%key] # Schema for the base of the form mode display format settings. entity_field_form_display_base: @@ -24,3 +29,8 @@ entity_field_form_display_base: weight: type: integer label: 'Weight' + third_party_settings: + type: sequence + label: 'Third party settings' + sequence: + - type: entity_form_display.third_party.[%key] only in patch2: unchanged: --- a/core/modules/entity/src/Tests/EntityDisplayTest.php +++ b/core/modules/entity/src/Tests/EntityDisplayTest.php @@ -69,6 +69,7 @@ public function testEntityDisplayCRUD() { 'type' => 'string', 'weight' => -5, 'settings' => array(), + 'third_party_settings' => array(), ); $this->assertEqual($display->getComponents(), $expected); @@ -221,12 +222,14 @@ public function testBaseFieldComponent() { 'label' => 'above', 'type' => 'text_default', 'settings' => $formatter_settings, + 'third_party_settings' => array(), 'weight' => 10, ), 'test_display_non_configurable' => array( 'label' => 'above', 'type' => 'text_default', 'settings' => $formatter_settings, + 'third_party_settings' => array(), 'weight' => 11, ), ); only in patch2: unchanged: --- a/core/modules/entity/src/Tests/EntityFormDisplayTest.php +++ b/core/modules/entity/src/Tests/EntityFormDisplayTest.php @@ -136,11 +136,13 @@ public function testBaseFieldComponent() { 'test_display_configurable' => array( 'type' => 'text_textfield', 'settings' => $formatter_settings, + 'third_party_settings' => array(), 'weight' => 10, ), 'test_display_non_configurable' => array( 'type' => 'text_textfield', 'settings' => $formatter_settings, + 'third_party_settings' => array(), 'weight' => 11, ), ); only in patch2: unchanged: --- /dev/null +++ b/core/modules/field/tests/modules/field_test/config/schema/field_test.schema.yml @@ -0,0 +1,23 @@ +entity_view_display.field.field_test_multiple: + type: entity_field_view_display_base + label: 'field_test display format settings' + mapping: + settings: + type: mapping + label: 'Settings' + mapping: + test_formatter_setting_multiple: + type: string + label: 'Test setting' + +entity_form_display.field.test_field_widget_multiple: + type: entity_field_form_display_base + label: 'field_test display format settings' + mapping: + settings: + type: mapping + label: 'Settings' + mapping: + test_widget_setting_multiple: + type: string + label: 'Test setting'