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 @@ -156,14 +156,16 @@ } /** - * Implements hook_field_widget_settings_form_alter(). + * Implements hook_field_widget_third_party_settings_form(). */ -function field_test_field_widget_settings_form_alter(&$element, &$form_state, $context) { - $element['field_test_widget_settings_form_alter'] = 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('Widget settings form alter'), - '#default_value' => $context['widget']->getSetting('field_test_widget_settings_form_alter'), + '#title' => t('3rd party widget settings form'), + '#default_value' => $third_party_settings['field_test'], ); + return $element; } /** @@ -178,11 +180,11 @@ * Implements hook_field_formatter_third_party_settings_form(). */ function field_test_field_formatter_third_party_settings_form($plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $view_mode, $form, $form_state) { - $third_party = $plugin->getSetting('third_party_settings'); + $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,70 +11,78 @@ */ /** - * Alters the formatter settings form. + * Allow modules to add settings to field formatters provided by other modules. * * @param object $plugin - * The widget or formatter. + * The field formatter. * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition * The field definition. * @param $view_mode - * The entity view or form 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($plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $view_mode, $form, $form_state) { - // Add a 'mysetting' checkbox to the settings form for 'foo_formatter' - // field formatters. + $element = array(); + // Add a 'my_setting' checkbox to the settings form for 'foo_formatter' field + // formatters. if ($plugin->getPluginId() == 'foo_formatter') { - $third_party = $plugin->getSetting('third_party_settings'); + $third_party_settings = $plugin->getSetting('third_party_settings'); $element['my_setting'] = array( '#type' => 'checkbox', '#title' => t('My setting'), - '#default_value' => $third_party['my_setting'], + '#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: - * - formatter: The formatter 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. * * @see \Drupal\field_ui\FormDisplayOverView. */ -function hook_field_widget_settings_form_alter(&$element, &$form_state, $context) { - // Add a 'mysetting' checkbox to the settings form for 'foo_field' fields. - if ($context['field']['type'] == 'foo_field') { - $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['formatter']->getSetting('mysetting'), + '#default_value' => $third_party_settings['my_setting'], ); } + return $element; } /** * Alters the field formatter settings summary. * - * @param $summary - * The summary. + * @param array $summary + * An array of summary messages. * @param $context * An associative array with the following elements: * - formatter: The formatter object. @@ -87,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.'); } } @@ -97,7 +106,7 @@ * Alters the field widget settings summary. * * @param array $summary - * The summary. + * An array of summary messages. * @param array $context * An associative array with the following elements: * - widget: The widget object. @@ -107,10 +116,11 @@ * @see \Drupal\field_ui\FormDisplayOverView. */ function hook_field_widget_settings_summary_alter(&$summary, $context) { - // Append a message to the summary when an instance of foo_field has + // Append a message to the summary when an instance of foo_widget has // mysetting set to TRUE for the current view mode. - if ($context['field']['type'] == 'foo_field') { - if ($context['widget']->getSetting('mysetting')) { + 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/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,14 +183,18 @@ * {@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, - ); - $this->moduleHandler->alter('field_widget_settings_form', $settings_form, $form_state, $context); - $settings_form = array('widget' => $settings_form); + // Iterate through the modules calling their + // 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( + $plugin, + $field_definition, + $this->mode, + $form, + $form_state, + )); + } } /** 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 @@ -106,7 +106,7 @@ $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, ''); @@ -193,9 +193,9 @@ $this->drupalPostAjaxForm(NULL, array(), "field_test_settings_edit"); // Assert that the field added in - // field_test_field_widget_settings_form_alter() is present. - $fieldname = 'fields[field_test][settings_edit_form][settings][widget][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.'); + // field_test_field_widget_third_party_settings_form() is present. + $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");