diff --git a/core/modules/node/node.install b/core/modules/node/node.install index a4cc155..6bf5d2f 100644 --- a/core/modules/node/node.install +++ b/core/modules/node/node.install @@ -523,12 +523,6 @@ function node_uninstall() { config('language.settings')->clear('node. ' . $type . '.language.default_configuration')->save(); } - // Delete node search ranking variables. - variable_del('node_rank_relevance'); - variable_del('node_rank_sticky'); - variable_del('node_rank_promote'); - variable_del('node_rank_recent'); - // Delete remaining general module variables. state()->delete('node.node_access_needs_rebuild'); variable_del('node_admin_theme'); diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 1aebdd5..2ebcf77 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -152,9 +152,6 @@ function node_theme() { 'render element' => 'elements', 'template' => 'node', ), - 'node_search_admin' => array( - 'render element' => 'form', - ), 'node_add_list' => array( 'variables' => array('content' => NULL), 'file' => 'node.pages.inc', @@ -1210,8 +1207,10 @@ function node_permission() { function _node_rankings(SelectExtender $query) { if ($ranking = module_invoke_all('ranking')) { $tables = &$query->getTables(); + $ranks = config('search.node')->get('rank'); foreach ($ranking as $rank => $values) { - if ($node_rank = variable_get('node_rank_' . $rank, 0)) { + if (!empty($ranks[$rank])) { + $node_rank = $ranks[$rank]; // If the table defined in the ranking isn't already joined, then add it. if (isset($values['join']) && !isset($tables[$values['join']['alias']])) { $query->addJoin($values['join']['type'], $values['join']['table'], $values['join']['alias'], $values['join']['on']); @@ -1261,32 +1260,57 @@ function node_search_status() { /** * Implements hook_search_admin(). + * @see node_search_admin_submit() */ function node_search_admin() { // Output form for defining rank factor weights. $form['content_ranking'] = array( '#type' => 'details', '#title' => t('Content ranking'), + '#tree' => TRUE, ); - $form['content_ranking']['#theme'] = 'node_search_admin'; $form['content_ranking']['info'] = array( - '#value' => '' . t('The following numbers control which properties the content search should favor when ordering the results. Higher numbers mean more influence, zero means the property is ignored. Changing these numbers does not require the search index to be rebuilt. Changes take effect immediately.') . '' + '#markup' => '' . t('The following numbers control which properties the content search should favor when ordering the results. Higher numbers mean more influence, zero means the property is ignored. Changing these numbers does not require the search index to be rebuilt. Changes take effect immediately.') . '' + ); + $form['content_ranking']['factors'] = array( + '#type' => 'table', + '#header' => array(t('Factor'), t('Weight')), ); // Note: reversed to reflect that higher number = higher ranking. $options = drupal_map_assoc(range(0, 10)); + + $ranks = config('search.node')->get('rank'); foreach (module_invoke_all('ranking') as $var => $values) { - $form['content_ranking']['factors']['node_rank_' . $var] = array( + $row = array(); + $row['factor'] = array('#markup' => $values['title']); + $row[$var] = array( '#title' => $values['title'], + '#title_display' => 'invisible', '#type' => 'select', '#options' => $options, - '#default_value' => variable_get('node_rank_' . $var, 0), + '#default_value' => isset($ranks[$var]) ? $ranks[$var] : 0, ); + $form['content_ranking']['factors'][] = $row; } + $form['#submit'][] = 'node_search_admin_submit'; return $form; } /** + * Submit callback for search admin form callback. + */ +function node_search_admin_submit($form, &$form_state) { + $ranks = array(); + foreach ($form_state['values']['content_ranking']['factors'] as $factor){ + $ranks += $factor; + } + config('search.node') + ->set('rank', $ranks) + ->save(); +} + +/** * Implements hook_search_execute(). */ function node_search_execute($keys = NULL, $conditions = NULL) { @@ -1444,35 +1468,6 @@ function node_user_predelete($account) { } /** - * Returns HTML for the content ranking part of the search settings admin page. - * - * @param $variables - * An associative array containing: - * - form: A render element representing the form. - * - * @see node_search_admin() - * @ingroup themeable - */ -function theme_node_search_admin($variables) { - $form = $variables['form']; - - $output = drupal_render($form['info']); - - $header = array(t('Factor'), t('Weight')); - foreach (element_children($form['factors']) as $key) { - $row = array(); - $row[] = $form['factors'][$key]['#title']; - $form['factors'][$key]['#title_display'] = 'invisible'; - $row[] = drupal_render($form['factors'][$key]); - $rows[] = $row; - } - $output .= theme('table', array('header' => $header, 'rows' => $rows)); - - $output .= drupal_render_children($form); - return $output; -} - -/** * Access callback: Checks node revision access. * * @param \Drupal\Core\Entity\EntityInterface $node diff --git a/core/modules/search/config/search.node.yml b/core/modules/search/config/search.node.yml new file mode 100644 index 0000000..5aa4eb4 --- /dev/null +++ b/core/modules/search/config/search.node.yml @@ -0,0 +1,5 @@ +rank: + promote: '0' + recent: '0' + relevance: '0' + sticky: '0' diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchRankingTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchRankingTest.php index e85dcd6..c308e57 100644 --- a/core/modules/search/lib/Drupal/search/Tests/SearchRankingTest.php +++ b/core/modules/search/lib/Drupal/search/Tests/SearchRankingTest.php @@ -94,9 +94,11 @@ function testRankings() { // Test each of the possible rankings. foreach ($node_ranks as $node_rank) { // Disable all relevancy rankings except the one we are testing. + $ranks = array(); foreach ($node_ranks as $var) { - variable_set('node_rank_' . $var, $var == $node_rank ? 10 : 0); + $ranks[$var] = $var == $node_rank ? 10 : 0; } + config('search.node')->set('rank', $ranks)->save(); // Do the search and assert the results. $set = node_search_execute('rocks'); @@ -150,10 +152,8 @@ function testHTMLRankings() { $this->refreshVariables(); // Disable all other rankings. - $node_ranks = array('sticky', 'promote', 'recent', 'comments', 'views'); - foreach ($node_ranks as $node_rank) { - variable_set('node_rank_' . $node_rank, 0); - } + $ranks = array('sticky' => 0, 'promote' => 0, 'recent' => 0, 'comments' => 0, 'views' => 0); + config('search.node')->set('rank', $ranks)->save(); $set = node_search_execute('rocks'); // Test the ranking of each tag. @@ -220,11 +220,8 @@ function testDoubleRankings() { // Set up for ranking sticky and lots of comments; make sure others are // disabled. - $node_ranks = array('sticky', 'promote', 'relevance', 'recent', 'comments', 'views'); - foreach ($node_ranks as $var) { - $value = ($var == 'sticky' || $var == 'comments') ? 10 : 0; - variable_set('node_rank_' . $var, $value); - } + $ranks = array('sticky' => 10, 'promote' => 0, 'relevance' => 0, 'recent' => 0, 'comments' => 10, 'views' => 0); + config('search.node')->set('rank', $ranks)->save(); // Do the search and assert the results. $set = node_search_execute('rocks'); diff --git a/core/modules/search/search.api.php b/core/modules/search/search.api.php index 3b7a986..6802d0d 100644 --- a/core/modules/search/search.api.php +++ b/core/modules/search/search.api.php @@ -115,7 +115,7 @@ function hook_search_admin() { // Note: reversed to reflect that higher number = higher ranking. $options = drupal_map_assoc(range(0, 10)); - $ranks = config('node.settings')->get('search_rank'); + $ranks = config('search.node')->get('rank'); foreach (module_invoke_all('ranking') as $var => $values) { $form['content_ranking']['factors'][$var] = array( '#title' => $values['title'], diff --git a/core/modules/search/search.install b/core/modules/search/search.install index 40a569c..7bf4ba8 100644 --- a/core/modules/search/search.install +++ b/core/modules/search/search.install @@ -214,3 +214,17 @@ function search_update_8001() { )); db_add_primary_key('search_index', array('word', 'sid', 'langcode', 'type')); } + +/** + * Moves node search rank variables to search.node settings. + */ +function search_update_8002() { + update_variables_to_config('search.node', array( + 'node_rank_relevance' => 'rank.relevance', + 'node_rank_sticky' => 'rank.sticky', + 'node_rank_promote' => 'rank.promote', + 'node_rank_recent' => 'rank.recent', + 'node_rank_comments' => 'rank.comments', + 'node_rank_views' => 'rank.views', + )); +} diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/SystemUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/SystemUpgradePathTest.php index 5d35e32..0d90948 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/SystemUpgradePathTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/SystemUpgradePathTest.php @@ -34,6 +34,11 @@ public function testVariableUpgrade() { $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.'); // Verify that variables were properly upgraded. + $expected_config['search.node'] = array( + 'rank.promote' => 10, + 'rank.views' => 5, + 'rank.comments' => -2, + ); $expected_config['system.cron'] = array( 'threshold.autorun' => '86400', 'threshold.requirements_warning' => '86400', diff --git a/core/modules/system/tests/upgrade/drupal-7.system.database.php b/core/modules/system/tests/upgrade/drupal-7.system.database.php index beebe4e..7bbf247 100644 --- a/core/modules/system/tests/upgrade/drupal-7.system.database.php +++ b/core/modules/system/tests/upgrade/drupal-7.system.database.php @@ -163,6 +163,18 @@ 'name' => 'aggregator_summary_items', 'value' => 'i:5;', )) + ->values(array( + 'name' => 'node_rank_promote', + 'value' => 'i:10;', + )) + ->values(array( + 'name' => 'node_rank_views', + 'value' => 'i:5;', + )) + ->values(array( + 'name' => 'node_rank_comments', + 'value' => 'i:-2;', + )) ->execute(); db_update('variable')