diff --git a/includes/form.inc b/includes/form.inc index 2610c99021db0bfeaf34532a2dcc4a5a924e78e1..235d560b7695ab63586ea5ec42e8b779bf797ed3 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -2932,12 +2932,12 @@ function theme_tableselect($variables) { $header = $element['#header']; if (!empty($element['#options'])) { // Generate a table row for each selectable item in #options. - foreach ($element['#options'] as $key => $value) { + foreach (element_children($element) as $key) { $row = array(); $row['data'] = array(); - if (isset($value['#attributes'])) { - $row += $value['#attributes']; + if (isset($element['#options'][$key]['#attributes'])) { + $row += $element['#options'][$key]['#attributes']; } // Render the checkbox / radio element. $row['data'][] = drupal_render($element[$key]); @@ -2991,8 +2991,6 @@ function form_process_tableselect($element) { $element['#default_value'] = array(); } - // Sort the options by their #weight if they have a #weight. - uasort($element['#options'], 'element_sort'); // Create a checkbox or radio for each item in #options in such a way that // the value of the tableselect element behaves as if it had been of type // checkboxes or radios. @@ -3023,6 +3021,9 @@ function form_process_tableselect($element) { '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL, ); } + if (isset($element['#options'][$key]['#weight'])) { + $element[$key]['#weight'] = $element['#options'][$key]['#weight']; + } } } } diff --git a/modules/node/node.test b/modules/node/node.test index 59b12f0086fa77f4d8e8ae7b3863afefe0bb9a1b..66d6bf75727ff7602e9c5cead1521f11bdd337b4 100644 --- a/modules/node/node.test +++ b/modules/node/node.test @@ -1278,6 +1278,30 @@ class NodeAdminTestCase extends DrupalWebTestCase { $this->base_user_3 = $this->drupalCreateUser(array('access content overview', 'bypass node access')); } + /** + * Tests that the table sorting works on the content admin pages. + */ + function testContentAdminSort() { + $this->drupalLogin($this->admin_user); + foreach (array('dd', 'aa', 'DD', 'bb', 'cc', 'CC', 'AA', 'BB') as $prefix) { + $this->drupalCreateNode(array('title' => $prefix . $this->randomName(6))); + } + + // Compare the rendered HTML node list to a query for the nodes ordered by + // title to account for possible database-dependent sort order. + $nodes_query = db_select('node', 'n') + ->fields('n', array('nid')) + ->orderBy('title') + ->execute() + ->fetchCol(); + + $this->drupalGet('admin/content', array('query' => array('sort' => 'asc', 'order' => 'Title'))); + foreach ($this->xpath('//table/tbody/tr/td/div/input/@value') as $input) { + $nodes_form[] = $input; + } + $this->assertEqual($nodes_query, $nodes_form, 'Nodes are sorted in the form the same as they are in the query.'); + } + /** * Tests content overview with different user permissions. *