diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 3db5bbd..cfa46b1 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -2615,7 +2615,7 @@ function node_page_view(Node $node) { * Implements hook_update_index(). */ function node_update_index() { - $limit = (int)variable_get('search_cron_limit', 100); + $limit = (int) config('search.settings')->get('cron_limit'); $result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit, array(), array('target' => 'slave')); $nids = $result->fetchCol(); diff --git a/core/modules/search/config/search.settings.yml b/core/modules/search/config/search.settings.yml new file mode 100644 index 0000000..f58f4cd --- /dev/null +++ b/core/modules/search/config/search.settings.yml @@ -0,0 +1,21 @@ +minimum_word_size: 3 +overlap_cjk: 1 +cron_limit: 100 +tag_weights: + h1: 25 + h2: 18 + h3: 15 + h4: 14 + h5: 9 + h6: 6 + u: 3 + b: 3 + i: 3 + strong: 3 + em: 3 + a: 10 +active_modules: + node: node + user: user +and_or_limit: 7 +default_module: 'node' diff --git a/core/modules/search/lib/Drupal/search/SearchQuery.php b/core/modules/search/lib/Drupal/search/SearchQuery.php index 95103a6..b0d7563 100644 --- a/core/modules/search/lib/Drupal/search/SearchQuery.php +++ b/core/modules/search/lib/Drupal/search/SearchQuery.php @@ -203,7 +203,7 @@ class SearchQuery extends SelectExtender { // Classify tokens. $or = FALSE; $warning = ''; - $limit_combinations = variable_get('search_and_or_limit', 7); + $limit_combinations = config('search.settings')->get('and_or_limit'); // The first search expression does not count as AND. $and_count = -1; $or_count = 0; @@ -326,7 +326,7 @@ class SearchQuery extends SelectExtender { $split = explode(' ', $word); foreach ($split as $s) { $num = is_numeric($s); - if ($num || drupal_strlen($s) >= variable_get('minimum_word_size', 3)) { + if ($num || drupal_strlen($s) >= config('search.settings')->get('minimum_word_size')) { if (!isset($this->words[$s])) { $this->words[$s] = $s; $num_new_scores++; @@ -352,11 +352,11 @@ class SearchQuery extends SelectExtender { $this->parseSearchExpression(); if (count($this->words) == 0) { - form_set_error('keys', format_plural(variable_get('minimum_word_size', 3), 'You must include at least one positive keyword with 1 character or more.', 'You must include at least one positive keyword with @count characters or more.')); + form_set_error('keys', format_plural(config('search.settings')->get('minimum_word_size'), 'You must include at least one positive keyword with 1 character or more.', 'You must include at least one positive keyword with @count characters or more.')); return FALSE; } if ($this->expressionsIgnored) { - drupal_set_message(t('Your search used too many AND/OR expressions. Only the first @count terms were included in this search.', array('@count' => variable_get('search_and_or_limit', 7))), 'warning'); + drupal_set_message(t('Your search used too many AND/OR expressions. Only the first @count terms were included in this search.', array('@count' => config('search.settings')->get('and_or_limit'))), 'warning'); } $this->executedFirstPass = TRUE; diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php index fe9ef10..2cd9847 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php @@ -112,9 +112,9 @@ class SearchConfigSettingsFormTest extends SearchTestBase { $info = $module_info[$module]; $edit = array(); foreach ($modules as $other) { - $edit['search_active_modules[' . $other . ']'] = (($other == $module) ? $module : FALSE); + $edit['active_modules[' . $other . ']'] = (($other == $module) ? $module : FALSE); } - $edit['search_default_module'] = $module; + $edit['default_module'] = $module; $this->drupalPost('admin/config/search/settings', $edit, t('Save configuration')); // Run a search from the correct search URL. @@ -151,9 +151,9 @@ class SearchConfigSettingsFormTest extends SearchTestBase { // page or run search, all modules should be shown. $edit = array(); foreach ($modules as $module) { - $edit['search_active_modules[' . $module . ']'] = $module; + $edit['active_modules[' . $module . ']'] = $module; } - $edit['search_default_module'] = 'node'; + $edit['default_module'] = 'node'; $this->drupalPost('admin/config/search/settings', $edit, t('Save configuration')); diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchEmbedFormTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchEmbedFormTest.php index 9e7f134..d086be2 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchEmbedFormTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchEmbedFormTest.php @@ -43,7 +43,7 @@ class SearchEmbedFormTest extends SearchTestBase { // Set up a dummy initial count of times the form has been submitted. $this->submit_count = 12; - variable_set('search_embedded_form_submitted', $this->submit_count); + config('search.settings')->set('search_embedded_form_submitted', $this->submit_count)->save(); $this->refreshVariables(); } @@ -56,7 +56,7 @@ class SearchEmbedFormTest extends SearchTestBase { array('name' => 'John'), t('Send away')); $this->assertText(t('Test form was submitted'), 'Form message appears'); - $count = variable_get('search_embedded_form_submitted', 0); + $count = config('search.settings')->get('search_embedded_form_submitted'); $this->assertEqual($this->submit_count + 1, $count, 'Form submission count is correct'); $this->submit_count = $count; @@ -67,7 +67,7 @@ class SearchEmbedFormTest extends SearchTestBase { array('name' => 'John'), t('Send away')); $this->assertText(t('Test form was submitted'), 'Form message appears'); - $count = variable_get('search_embedded_form_submitted', 0); + $count = config('search.settings')->get('search_embedded_form_submitted'); $this->assertEqual($this->submit_count + 1, $count, 'Form submission count is correct'); $this->submit_count = $count; @@ -77,7 +77,7 @@ class SearchEmbedFormTest extends SearchTestBase { array('keys' => 'foo'), t('Search')); $this->assertNoText(t('Test form was submitted'), 'Form message does not appear'); - $count = variable_get('search_embedded_form_submitted', 0); + $count = config('search.settings')->get('search_embedded_form_submitted'); $this->assertEqual($this->submit_count, $count, 'Form submission count is correct'); $this->submit_count = $count; } diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchKeywordsConditionsTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchKeywordsConditionsTest.php index 179b825..5937ba7 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchKeywordsConditionsTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchKeywordsConditionsTest.php @@ -26,8 +26,7 @@ class SearchKeywordsConditionsTest extends SearchTestBase { // Login with sufficient privileges. $this->drupalLogin($this->searching_user); // Test with all search modules enabled. - variable_set('search_active_modules', array('node' => 'node', 'user' => 'user', 'search_extra_type' => 'search_extra_type')); - menu_router_rebuild(); + config('search.settings')->set('active_modules', array('node' => 'node', 'user' => 'user', 'search_extra_type' => 'search_extra_type'))->save(); menu_router_rebuild(); } /** diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchMatchTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchMatchTest.php index e222341..a822600 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchMatchTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchMatchTest.php @@ -34,7 +34,7 @@ class SearchMatchTest extends SearchTestBase { * Set up a small index of items to test against. */ function _setup() { - variable_set('minimum_word_size', 3); + config('search.settings')->set('minimum_word_size', 3)->save(); for ($i = 1; $i <= 7; ++$i) { search_index($i, SEARCH_TYPE, $this->getText($i)); diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchPageOverrideTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchPageOverrideTest.php index 590f68b..a604494 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchPageOverrideTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchPageOverrideTest.php @@ -29,7 +29,7 @@ class SearchPageOverrideTest extends SearchTestBase { $this->drupalLogin($this->search_user); // Enable the extra type module for searching. - variable_set('search_active_modules', array('node' => 'node', 'user' => 'user', 'search_extra_type' => 'search_extra_type')); + config('search.settings')->set('active_modules', array('node' => 'node', 'user' => 'user', 'search_extra_type' => 'search_extra_type'))->save(); menu_router_rebuild(); } diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchPageTextTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchPageTextTest.php index ae3ee79..03b9619 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchPageTextTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchPageTextTest.php @@ -60,7 +60,7 @@ class SearchPageTextTest extends SearchTestBase { // Test a search input exceeding the limit of AND/OR combinations to test // the Denial-of-Service protection. - $limit = variable_get('search_and_or_limit', 7); + $limit = config('search.settings')->get('and_or_limit'); $keys = array(); for ($i = 0; $i < $limit + 1; $i++) { $keys[] = $this->randomName(3); diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchTokenizerTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchTokenizerTest.php index 2624abb..4192f1f 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchTokenizerTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchTokenizerTest.php @@ -30,8 +30,10 @@ class SearchTokenizerTest extends SearchTestBase { function testTokenizer() { // Set the minimum word size to 1 (to split all CJK characters) and make // sure CJK tokenizing is turned on. - variable_set('minimum_word_size', 1); - variable_set('overlap_cjk', TRUE); + config('search.settings') + ->set('minimum_word_size', 1) + ->set('overlap_cjk', TRUE) + ->save(); $this->refreshVariables(); // Create a string of CJK characters from various character ranges in @@ -116,8 +118,10 @@ class SearchTokenizerTest extends SearchTestBase { function testNoTokenizer() { // Set the minimum word size to 1 (to split all CJK characters) and make // sure CJK tokenizing is turned on. - variable_set('minimum_word_size', 1); - variable_set('overlap_cjk', TRUE); + config('search.settings') + ->set('minimum_word_size', 1) + ->set('overlap_cjk', TRUE) + ->save(); $this->refreshVariables(); $letters = 'abcdefghijklmnopqrstuvwxyz'; diff --git a/core/modules/search/search.admin.inc b/core/modules/search/search.admin.inc index bef8fd9..171e73f 100644 --- a/core/modules/search/search.admin.inc +++ b/core/modules/search/search.admin.inc @@ -50,10 +50,12 @@ function _search_get_module_names() { * @see search_admin_reindex_submit() */ function search_admin_settings($form) { + $config = config('search.settings'); + // Collect some stats $remaining = 0; $total = 0; - foreach (variable_get('search_active_modules', array('node', 'user')) as $module) { + foreach (config('search.settings')->get('active_modules') as $module) { if ($status = module_invoke($module, 'search_status')) { $remaining += $status['remaining']; $total += $status['total']; @@ -74,10 +76,10 @@ function search_admin_settings($form) { '#type' => 'fieldset', '#title' => t('Indexing throttle') ); - $form['indexing_throttle']['search_cron_limit'] = array( + $form['indexing_throttle']['cron_limit'] = array( '#type' => 'select', '#title' => t('Number of items to index per cron run'), - '#default_value' => variable_get('search_cron_limit', 100), + '#default_value' => $config->get('cron_limit'), '#options' => $items, '#description' => t('The maximum number of items indexed in each pass of a cron maintenance task. If necessary, reduce the number of items to prevent timeouts and memory errors while indexing.', array('@cron' => url('admin/reports/status'))) ); @@ -92,7 +94,7 @@ function search_admin_settings($form) { $form['indexing_settings']['minimum_word_size'] = array( '#type' => 'number', '#title' => t('Minimum word length to index'), - '#default_value' => variable_get('minimum_word_size', 3), + '#default_value' => $config->get('minimum_word_size'), '#min' => 1, '#max' => 1000, '#description' => t('The number of characters a word has to be to be indexed. A lower setting means better search result ranking, but also a larger database. Each search query must contain at least one keyword that is this size (or longer).') @@ -100,7 +102,7 @@ function search_admin_settings($form) { $form['indexing_settings']['overlap_cjk'] = array( '#type' => 'checkbox', '#title' => t('Simple CJK handling'), - '#default_value' => variable_get('overlap_cjk', TRUE), + '#default_value' => $config->get('overlap_cjk'), '#description' => t('Whether to apply a simple Chinese/Japanese/Korean tokenizer based on overlapping sequences. Turn this off if you want to use an external preprocessor for this instead. Does not affect other languages.') ); @@ -109,18 +111,18 @@ function search_admin_settings($form) { '#title' => t('Active search modules') ); $module_options = _search_get_module_names(); - $form['active']['search_active_modules'] = array( + $form['active']['active_modules'] = array( '#type' => 'checkboxes', '#title' => t('Active modules'), '#title_display' => 'invisible', - '#default_value' => variable_get('search_active_modules', array('node', 'user')), + '#default_value' => $config->get('active_modules'), '#options' => $module_options, '#description' => t('Choose which search modules are active from the available modules.') ); - $form['active']['search_default_module'] = array( + $form['active']['default_module'] = array( '#title' => t('Default search module'), '#type' => 'radios', - '#default_value' => variable_get('search_default_module', 'node'), + '#default_value' => $config->get('default_module'), '#options' => $module_options, '#description' => t('Choose which search module is the default.') ); @@ -128,14 +130,14 @@ function search_admin_settings($form) { $form['#submit'][] = 'search_admin_settings_submit'; // Per module settings - foreach (variable_get('search_active_modules', array('node', 'user')) as $module) { + foreach (config('search.settings')->get('active_modules') as $module) { $added_form = module_invoke($module, 'search_admin'); if (is_array($added_form)) { $form = array_merge($form, $added_form); } } - return system_settings_form($form); + return system_config_form($form, $form_state); } /** @@ -144,10 +146,10 @@ function search_admin_settings($form) { function search_admin_settings_validate($form, &$form_state) { // Check whether we selected a valid default. if ($form_state['triggering_element']['#value'] != t('Reset to defaults')) { - $new_modules = array_filter($form_state['values']['search_active_modules']); - $default = $form_state['values']['search_default_module']; + $new_modules = array_filter($form_state['values']['active_modules']); + $default = $form_state['values']['default_module']; if (!in_array($default, $new_modules, TRUE)) { - form_set_error('search_default_module', t('Your default search module is not selected as an active module.')); + form_set_error('default_module', t('Your default search module is not selected as an active module.')); } } } @@ -156,24 +158,38 @@ function search_admin_settings_validate($form, &$form_state) { * Form submission handler for search_admin_settings(). */ function search_admin_settings_submit($form, &$form_state) { + $config = config('search.settings'); // If these settings change, the index needs to be rebuilt. - if ((variable_get('minimum_word_size', 3) != $form_state['values']['minimum_word_size']) || - (variable_get('overlap_cjk', TRUE) != $form_state['values']['overlap_cjk'])) { + if (($config->get('minimum_word_size') != $form_state['values']['minimum_word_size']) || ($config->get('overlap_cjk') != $form_state['values']['overlap_cjk'])) { + $config->set('minimum_word_size', $form_state['values']['minimum_word_size']); + $config->set('overlap_cjk', $form_state['values']['overlap_cjk']); drupal_set_message(t('The index will be rebuilt.')); search_reindex(); } - $current_modules = variable_get('search_active_modules', array('node', 'user')); + if ($config->get('cron_limit') != $form_state['values']['cron_limit']) { + $config->set('cron_limit', $form_state['values']['cron_limit']); + } + if ($config->get('default_module') != $form_state['values']['default_module']) { + $config->set('default_module', $form_state['values']['default_module']); + } + $current_modules = $config->get('active_modules'); // Check whether we are resetting the values. if ($form_state['triggering_element']['#value'] == t('Reset to defaults')) { $new_modules = array('node', 'user'); } else { - $new_modules = array_filter($form_state['values']['search_active_modules']); + $new_modules = array_filter($form_state['values']['active_modules']); } - if (array_diff($current_modules, $new_modules)) { + if ($current_modules != $new_modules) { + $enabled_modules = array(); + foreach ($new_modules as $module) { + $enabled_modules[$module] = $module; + } + $config->set('active_modules', $enabled_modules); drupal_set_message(t('The active search modules have been changed.')); variable_set('menu_rebuild_needed', TRUE); } + $config->save(); } /** diff --git a/core/modules/search/search.api.php b/core/modules/search/search.api.php index 0f43460..58c785c 100644 --- a/core/modules/search/search.api.php +++ b/core/modules/search/search.api.php @@ -69,7 +69,7 @@ function sample_search_conditions_callback($keys) { if (!empty($_REQUEST['sample_search_keys'])) { $conditions['sample_search_keys'] = $_REQUEST['sample_search_keys']; } - if ($force_keys = variable_get('sample_search_force_keywords', '')) { + if ($force_keys = config('search.settings')->get('sample_search_force_keywords')) { $conditions['sample_search_force_keywords'] = $force_keys; } return $conditions; @@ -328,15 +328,16 @@ function hook_search_preprocess($text) { * When implementing this hook, your module should index content items that * were modified or added since the last run. PHP has a time limit * for cron, though, so it is advisable to limit how many items you index - * per run using variable_get('search_cron_limit') (see example below). Also, - * since the cron run could time out and abort in the middle of your run, you - * should update your module's internal bookkeeping on when items have last - * been indexed as you go rather than waiting to the end of indexing. + * per run using config('search.settings')->get('cron_limit') (see + * example below). Also, * since the cron run could time out and abort in the + * middle of your run, you * should update your module's internal bookkeeping on + * when items have last * been indexed as you go rather than waiting to the end + * of indexing. * * @ingroup search */ function hook_update_index() { - $limit = (int)variable_get('search_cron_limit', 100); + $limit = (int) config('search.settings')->get('cron_limit'); $result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit); diff --git a/core/modules/search/search.install b/core/modules/search/search.install index c450f05..d3b86cd 100644 --- a/core/modules/search/search.install +++ b/core/modules/search/search.install @@ -6,15 +6,6 @@ */ /** - * Implements hook_uninstall(). - */ -function search_uninstall() { - variable_del('minimum_word_size'); - variable_del('overlap_cjk'); - variable_del('search_cron_limit'); -} - -/** * Implements hook_schema(). */ function search_schema() { @@ -153,3 +144,19 @@ function search_schema() { return $schema; } + +/** + * Update search module to use the configuration system. + */ +function search_update_8000() { + config_install_default_config('search'); + update_variables_to_config('search.settings', array( + 'minimum_word_size' => 'minimum_word_size', + 'overlap_cjk' => 'overlap_cjk', + 'search_cron_limit' => 'cron_limit', + 'search_tag_weights' => 'tag_weights', + 'search_active_modules' => 'active_modules', + 'search_and_or_limit' => 'and_or_limit', + 'search_default_module' => 'default_module', + )); +} diff --git a/core/modules/search/search.module b/core/modules/search/search.module index f567dae..cb91a4c 100644 --- a/core/modules/search/search.module +++ b/core/modules/search/search.module @@ -277,7 +277,7 @@ function search_get_info($all = FALSE) { return $search_hooks; } - $active = variable_get('search_active_modules', array('node', 'user')); + $active = config('search.settings')->get('active_modules'); return array_intersect_key($search_hooks, array_flip($active)); } @@ -289,7 +289,7 @@ function search_get_info($all = FALSE) { */ function search_get_default_module_info() { $info = search_get_info(); - $default = variable_get('search_default_module', 'node'); + $default = config('search.settings')->get('default_module'); if (isset($info[$default])) { return $info[$default]; } @@ -367,7 +367,7 @@ function search_cron() { // to date. drupal_register_shutdown_function('search_update_totals'); - foreach (variable_get('search_active_modules', array('node', 'user')) as $module) { + foreach (config('search.settings')->get('active_modules') as $module) { // Update word index module_invoke($module, 'update_index'); } @@ -428,7 +428,7 @@ function search_simplify($text) { search_invoke_preprocess($text); // Simple CJK handling - if (variable_get('overlap_cjk', TRUE)) { + if (config('search.settings')->get('overlap_cjk')) { $text = preg_replace_callback('/[' . PREG_CLASS_CJK . ']+/u', 'search_expand_cjk', $text); } @@ -482,7 +482,7 @@ function search_simplify($text) { * Tokenized text, starting and ending with a space character. */ function search_expand_cjk($matches) { - $min = variable_get('minimum_word_size', 3); + $min = config('search.settings')->get('minimum_word_size'); $str = $matches[0]; $length = drupal_strlen($str); // If the text is shorter than the minimum word size, don't tokenize it. @@ -561,7 +561,7 @@ function search_invoke_preprocess(&$text) { * @ingroup search */ function search_index($sid, $module, $text) { - $minimum_word_size = variable_get('minimum_word_size', 3); + $minimum_word_size = config('search.settings')->get('minimum_word_size'); // Link matching global $base_url; @@ -570,19 +570,7 @@ function search_index($sid, $module, $text) { // Multipliers for scores of words inside certain HTML tags. The weights are stored // in a variable so that modules can overwrite the default weights. // Note: 'a' must be included for link ranking to work. - $tags = variable_get('search_tag_weights', array( - 'h1' => 25, - 'h2' => 18, - 'h3' => 15, - 'h4' => 12, - 'h5' => 9, - 'h6' => 6, - 'u' => 3, - 'b' => 3, - 'i' => 3, - 'strong' => 3, - 'em' => 3, - 'a' => 10)); + $tags = config('search.settings')->get('tag_weights'); // Strip off all ignored tags to speed up processing, but insert space before/after // them to keep word boundaries. diff --git a/core/modules/search/tests/modules/search_embedded_form/search_embedded_form.module b/core/modules/search/tests/modules/search_embedded_form/search_embedded_form.module index 4845796..ccd5e65 100644 --- a/core/modules/search/tests/modules/search_embedded_form/search_embedded_form.module +++ b/core/modules/search/tests/modules/search_embedded_form/search_embedded_form.module @@ -30,7 +30,7 @@ function search_embedded_form_menu() { * @see search_embedded_form_form_submit(). */ function search_embedded_form_form($form, &$form_state) { - $count = variable_get('search_embedded_form_submitted', 0); + $count = config('search.settings')->get('search_embedded_form_submitted'); $form['name'] = array( '#type' => 'textfield', @@ -56,8 +56,10 @@ function search_embedded_form_form($form, &$form_state) { * Submit handler for search_embedded_form_form(). */ function search_embedded_form_form_submit($form, &$form_state) { - $count = variable_get('search_embedded_form_submitted', 0) + 1; - variable_set('search_embedded_form_submitted', $count); + $search_config = config('search.settings'); + $submit_count = (int) $search_config->get('search_embedded_form_submitted'); + $count = $submit_count + 1; + $search_config->set('search_embedded_form_submitted', $count)->save(); drupal_set_message(t('Test form was submitted')); }