diff -u b/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module --- b/core/modules/field/tests/modules/field_test/field_test.module +++ b/core/modules/field/tests/modules/field_test/field_test.module @@ -158,13 +158,14 @@ /** * Implements hook_field_widget_third_party_settings_form(). */ -function field_test_field_widget_third_party_settings_form($element, $form_state, $context) { - $third_party = $context['widget']->getSetting('third_party_settings'); - $element['field_test_field_widget_third_party_settings_form'] = array( +function field_test_field_widget_third_party_settings_form($plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $form_mode, $form, $form_state) { + $third_party_settings = $plugin->getSetting('third_party_settings'); + $element['field_test_widget_third_party_settings_form'] = array( '#type' => 'textfield', '#title' => t('3rd party widget settings form'), - '#default_value' => $third_party['field_test'], + '#default_value' => $third_party_settings['field_test'], ); + return $element; } /** @@ -178,12 +179,12 @@ /** * Implements hook_field_formatter_third_party_settings_form(). */ -function field_test_field_formatter_third_party_settings_form($element, $form_state, $context) { - $third_party = $context['formatter']->getSetting('third_party_settings'); +function field_test_field_formatter_third_party_settings_form($plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $view_mode, $form, $form_state) { + $third_party_settings = $plugin->getSetting('third_party_settings'); $element['field_test_field_formatter_third_party_settings_form'] = array( '#type' => 'textfield', '#title' => t('3rd party formatter settings form'), - '#default_value' => $third_party['field_test'], + '#default_value' => $third_party_settings['field_test'], ); return $element; } diff -u b/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php --- b/core/modules/field_ui/field_ui.api.php +++ b/core/modules/field_ui/field_ui.api.php @@ -11,64 +11,68 @@ */ /** - * Alters the formatter settings form. + * Allow modules to add settings to field formatters provided by other modules. * - * @param $element - * Form array. - * @param $form_state - * The form state of the (entire) configuration form. - * @param $context - * An associative array with the following elements: - * - formatter: The formatter object. - * - field_definition: The field definition. - * - view_mode: The view mode being configured. - * - form: The (entire) configuration form array. + * @param object $plugin + * The field formatter. + * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition + * The field definition. + * @param $view_mode + * The entity view mode. + * @param array $form + * The The (entire) configuration form array. + * @param array $form_state + * The form state. * - * @return array - * Returns the form array to be built. + * @return array + * Returns the form array to be built. * * @see \Drupal\field_ui\DisplayOverView. */ -function hook_field_formatter_third_party_settings_form($element, $form_state, $context) { - // Add a 'mysetting' checkbox to the settings form for 'foo_formatter' field +function hook_field_formatter_third_party_settings_form($plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $view_mode, $form, $form_state) { + $element = array(); + // Add a 'my_setting' checkbox to the settings form for 'foo_formatter' field // formatters. - if ($context['formatter']->getPluginId() == 'foo_formatter') { - $element['mysetting'] = array( + if ($plugin->getPluginId() == 'foo_formatter') { + $third_party_settings = $plugin->getSetting('third_party_settings'); + $element['my_setting'] = array( '#type' => 'checkbox', '#title' => t('My setting'), - '#default_value' => $context['formatter']->getSetting('mysetting'), + '#default_value' => $third_party_settings['my_setting'], ); } return $element; } /** - * Alters the widget settings form. + * Allow modules to add settings to field widgets provided by other modules. * - * @param array $element - * Form array. + * @param object $plugin + * The field widget. + * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition + * The field definition. + * @param $form_mode + * The entity form mode. + * @param array $form + * The The (entire) configuration form array. * @param array $form_state - * The form state of the (entire) configuration form. - * @param array $context - * An associative array with the following elements: - * - widget: The widget object. - * - field_definition: The field definition. - * - form_mode: The form mode being configured. - * - form: The (entire) configuration form array. + * The form state. * - * @return array - * Returns the form array to be built. + * @return array + * Returns the form array to be built. * * @see \Drupal\field_ui\FormDisplayOverView. */ -function hook_field_widget_third_party_settings_form($element, $form_state, $context) { - // Add a 'mysetting' checkbox to the settings form for 'foo_widget' field - // widgets. - if ($context['formatter'] == 'foo_widget') { - $element['mysetting'] = array( +function hook_field_widget_third_party_settings_form($plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $form_mode, $form, $form_state) { + $element = array(); + // Add a 'my_setting' checkbox to the settings form for 'foo_widget' field + // widgets. + if ($plugin->getPluginId() == 'foo_widget') { + $third_party_settings = $plugin->getSetting('third_party_settings'); + $element['my_setting'] = array( '#type' => 'checkbox', '#title' => t('My setting'), - '#default_value' => $context['widget']->getSetting('mysetting'), + '#default_value' => $third_party_settings['my_setting'], ); } return $element; @@ -91,7 +95,8 @@ // Append a message to the summary when an instance of foo_formatter has // mysetting set to TRUE for the current view mode. if ($context['formatter']->getPluginId() == 'foo_formatter') { - if ($context['formatter']->getSetting('mysetting')) { + $third_party_settings = $plugin->getSetting('third_party_settings'); + if (isset($third_party_settings['my_setting']) && $third_party_settings['my_setting']) { $summary[] = t('My setting enabled.'); } } @@ -112,9 +117,10 @@ */ function hook_field_widget_settings_summary_alter(&$summary, $context) { // Append a message to the summary when an instance of foo_widget has - // mysetting set to TRUE for the current form mode. - if ($context['widget'] == 'foo_widget') { - if ($context['widget']->getSetting('mysetting')) { + // mysetting set to TRUE for the current view mode. + if ($context['widget']->getPluginId() == 'foo_widget') { + $third_party_settings = $plugin->getSetting('third_party_settings'); + if (isset($third_party_settings['my_setting']) && $third_party_settings['my_setting']) { $summary[] = t('My setting enabled.'); } } 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 @@ -231,23 +231,17 @@ * {@inheritdoc} */ protected function alterSettingsForm(array &$settings_form, $plugin, FieldDefinitionInterface $field_definition, array $form, array &$form_state) { - $context = array( - 'formatter' => $plugin, - 'field_definition' => $field_definition, - 'view_mode' => $this->mode, - 'form' => $form, - ); // Iterate through the modules calling their // field_formatter_third_party_settings_form handlers (if any): - $settings_form['third_party'] = array(); foreach ($this->moduleHandler->getImplementations('field_formatter_third_party_settings_form') as $module) { - $third_party_settings = $this->moduleHandler->invoke($module, 'field_formatter_third_party_settings_form', array( - $settings_form, + // Index the settings form by module name. + $settings_form['third_party'][$module] = $this->moduleHandler->invoke($module, 'field_formatter_third_party_settings_form', array( + $plugin, + $field_definition, + $this->mode, + $form, $form_state, - $context, )); - // Index the settings form by module name. - $settings_form['third_party'][$module] = $third_party_settings; } } 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 @@ -350,12 +350,7 @@ $settings_form = $plugin->settingsForm($form, $form_state); $additional_settings_form = array(); $this->alterSettingsForm($additional_settings_form, $plugin, $field_definition, $form, $form_state); - if (!empty($additional_settings_form)) { - $settings_form['wrapper'] = array( - '#type' => 'container', - ); - $settings_form['wrapper'] += $additional_settings_form; - } + $settings_form += $additional_settings_form; if ($settings_form) { $field_row['plugin']['#cell_attributes'] = array('colspan' => 3); @@ -531,11 +526,8 @@ // Only save settings actually used by the selected plugin. $default_settings = $this->pluginManager->getDefaultSettings($values['type']); - $third_party = !empty($settings['third_party_settings']) ? $settings['third_party_settings'] : array(); + $third_party = !empty($settings['third_party']) ? $settings['third_party'] : array(); $settings = array_intersect_key($settings, $default_settings); - if (!empty($third_party)) { - $settings['third_party_settings'] = $third_party; - } // Default component values. $component_values = array( @@ -544,6 +536,11 @@ 'settings' => $settings ); + // Add third party settings. + if (!empty($third_party)) { + $component_values['third_party_settings'] = $third_party; + } + // Only formatters have configurable label visibility. if (isset($values['label'])) { $component_values['label'] = $values['label']; 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 @@ -183,23 +183,17 @@ * {@inheritdoc} */ protected function alterSettingsForm(array &$settings_form, $plugin, FieldDefinitionInterface $field_definition, array $form, array &$form_state) { - $context = array( - 'widget' => $plugin, - 'field_definition' => $field_definition, - 'form_mode' => $this->mode, - 'form' => $form, - ); // Iterate through the modules calling their - // field_formatter_third_party_settings_form handlers (if any): - $settings_form['third_party'] = array(); + // field_widget_third_party_settings_form handlers (if any): foreach ($this->moduleHandler->getImplementations('field_widget_third_party_settings_form') as $module) { - $third_party_settings = $this->moduleHandler->invoke($module, 'field_widget_third_party_settings_form', array( - $settings_form, + // Index the settings form by module name. + $settings_form['third_party'][$module] = $this->moduleHandler->invoke($module, 'field_widget_third_party_settings_form', array( + $plugin, + $field_definition, + $this->mode, + $form, $form_state, - $context, )); - // Index the settings form by module name. - $settings_form['third_party'][$module] = $third_party_settings; } } 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 @@ -101,12 +101,12 @@ // Assert that the field added in // field_test_field_formatter_third_party_settings_form() is present. - $fieldname = 'fields[field_test][settings_edit_form][settings][wrapper][third_party][field_test][field_test_field_formatter_third_party_settings_form]'; + $fieldname = 'fields[field_test][settings_edit_form][third_party][field_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"); - // Confirm that the third_party_settings settings are not updated on the settings form. + // Confirm that the third party settings are not updated on the settings form. $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit"); $this->assertFieldByName($fieldname, ''); @@ -194,7 +194,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][wrapper][third_party][field_test][field_test_field_widget_third_party_settings_form]'; + $fieldname = 'fields[field_test][settings_edit_form][third_party][field_test][field_test_field_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/modules/entity/src/EntityDisplayBase.php +++ b/core/modules/entity/src/EntityDisplayBase.php @@ -313,6 +313,12 @@ public function setComponent($name, array $options = array()) { $options = $this->pluginManager->prepareConfiguration($field_definition->getType(), $options); } + if (isset($options['third_party_settings'])) { + foreach (array_keys($options['third_party_settings']) as $module) { + $this->addDependency('module', $module); + } + } + $this->content[$name] = $options; unset($this->hidden[$name]); unset($this->plugins[$name]);