diff --git a/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php b/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php index 11f224622cc66d2ee62da4a03019f9fef99c13cf..fc4a4c4351cce7a72ce4e30333a3738a28479658 100644 --- a/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php +++ b/core/lib/Drupal/Core/Field/Annotation/FieldFormatter.php @@ -74,4 +74,13 @@ class FieldFormatter extends Plugin { */ public $settings = array(); + /** + * An integer to determine the weight of this formatter relative to other + * formatter in the Field UI when selecting a formatter for a given field + * instance. + * + * @var int optional + */ + public $weight = NULL; + } diff --git a/core/lib/Drupal/Core/Field/FormatterPluginManager.php b/core/lib/Drupal/Core/Field/FormatterPluginManager.php index b825272ced332070a6cc0ecd4fc79251a49ceabe..d81ff5749c37d713fc40dfb8fdddc657b39dd4de 100644 --- a/core/lib/Drupal/Core/Field/FormatterPluginManager.php +++ b/core/lib/Drupal/Core/Field/FormatterPluginManager.php @@ -167,13 +167,15 @@ public function prepareConfiguration($field_type, array $configuration) { */ public function getOptions($field_type = NULL) { if (!isset($this->formatterOptions)) { - $field_types = $this->fieldTypeManager->getDefinitions(); $options = array(); - foreach ($this->getDefinitions() as $name => $formatter) { - foreach ($formatter['field_types'] as $formatter_field_type) { + $field_types = $this->fieldTypeManager->getDefinitions(); + $formatter_types = $this->getDefinitions(); + uasort($formatter_types, array('Drupal\Component\Utility\SortArray', 'sortByWeightElement')); + foreach ($formatter_types as $name => $formatter_type) { + foreach ($formatter_type['field_types'] as $formatter_field_type) { // Check that the field type exists. if (isset($field_types[$formatter_field_type])) { - $options[$formatter_field_type][$name] = $formatter['label']; + $options[$formatter_field_type][$name] = $formatter_type['label']; } } } diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php index 457c76ff92bf288a0f9b1a54a05b8784ebdbeffa..97beb5c79bc7b3919e3ba6fbcbf2d27a34b18f1e 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldDefaultFormatter.php @@ -22,7 +22,8 @@ * }, * settings = { * "test_formatter_setting" = "dummy test string" - * } + * }, + * weight = 1 * ) */ class TestFieldDefaultFormatter extends FormatterBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php index 592a958387f0dfb480f711027f9d529826b807c3..e624bf98bb84f718480ecf34378a761cd41e6111 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptyFormatter.php @@ -21,7 +21,8 @@ * }, * settings = { * "test_empty_string" = "**EMPTY FIELD**" - * } + * }, + * weight = -5 * ) */ class TestFieldEmptyFormatter extends FormatterBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php index e825aa8ea8d6e07ea4196f40651384656080a4c6..fa4d9a951c29591281ffc80270e05edde9fac480 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldEmptySettingFormatter.php @@ -21,7 +21,8 @@ * }, * settings = { * "field_empty_setting" = "" - * } + * }, + * weight = -1 * ) */ class TestFieldEmptySettingFormatter extends FormatterBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php index 588ad66d36fd046543bf4d65fb716af11863e256..87d9553d5acb52f418b9470063176d4dfad2ec29 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldMultipleFormatter.php @@ -22,7 +22,8 @@ * }, * settings = { * "test_formatter_setting_multiple" = "dummy test string" - * } + * }, + * weight = 5 * ) */ class TestFieldMultipleFormatter extends FormatterBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldNoSettingsFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldNoSettingsFormatter.php index 1d3d150c17b00605e7f4b4e98057b5ccc7b15bd1..4ab58f1f77e1fe15dc7dbacbd016c31f3d95046c 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldNoSettingsFormatter.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldNoSettingsFormatter.php @@ -19,6 +19,7 @@ * field_types = { * "test_field", * }, + * weight = -10 * ) */ class TestFieldNoSettingsFormatter extends FormatterBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php index a8ff2a97fffa4865160f7f8df2e285e807831e41..85b97f1089f79d98b8233768b2a94eee1e831046 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldFormatter/TestFieldPrepareViewFormatter.php @@ -22,7 +22,8 @@ * }, * settings = { * "test_formatter_setting_additional" = "dummy test string" - * } + * }, + * weight = 10 * ) */ class TestFieldPrepareViewFormatter extends FormatterBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php index bf6e093dccce26774d58b9dad8723b99cbdbc3cc..ae800422d43122f8c441002a8fd6e2b8773020e7 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidget.php @@ -23,7 +23,8 @@ * }, * settings = { * "test_widget_setting" = "dummy test string" - * } + * }, + * weight = -10 * ) */ class TestFieldWidget extends WidgetBase { diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php index be8fed9d2d942e422334affb57ec543327c345e7..a16eb3f8f85530edb9ae43a411cccaabfa93d6cb 100644 --- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php +++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldWidget/TestFieldWidgetMultiple.php @@ -25,7 +25,8 @@ * settings = { * "test_widget_setting_multiple" = "dummy test string" * }, - * multiple_values = TRUE + * multiple_values = TRUE, + * weight = 10 * ) */ class TestFieldWidgetMultiple extends WidgetBase { 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 4a25ca631acf725d284cb56dc7b33b487ef11eb2..133b578b1686baf6531e3a02304433c503775d50 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 @@ -51,12 +51,28 @@ function testFormatterUI() { $setting_name = key($default_settings); $setting_value = $display_options['settings'][$setting_name]; - // Display the "Manage display" screen and check that the expected formatter is - // selected. + // Display the "Manage display" screen and check that the expected formatter + // is selected. $this->drupalGet($manage_display); $this->assertFieldByName('fields[field_test][type]', $format, 'The expected formatter is selected.'); $this->assertText("$setting_name: $setting_value", 'The expected summary is displayed.'); + // Check whether formatter weights are respected. + $result = $this->xpath('//select[@id=:id]/option', array(':id' => 'edit-fields-field-test-type')); + $options = array_map(function($item) { + return (string) $item->attributes()->value[0]; + }, $result); + $expected_options = array ( + 'field_no_settings', + 'field_empty_test', + 'field_empty_setting', + 'field_test_default', + 'field_test_multiple', + 'field_test_with_prepare_view', + 'hidden', + ); + $this->assertEqual($options, $expected_options, 'The expected formatter ordering is respected.'); + // Change the formatter and check that the summary is updated. $edit = array('fields[field_test][type]' => 'field_test_multiple', 'refresh_rows' => 'field_test'); $this->drupalPostAjaxForm(NULL, $edit, array('op' => t('Refresh'))); @@ -139,6 +155,18 @@ public function testWidgetUI() { $this->assertFieldByName('fields[field_test][type]', $widget_type, 'The expected widget is selected.'); $this->assertText("$setting_name: $setting_value", 'The expected summary is displayed.'); + // Check whether widget weights are respected. + $result = $this->xpath('//select[@id=:id]/option', array(':id' => 'edit-fields-field-test-type')); + $options = array_map(function($item) { + return (string) $item->attributes()->value[0]; + }, $result); + $expected_options = array ( + 'test_field_widget', + 'test_field_widget_multiple', + 'hidden', + ); + $this->assertEqual($options, $expected_options, 'The expected widget ordering is respected.'); + // Change the widget and check that the summary is updated. $edit = array('fields[field_test][type]' => 'test_field_widget_multiple', 'refresh_rows' => 'field_test'); $this->drupalPostAjaxForm(NULL, $edit, array('op' => t('Refresh')));