diff --git a/core/lib/Drupal/Core/Field/PluginSettingsBase.php b/core/lib/Drupal/Core/Field/PluginSettingsBase.php index fb8e07b..480df01 100644 --- a/core/lib/Drupal/Core/Field/PluginSettingsBase.php +++ b/core/lib/Drupal/Core/Field/PluginSettingsBase.php @@ -24,6 +24,13 @@ protected $settings = array(); /** + * Settings from other modules. + * + * @var array + */ + protected $third_party_settings = array(); + + /** * Whether default settings have been merged into the current $settings. * * @var bool @@ -84,4 +91,40 @@ public function setSetting($key, $value) { return $this; } + /** + * {@inheritdoc} + */ + public function getThirdPartySettings() { + if (isset($this->settings['third_party'])) { + return $this->settings['third_party']; + } + return array(); + } + + /** + * {@inheritdoc} + */ + public function getThirdPartySetting($module, $key) { + if (isset($this->settings['third_party'][$module][$key])) { + return $this->settings['third_party'][$module][$key]; + } + return NULL; + } + + /** + * {@inheritdoc} + */ + public function setThirdPartySetting($module, $key, $value) { + $this->settings['third_party'][$module][$key] = $value; + return $this; + } + + /** + * {@inheritdoc} + */ + public function setThirdPartySettings($module, array $settings) { + $this->settings['third_party'][$module] = $settings; + return $this; + } + } diff --git a/core/lib/Drupal/Core/Field/PluginSettingsInterface.php b/core/lib/Drupal/Core/Field/PluginSettingsInterface.php index 41dd942..cf696b9 100644 --- a/core/lib/Drupal/Core/Field/PluginSettingsInterface.php +++ b/core/lib/Drupal/Core/Field/PluginSettingsInterface.php @@ -70,7 +70,7 @@ public function setSetting($key, $value); * The array is keyed by the third-party module which provides the settings, * and includes defaults for missing settings. * - * @return mixed + * @return array * The array of settings. */ public function getThirdPartySettings(); @@ -83,8 +83,8 @@ public function getThirdPartySettings(); * @param string $key * The setting name. * - * @return mixed - * The setting value. + * @return mixed|NULL + * The setting value. Returns NULL if the setting does not exist. */ public function getThirdPartySetting($module, $key); 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 8245815..3163dec 100644 --- a/core/modules/field/tests/modules/field_test/field_test.module +++ b/core/modules/field/tests/modules/field_test/field_test.module @@ -159,11 +159,10 @@ function field_test_query_efq_metadata_test_alter(&$query) { * Implements hook_field_widget_third_party_settings_form(). */ 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_settings['field_test'], + '#default_value' => $plugin->getThirdPartySetting('field_test', 'field_test_widget_test'), ); return $element; } @@ -180,11 +179,10 @@ function field_test_field_widget_settings_summary_alter(&$summary, $context) { * 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_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_settings['field_test'], + '#default_value' => $plugin->getThirdPartySetting('field_test', 'field_test_formatter_test'), ); return $element; } diff --git a/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php index b2b8d4e..6e6687a 100644 --- a/core/modules/field_ui/field_ui.api.php +++ b/core/modules/field_ui/field_ui.api.php @@ -34,11 +34,10 @@ function hook_field_formatter_third_party_settings_form($plugin, \Drupal\Core\Fi // Add a 'my_setting' checkbox to the settings form for 'foo_formatter' field // formatters. 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' => $third_party_settings['my_setting'], + '#default_value' => $plugin->getThirdPartySetting('my_module', 'my_setting'), ); } return $element; @@ -68,11 +67,10 @@ function hook_field_widget_third_party_settings_form($plugin, \Drupal\Core\Field // 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' => $third_party_settings['my_setting'], + '#default_value' => $plugin->getThirdPartySetting('my_module', 'my_setting'), ); } return $element; @@ -95,8 +93,7 @@ function hook_field_formatter_settings_summary_alter(&$summary, $context) { // 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') { - $third_party_settings = $plugin->getSetting('third_party_settings'); - if (isset($third_party_settings['my_setting']) && $third_party_settings['my_setting']) { + if ($context['formatter']->getThirdPartySetting('my_module', 'my_setting')) { $summary[] = t('My setting enabled.'); } } @@ -119,8 +116,7 @@ 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 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']) { + if ($context['widget']->getThirdPartySetting('my_module', 'my_setting')) { $summary[] = t('My setting enabled.'); } } diff --git a/core/modules/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php index 11c10fe..cc3a851 100644 --- a/core/modules/field_ui/src/Tests/ManageDisplayTest.php +++ b/core/modules/field_ui/src/Tests/ManageDisplayTest.php @@ -101,7 +101,7 @@ function testFormatterUI() { // Assert that the field added in // field_test_field_formatter_third_party_settings_form() is present. - $fieldname = 'fields[field_test][settings_edit_form][third_party][field_test][field_test_field_formatter_third_party_settings_form]'; + $fieldname = 'fields[field_test][settings_edit_form][settings][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"); @@ -194,7 +194,7 @@ public function testWidgetUI() { // Assert that the field added in // 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]'; + $fieldname = 'fields[field_test][settings_edit_form][settings][third_party][field_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");