diff --git a/core/includes/form.inc b/core/includes/form.inc index 362d0d5..9cfcad2 100644 --- a/core/includes/form.inc +++ b/core/includes/form.inc @@ -2002,6 +2002,10 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) { // submitted with drupal_form_submit() may bypass access restriction and be // treated as high-privilege users instead. $process_input = empty($element['#disabled']) && ($form_state['programmed'] || ($form_state['process_input'] && (!isset($element['#access']) || $element['#access']))); + $loadable = isset($element['#load']) && isset($form_state['callbacks']['load'][$element['#load']]); + if ($loadable) { + $form_state['loadables'][$element['#load']][] = $element['#array_parents']; + } // Set the element's #value property. if (!isset($element['#value']) && !array_key_exists('#value', $element)) { @@ -2043,6 +2047,10 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) { } // Load defaults. if (!isset($element['#value'])) { + if ($loadable) { + $function = $form_state['callbacks']['load'][$element['#load']]; + $element['#default_value'] = $function($element); + } // Call #type_value without a second argument to request default_value handling. if (function_exists($value_callback)) { $element['#value'] = $value_callback($element, FALSE, $form_state); diff --git a/core/modules/aggregator/aggregator.admin.inc b/core/modules/aggregator/aggregator.admin.inc index 718e79c..25fa8ce 100644 --- a/core/modules/aggregator/aggregator.admin.inc +++ b/core/modules/aggregator/aggregator.admin.inc @@ -428,14 +428,15 @@ function aggregator_admin_refresh_feed($feed) { * @see aggregator_admin_form_submit() * @ingroup forms */ -function aggregator_admin_form($form, $form_state) { +function aggregator_admin_form($form, &$form_state) { // Global aggregator settings. $form['aggregator_allowed_html_tags'] = array( '#type' => 'textfield', '#title' => t('Allowed HTML tags'), '#size' => 80, '#maxlength' => 255, - '#default_value' => config('aggregator.settings')->get('items.allowed_html'), + '#load' => 'config', + '#config_key' => 'items.allowed_html', '#description' => t('A space-separated list of HTML tags allowed in the content of feed items. Disallowed tags are stripped from the content.'), ); @@ -484,7 +485,8 @@ function aggregator_admin_form($form, $form_state) { '#title' => t('Fetcher'), '#description' => t('Fetchers download data from an external source. Choose a fetcher suitable for the external source you would like to download from.'), '#options' => $fetchers, - '#default_value' => config('aggregator.settings')->get('fetcher'), + '#load' => 'config', + '#config_key' => 'fetcher', ); } if (count($parsers) > 1) { @@ -493,7 +495,8 @@ function aggregator_admin_form($form, $form_state) { '#title' => t('Parser'), '#description' => t('Parsers transform downloaded data into standard structures. Choose a parser suitable for the type of feeds you would like to aggregate.'), '#options' => $parsers, - '#default_value' => config('aggregator.settings')->get('parser'), + '#load' => 'config', + '#config_key' => 'parser', ); } if (count($processors) > 1) { @@ -502,7 +505,8 @@ function aggregator_admin_form($form, $form_state) { '#title' => t('Processors'), '#description' => t('Processors act on parsed feed data, for example they store feed items. Choose the processors suitable for your task.'), '#options' => $processors, - '#default_value' => config('aggregator.settings')->get('processors'), + '#load' => 'config', + '#config_key' => 'processors', ); } if (count($basic_conf)) { @@ -518,35 +522,12 @@ function aggregator_admin_form($form, $form_state) { // Implementing modules will expect an array at $form['modules']. $form['modules'] = array(); + $form['#config'] = config('aggregator.settings'); return system_config_form($form, $form_state); } /** - * Form submission handler for aggregator_admin_form(). - */ -function aggregator_admin_form_submit($form, &$form_state) { - $config = config('aggregator.settings'); - $config - ->set('items.allowed_html', $form_state['values']['aggregator_allowed_html_tags']) - ->set('items.expire', $form_state['values']['aggregator_clear']) - ->set('items.teaser_length', $form_state['values']['aggregator_teaser_length']) - ->set('source.list_max', $form_state['values']['aggregator_summary_items']) - ->set('source.category_selector', $form_state['values']['aggregator_category_selector']); - - if (isset($form_state['values']['aggregator_fetcher'])) { - $config->set('fetcher', $form_state['values']['aggregator_fetcher']); - } - if (isset($form_state['values']['aggregator_parser'])) { - $config->set('parser', $form_state['values']['aggregator_parser']); - } - if (isset($form_state['values']['aggregator_processors'])) { - $config->set('processors', array_filter($form_state['values']['aggregator_processors'])); - } - $config->save(); -} - -/** * Form constructor to add/edit/delete aggregator categories. * * @param $edit diff --git a/core/modules/aggregator/aggregator.processor.inc b/core/modules/aggregator/aggregator.processor.inc index c12c90f..4303618 100644 --- a/core/modules/aggregator/aggregator.processor.inc +++ b/core/modules/aggregator/aggregator.processor.inc @@ -95,7 +95,8 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) { $form['modules']['aggregator']['aggregator_summary_items'] = array( '#type' => 'select', '#title' => t('Number of items shown in listing pages'), - '#default_value' => config('aggregator.settings')->get('source.list_max'), + '#load' => 'config', + '#config_key' => 'source.list_max', '#empty_value' => 0, '#options' => $items, ); @@ -103,7 +104,8 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) { $form['modules']['aggregator']['aggregator_clear'] = array( '#type' => 'select', '#title' => t('Discard items older than'), - '#default_value' => config('aggregator.settings')->get('items.expire'), + '#load' => 'config', + '#config_key' => 'items.expire', '#options' => $period, '#description' => t('Requires a correctly configured cron maintenance task.', array('@cron' => url('admin/reports/status'))), ); @@ -111,7 +113,8 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) { $form['modules']['aggregator']['aggregator_category_selector'] = array( '#type' => 'radios', '#title' => t('Select categories using'), - '#default_value' => config('aggregator.settings')->get('source.category_selector'), + '#load' => 'config', + '#config_key' => 'source.category_selector', '#options' => array('checkboxes' => t('checkboxes'), 'select' => t('multiple selector')), '#description' => t('For a small number of categories, checkboxes are easier to use, while a multiple selector works well with large numbers of categories.'), @@ -119,7 +122,8 @@ function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) { $form['modules']['aggregator']['aggregator_teaser_length'] = array( '#type' => 'select', '#title' => t('Length of trimmed description'), - '#default_value' => config('aggregator.settings')->get('items.teaser_length'), + '#load' => 'config', + '#config_key' => 'items.teaser_length', '#options' => drupal_map_assoc(array(0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000), '_aggregator_characters'), '#description' => t("The maximum number of characters used in the trimmed version of content.") ); diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php index 65eb6ab..0ffa9a9 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php @@ -34,7 +34,7 @@ class AggregatorConfigurationTest extends AggregatorTestBase { $this->assertText(t('The configuration options have been saved.')); foreach ($edit as $name => $value) { - $this->assertFieldByName($name, $value, t('"@name" has correct default value.', array('@name' => $name))); + $this->assertFieldByName($name, $value, t('"@name" has correct default value: @value.', array('@name' => $name, '@value' => $value))); } } } diff --git a/core/modules/system/system.module b/core/modules/system/system.module index de7241f..f87c97b 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -6,6 +6,7 @@ */ use Drupal\Core\Utility\ModuleInfo; +use Drupal\Component\Utility\NestedArray; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; @@ -3111,6 +3112,12 @@ function system_config_form($form, &$form_state) { if (!isset($form['#theme'])) { $form['#theme'] = 'system_settings_form'; } + if (isset($form['#config'])) { + $config = $form['#config']; + $form_state['callbacks']['load']['config'] = function ($element) use ($config) { + return $config->get($element['#config_key']); + }; + } return $form; } @@ -3120,6 +3127,15 @@ function system_config_form($form, &$form_state) { * @see system_config_form() */ function system_config_form_submit($form, &$form_state) { + if (isset($form['#config'])) { + $config = $form['#config']; + foreach ($form_state['loadables']['config'] as $parents) { + $element = NestedArray::getValue($form, $parents); + $value = ($element['#type'] == 'checkboxes') ? array_keys(array_filter($element['#value'])) : $element['#value']; + $config->set($element['#config_key'], $value); + } + $config->save(); + } drupal_set_message(t('The configuration options have been saved.')); }