diff --git a/includes/common.inc b/includes/common.inc
index 1e287f8..824b66a 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -4901,7 +4901,6 @@ function _drupal_bootstrap_full() {
require_once DRUPAL_ROOT . '/includes/theme.inc';
require_once DRUPAL_ROOT . '/includes/pager.inc';
require_once DRUPAL_ROOT . '/' . variable_get('menu_inc', 'includes/menu.inc');
- require_once DRUPAL_ROOT . '/includes/tablesort.inc';
require_once DRUPAL_ROOT . '/includes/file.inc';
require_once DRUPAL_ROOT . '/includes/unicode.inc';
require_once DRUPAL_ROOT . '/includes/image.inc';
diff --git a/includes/tablesort.inc b/includes/tablesort.inc
index 121a1b9..59b3d51 100644
--- a/includes/tablesort.inc
+++ b/includes/tablesort.inc
@@ -15,7 +15,7 @@
class TableSort extends SelectQueryExtender {
/**
- * The array of fields that can be sorted by.
+ * An array of table header columns that can be sorted by, as described in theme_table().
*
* @var array
*/
@@ -33,23 +33,22 @@ class TableSort extends SelectQueryExtender {
/**
* Order the query based on a header array.
*
- * @see theme_table()
* @param $header
- * Table header array.
+ * An array of table header columns as described in theme_table().
+ *
* @return SelectQueryInterface
* The called object.
+ *
+ * @see theme_table()
*/
- public function orderByHeader(Array $header) {
+ public function orderByHeader(array $header) {
$this->header = $header;
$ts = $this->init();
- if (!empty($ts['sql'])) {
- // Based on code from db_escape_table(), but this can also contain a dot.
- $field = preg_replace('/[^A-Za-z0-9_.]+/', '', $ts['sql']);
-
+ if (!empty($ts['field'])) {
// Sort order can only be ASC or DESC.
$sort = drupal_strtoupper($ts['sort']);
$sort = in_array($sort, array('ASC', 'DESC')) ? $sort : '';
- $this->orderBy($field, $sort);
+ $this->orderBy($ts['field'], $sort);
}
return $this;
}
@@ -68,7 +67,7 @@ class TableSort extends SelectQueryExtender {
* Determine the current sort direction.
*
* @param $headers
- * An array of column headers in the format described in theme_table().
+ * An array of table header columns as described in theme_table().
* @return
* The current sort direction ("asc" or "desc").
*/
@@ -92,12 +91,10 @@ class TableSort extends SelectQueryExtender {
/**
* Determine the current sort criterion.
*
- * @param $headers
- * An array of column headers in the format described in theme_table().
* @return
* An associative array describing the criterion, containing the keys:
* - "name": The localized title of the table column.
- * - "sql": The name of the database field to sort on.
+ * - "field": The name of the database field to sort on.
*/
protected function order() {
return tablesort_get_order($this->header);
@@ -123,7 +120,7 @@ function tablesort_init($header) {
* @param $cell
* The cell to format.
* @param $header
- * An array of column headers in the format described in theme_table().
+ * An array of table header columns as described in theme_table().
* @param $ts
* The current table sort context as returned from tablesort_init().
* @return
@@ -133,7 +130,7 @@ function tablesort_header($cell, $header, $ts) {
// Special formatting for the currently sorted column header.
if (is_array($cell) && isset($cell['field'])) {
$title = t('sort by @s', array('@s' => $cell['data']));
- if ($cell['data'] == $ts['name']) {
+ if ($cell['field'] == $ts['field']) {
$ts['sort'] = (($ts['sort'] == 'asc') ? 'desc' : 'asc');
$cell['class'][] = 'active';
$image = theme('tablesort_indicator', array('style' => $ts['sort']));
@@ -143,7 +140,12 @@ function tablesort_header($cell, $header, $ts) {
$ts['sort'] = 'asc';
$image = '';
}
- $cell['data'] = l($cell['data'] . $image, $_GET['q'], array('attributes' => array('title' => $title), 'query' => array_merge($ts['query'], array('sort' => $ts['sort'], 'order' => $cell['data'])), 'html' => TRUE));
+ $options = array(
+ 'attributes' => array('title' => $title),
+ 'query' => array_merge($ts['query'], array('sort' => $ts['sort'], 'order' => $cell['field'])),
+ 'html' => TRUE,
+ );
+ $cell['data'] = l($cell['data'] . $image, $_GET['q'], $options);
unset($cell['field'], $cell['sort']);
}
@@ -158,7 +160,7 @@ function tablesort_header($cell, $header, $ts) {
* @param $cell
* The cell to format.
* @param $header
- * An array of column headers in the format described in theme_table().
+ * An array of table header columns as described in theme_table().
* @param $ts
* The current table sort context as returned from tablesort_init().
* @param $i
@@ -167,7 +169,7 @@ function tablesort_header($cell, $header, $ts) {
* A properly formatted cell, ready for _theme_table_cell().
*/
function tablesort_cell($cell, $header, $ts, $i) {
- if (isset($header[$i]['data']) && $header[$i]['data'] == $ts['name'] && !empty($header[$i]['field'])) {
+ if (isset($header[$i]['field']) && $header[$i]['field'] == $ts['field']) {
if (is_array($cell)) {
$cell['class'][] = 'active';
}
@@ -192,37 +194,47 @@ function tablesort_get_query_parameters() {
/**
* Determine the current sort criterion.
*
- * @param $headers
- * An array of column headers in the format described in theme_table().
+ * @param $header
+ * An array of table headers columns as described in theme_table().
* @return
* An associative array describing the criterion, containing the keys:
* - "name": The localized title of the table column.
- * - "sql": The name of the database field to sort on.
+ * - "field": The name of the database field to sort on.
*/
-function tablesort_get_order($headers) {
+function tablesort_get_order($header) {
$order = isset($_GET['order']) ? $_GET['order'] : '';
- foreach ($headers as $header) {
- if (is_array($header)) {
- if (isset($header['data']) && $order == $header['data']) {
- $default = $header;
- break;
- }
-
- if (empty($default) && isset($header['sort']) && ($header['sort'] == 'asc' || $header['sort'] == 'desc')) {
- $default = $header;
- }
+ foreach ($header as $column) {
+ if (!is_array($column) || !isset($column['field'])) {
+ continue;
}
- }
- if (!isset($default)) {
- $default = reset($headers);
- if (!is_array($default)) {
- $default = array('data' => $default);
+ // Use the header column matching the URL parameter.
+ if ($order == $column['field']) {
+ return array('name' => $column['data'], 'field' => $column['field']);
+ }
+ // In case no header column will match the URL parameter, and this column
+ // defines 'sort', it is supposed to be the default sorting column.
+ if (isset($column['sort']) && ($column['sort'] == 'asc' || $column['sort'] == 'desc')) {
+ $default_column = array('name' => $column['data'], 'field' => $column['field']);
+ }
+ // In case there is no default sorting header column, store the first that
+ // defines a field.
+ elseif (!isset($first_column)) {
+ $first_column = array('name' => $column['data'], 'field' => $column['field']);
}
}
- $default += array('data' => NULL, 'field' => NULL);
- return array('name' => $default['data'], 'sql' => $default['field']);
+ // If there was a default sorting column, return that.
+ if (isset($default_column)) {
+ return $default_column;
+ }
+ // Otherwise, use the first header column that defines a field.
+ if (isset($first_column)) {
+ return $first_column;
+ }
+ // If we end up here, then a table header did not define any valid tablesort
+ // data.
+ throw new Exception(t('Invalid TableSort data; header needs to define at least one sorting field.'));
}
/**
diff --git a/includes/theme.inc b/includes/theme.inc
index 6c2b640..590c4ef 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -1688,22 +1688,28 @@ function theme_table($variables) {
$rows[] = array(array('data' => $empty, 'colspan' => $header_count, 'class' => array('empty', 'message')));
}
- // Format the table header:
+ // Format the table header.
if (count($header)) {
- $ts = tablesort_init($header);
+ // Determine whether we need to load tablesort.
+ foreach ($header as $column) {
+ if (is_array($column) && isset($column['field'])) {
+ require_once DRUPAL_ROOT . '/includes/tablesort.inc';
+ $ts = tablesort_init($header);
+ break;
+ }
+ }
// HTML requires that the thead tag has tr tags in it followed by tbody
// tags. Using ternary operator to check and see if we have any rows.
$output .= (count($rows) ? ' ' : ' ');
foreach ($header as $cell) {
- $cell = tablesort_header($cell, $header, $ts);
+ if (isset($ts)) {
+ $cell = tablesort_header($cell, $header, $ts);
+ }
$output .= _theme_table_cell($cell, TRUE);
}
// Using ternary operator to close the tags based on whether or not there are rows
$output .= (count($rows) ? " \n" : "\n");
}
- else {
- $ts = array();
- }
// Format the table rows:
if (count($rows)) {
@@ -1738,7 +1744,9 @@ function theme_table($variables) {
$output .= '