diff --git a/core/includes/config.inc b/core/includes/config.inc index 8d0eea1..651d350 100644 --- a/core/includes/config.inc +++ b/core/includes/config.inc @@ -86,3 +86,33 @@ function config_get_storage_names_with_prefix($prefix = '') { function config($name, $class = 'Drupal\Core\Config\DrupalConfig') { return new $class(new DatabaseStorage($name)); } + +function config_form_element(&$form, &$form_state, $config, $key, $element) { + $element['#config_name'] = $config->getName(); + $element['#config_key'] = $key; + $element += array( + '#parents' => array_merge(array('config', $element['#config_name']), explode('.', $element['#config_key'])), + '#default_value' => $config->get($key), + '#process' => element_info_property($element['#type'], '#process', array()), + ); + $element['#process'][] = 'config_form_element_process'; + return $element; +} + +function config_form_element_process($element, &$form_state) { + $form_state['config'][$element['#config_name']][$element['#config_key']] = $element['#parents']; + return $element; +} + +function config_form_submit($form, &$form_state) { + if (isset($form_state['config'])) { + foreach ($form_state['config'] as $config_name => $config_keys) { + $config = config($config_name); + foreach ($config_keys as $config_key => $form_values_parents) { + $config->set($config_key, drupal_array_get_nested_value($form_state['values'], $form_values_parents)); + } + $config->save(); + } + drupal_set_message(t('The configuration options have been saved.')); + } +} diff --git a/core/lib/Drupal/Core/Config/DrupalConfig.php b/core/lib/Drupal/Core/Config/DrupalConfig.php index f5a9220..d052a27 100644 --- a/core/lib/Drupal/Core/Config/DrupalConfig.php +++ b/core/lib/Drupal/Core/Config/DrupalConfig.php @@ -29,8 +29,6 @@ class DrupalConfig { * * @param StorageInterface $storage * The storage engine where this config object should be saved. - * - * @todo $this should really know about $name and make it publicly accessible. */ public function __construct(StorageInterface $storage) { $this->storage = $storage; @@ -38,6 +36,13 @@ class DrupalConfig { } /** + * Gets the name of this config object. + */ + public function getName() { + return $this->storage->getName(); + } + + /** * Reads config data from the active store into our object. */ public function read() { diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc index fc0e8bb..b59ed8c 100644 --- a/core/modules/system/system.admin.inc +++ b/core/modules/system/system.admin.inc @@ -1658,7 +1658,6 @@ function system_logging_settings() { * Form builder; Configure site performance settings. * * @ingroup forms - * @see system_performance_settings_submit(). */ function system_performance_settings($form, &$form_state) { drupal_add_js(drupal_get_path('module', 'system') . '/system.js'); @@ -1680,28 +1679,25 @@ function system_performance_settings($form, &$form_state) { '#title' => t('Caching'), ); - $form['caching']['cache'] = array( + $form['caching']['cache'] = config_form_element($form, $form_state, $config, 'cache', array( '#type' => 'checkbox', '#title' => t('Cache pages for anonymous users'), - '#default_value' => $config->get('cache'), '#weight' => -2, - ); + )); $period = drupal_map_assoc(array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400), 'format_interval'); $period[0] = '<' . t('none') . '>'; - $form['caching']['cache_lifetime'] = array( + $form['caching']['cache_lifetime'] = config_form_element($form, $form_state, $config, 'cache_lifetime', array( '#type' => 'select', '#title' => t('Minimum cache lifetime'), - '#default_value' => $config->get('cache_lifetime'), '#options' => $period, '#description' => t('Cached pages will not be re-created until at least this much time has elapsed.'), - ); - $form['caching']['page_cache_maximum_age'] = array( + )); + $form['caching']['page_cache_maximum_age'] = config_form_element($form, $form_state, $config, 'page_cache_maximum_age', array( '#type' => 'select', '#title' => t('Expiration of cached pages'), - '#default_value' => $config->get('page_cache_maximum_age'), '#options' => $period, '#description' => t('The maximum time an external cache can use an old version of a page.'), - ); + )); $directory = 'public://'; $is_writable = is_dir($directory) && is_writable($directory); @@ -1718,25 +1714,22 @@ function system_performance_settings($form, &$form_state) { ); $js_hide = $config->get('cache') ? '' : ' class="js-hide"'; - $form['bandwidth_optimization']['page_compression'] = array( + $form['bandwidth_optimization']['page_compression'] = config_form_element($form, $form_state, $config, 'page_compression', array( '#type' => 'checkbox', '#title' => t('Compress cached pages.'), - '#default_value' => $config->get('page_compression'), '#prefix' => '
', '#suffix' => '
', - ); - $form['bandwidth_optimization']['preprocess_css'] = array( + )); + $form['bandwidth_optimization']['preprocess_css'] = config_form_element($form, $form_state, $config, 'preprocess_css', array( '#type' => 'checkbox', '#title' => t('Aggregate and compress CSS files.'), - '#default_value' => $config->get('preprocess_css'), '#disabled' => $disabled, - ); - $form['bandwidth_optimization']['preprocess_js'] = array( + )); + $form['bandwidth_optimization']['preprocess_js'] = config_form_element($form, $form_state, $config, 'preprocess_js', array( '#type' => 'checkbox', '#title' => t('Aggregate JavaScript files.'), - '#default_value' => $config->get('preprocess_js'), '#disabled' => $disabled, - ); + )); $form['actions'] = array('#type' => 'actions'); $form['actions']['submit'] = array( @@ -1749,28 +1742,12 @@ function system_performance_settings($form, &$form_state) { // This form allows page compression settings to be changed, which can // invalidate the page cache, so it needs to be cleared on form submit. $form['#submit'][] = 'system_clear_page_cache_submit'; - $form['#submit'][] = 'system_performance_settings_submit'; + $form['#submit'][] = 'config_form_submit'; return $form; } /** - * Form submission handler for system_performance_settings(). - * - * @ingroup forms - */ -function system_performance_settings_submit($form, &$form_state) { - $config = config('system.performance'); - $config->set('cache', $form_state['values']['cache']); - $config->set('cache_lifetime', $form_state['values']['cache_lifetime']); - $config->set('page_cache_maximum_age', $form_state['values']['page_cache_maximum_age']); - $config->set('page_compression', $form_state['values']['page_compression']); - $config->set('preprocess_css', $form_state['values']['preprocess_css']); - $config->set('preprocess_js', $form_state['values']['preprocess_js']); - $config->save(); -} - -/** * Submit callback; clear system caches. * * @ingroup forms