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 6dfbb15..935e849 100644 --- a/core/modules/field/tests/modules/field_test/field_test.module +++ b/core/modules/field/tests/modules/field_test/field_test.module @@ -285,3 +285,22 @@ function field_test_query_efq_table_prefixing_test_alter(&$query) { // exception if the EFQ does not properly prefix the base table. $query->join('test_entity','te2','%alias.ftid = test_entity.ftid'); } + +/** + * Implements hook_field_formatter_settings_form_alter(). + */ +function field_test_field_formatter_settings_form_alter(&$element, &$form_state, $context) { + $settings = $context['instance']['display'][$context['view_mode']]['settings']; + $element['field_test_formatter_settings_form_alter'] = array( + '#type' => 'textfield', + '#title' => t('Formatter settings form alter'), + '#default_value' => isset($settings['field_test_formatter_settings_form_alter']) ? $settings['field_test_formatter_settings_form_alter'] : '', + ); +} + +/** + * Implements hook_field_formatter_settings_summary_alter(). + */ +function field_test_field_formatter_settings_summary_alter(&$summary, $context) { + $summary .= '
field_test_field_formatter_settings_summary_alter'; +} diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc index 3034156..f719210 100644 --- a/core/modules/field_ui/field_ui.admin.inc +++ b/core/modules/field_ui/field_ui.admin.inc @@ -1059,6 +1059,17 @@ function field_ui_display_overview_form($form, &$form_state, $entity_type, $bund $settings_form = $function($field, $instance, $view_mode, $form, $form_state); } + // Allow other modules to alter the formatter settings form. + $context = array( + 'module' => $formatter['module'], + 'formatter' => $formatter, + 'field' => $field, + 'instance' => $instance, + 'view_mode' => $view_mode, + 'form' => $form, + ); + drupal_alter('field_formatter_settings_form', $settings_form, $form_state, $context); + if ($settings_form) { $table[$name]['format']['#cell_attributes'] = array('colspan' => 3); $table[$name]['format']['settings_edit_form'] = array( @@ -1094,6 +1105,15 @@ function field_ui_display_overview_form($form, &$form_state, $entity_type, $bund else { // Display a summary of the current formatter settings. $summary = module_invoke($formatter['module'], 'field_formatter_settings_summary', $field, $instance, $view_mode); + + // Allow other modules to alter the summary. + $context = array( + 'field' => $field, + 'instance' => $instance, + 'view_mode' => $view_mode, + ); + drupal_alter('field_formatter_settings_summary', $summary, $context); + $table[$name]['settings_summary'] = array(); $table[$name]['settings_edit'] = array(); if ($summary) { diff --git a/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php index 80cbe78..db43fee 100644 --- a/core/modules/field_ui/field_ui.api.php +++ b/core/modules/field_ui/field_ui.api.php @@ -169,6 +169,56 @@ function hook_field_formatter_settings_form($field, $instance, $view_mode, $form } /** + * Alter the formatter settings form. + * + * @param $element + * Form array as returned by hook_field_formatter_settings_form(). + * @param $form_state + * The form state of the (entire) configuration form. + * @param $context + * An associative array with the following elements: + * - 'module': The module that contains the definition of this formatter. + * - 'formatter': The formatter type description array. + * - 'field': The field structure being configured. + * - 'instance': The instance structure being configured. + * - 'view_mode': The view mode being configured. + * - 'form': The (entire) configuration form array. + */ +function hook_field_formatter_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') { + $display = $context['instance']['display'][$context['view_mode']]; + $element['mysetting'] = array( + '#type' => 'checkbox', + '#title' => t('My setting'), + '#default_value' => $display['settings']['mysetting'], + ); + } +} + +/** + * Alter the field formatter settings summary. + * + * @param $summary + * The summary as returned by hook_field_formatter_settings_summary(). + * @param $context + * An associative array with the following elements: + * - 'field': The field structure being configured. + * - 'instance': The instance structure being configured. + * - 'view_mode': The view mode being configured. + */ +function hook_field_formatter_settings_summary_alter(&$summary, $context) { + // Append a message to the summary when an instance of foo_field has + // mysetting set to TRUE for the current view mode. + if ($context['field']['type'] == 'foo_field') { + $display = $context['instance']['display'][$context['view_mode']]; + if ($display['settings']['mysetting']) { + $summary .= '
' . t('My setting enabled.'); + } + } +} + +/** * Return a short summary for the current formatter settings of an instance. * * If an empty result is returned, the formatter is assumed to have no diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php index 34ebf1c..2d45c6b 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php @@ -19,7 +19,7 @@ class ManageDisplayTest extends FieldUiTestBase { * * @var array */ - public static $modules = array('search'); + public static $modules = array('search', 'field_test'); public static function getInfo() { return array( @@ -75,6 +75,24 @@ class ManageDisplayTest extends FieldUiTestBase { $current_setting_value = $instance['display']['default']['settings'][$setting_name]; $this->assertEqual($current_format, $format, t('The formatter was updated.')); $this->assertEqual($current_setting_value, $setting_value, t('The setting was updated.')); + + // Assert that hook_field_formatter_settings_summary_alter() is called. + $this->assertText('field_test_field_formatter_settings_summary_alter'); + + // Click on the formatter settings button to open the formatter settings + // form. + $this->drupalPostAJAX(NULL, array(), "field_test_formatter_settings_edit"); + + // 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]'; + $this->assertField($fieldname, 'The field added in hook_field_formatter_settings_form_alter() is present on the settings form.'); + $edit = array($fieldname => 'foo'); + $this->drupalPostAJAX(NULL, $edit, "field_test_formatter_settings_update"); + + // Confirm that the settings are updated on the settings form. + $this->drupalPostAJAX(NULL, array(), "field_test_formatter_settings_edit"); + $this->assertFieldByName($fieldname, 'foo'); } /**