summaryrefslogtreecommitdiff
path: root/includes/tablesort.inc
diff options
context:
space:
mode:
Diffstat (limited to 'includes/tablesort.inc')
-rw-r--r--includes/tablesort.inc99
1 files changed, 94 insertions, 5 deletions
diff --git a/includes/tablesort.inc b/includes/tablesort.inc
index e72e078f5..7a3fcf1ee 100644
--- a/includes/tablesort.inc
+++ b/includes/tablesort.inc
@@ -1,6 +1,17 @@
<?php
// $Id$
+/**
+ * @file
+ * Functions to aid in the creation of sortable tables.
+ *
+ * All tables created with a call to theme('table') have the option of having
+ * column headers that the user can click on to sort the table by that column.
+ */
+
+/**
+ * Initialize the table sort context.
+ */
function tablesort_init($header) {
$ts = tablesort_get_order($header);
$ts['sort'] = tablesort_get_sort($header);
@@ -8,13 +19,35 @@ function tablesort_init($header) {
return $ts;
}
+/**
+ * Fetch pager link arguments.
+ *
+ * When producing a sortable table that presents paged data, pass the output
+ * of this function into theme('pager') to preserve the current sort order.
+ */
function tablesort_pager() {
$cgi = $_SERVER['REQUEST_METHOD'] == 'GET' ? $_GET : $_POST;
unset($cgi['q'], $cgi['from']);
return $cgi;
}
-function tablesort_sql($header, $before = "") {
+/**
+ * Create an SQL sort clause.
+ * @ingroup database
+ *
+ * This function produces the ORDER BY clause to insert in your SQL queries,
+ * assuring that the returned database table rows match the sort order chosen
+ * by the user.
+ *
+ * @param $header
+ * An array of column headers in the format described in theme_table().
+ * @param $before
+ * An SQL string to insert after ORDER BY and before the table sorting code.
+ * Useful for sorting by important attributes like "sticky" first.
+ * @return
+ * An SQL string to append to the end of a query.
+ */
+function tablesort_sql($header, $before = '') {
$ts = tablesort_init($header);
if ($ts['sql']) {
$sql = check_query($ts['sql']);
@@ -23,8 +56,23 @@ function tablesort_sql($header, $before = "") {
}
}
+/**
+ * Format a column header.
+ *
+ * If the cell in question is the column header for the current sort criterion,
+ * it gets special formatting. All possible sort criteria become links.
+ *
+ * @param $cell
+ * The cell to format.
+ * @param $header
+ * An array of column headers in the format described in theme_table().
+ * @param $ts
+ * The current table sort context as returned from tablesort_init().
+ * @return
+ * A properly formatted cell, ready for _theme_table_cell().
+ */
function tablesort_header($cell, $header, $ts) {
- // special formatting for the currently sorted column header
+ // Special formatting for the currently sorted column header.
if (is_array($cell) && $cell['field']) {
if ($cell['data'] == $ts['name']) {
$ts['sort'] = (($ts['sort'] == 'asc') ? 'desc' : 'asc');
@@ -37,13 +85,29 @@ function tablesort_header($cell, $header, $ts) {
$ts['sort'] = 'asc';
}
$title = t('sort by %s', array('%s' => $cell['data']));
- $cell['data'] = l($cell['data'] . $image, $_GET['q'], array('title' => $title), "sort=". $ts['sort']. "&amp;order=". urlencode($cell['data']). $ts['query_string']);
+ $cell['data'] = l($cell['data'] . $image, $_GET['q'], array('title' => $title), 'sort="'. $ts['sort'] .'&amp;order='. urlencode($cell['data']). $ts['query_string']);
unset($cell['field'], $cell['sort']);
}
return $cell;
}
+/**
+ * Format a table cell.
+ *
+ * Adds a class attribute to all cells in the currently active column.
+ *
+ * @param $cell
+ * The cell to format.
+ * @param $header
+ * An array of column headers in the format described in theme_table().
+ * @param $ts
+ * The current table sort context as returned from tablesort_init().
+ * @param $i
+ * The index of the cell's table column.
+ * @return
+ * A properly formatted cell, ready for _theme_table_cell().
+ */
function tablesort_cell($cell, $header, $ts, $i) {
if ($header[$i]['data'] == $ts['name'] && $header[$i]['field']) {
if (is_array($cell)) {
@@ -56,6 +120,13 @@ function tablesort_cell($cell, $header, $ts, $i) {
return $cell;
}
+/**
+ * Compose a query string to append to table sorting requests.
+ *
+ * @return
+ * A query string that consists of all components of the current page request
+ * except for those pertaining to table sorting.
+ */
function tablesort_get_querystring() {
$cgi = $_SERVER['REQUEST_METHOD'] == 'GET' ? $_GET : $_POST;
foreach ($cgi as $key => $val) {
@@ -66,6 +137,16 @@ function tablesort_get_querystring() {
return $query_string;
}
+/**
+ * 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.
+ */
function tablesort_get_order($headers) {
$order = $_GET['order'];
foreach ($headers as $header) {
@@ -93,14 +174,22 @@ function tablesort_get_order($headers) {
}
}
+/**
+ * Determine the current sort direction.
+ *
+ * @param $headers
+ * An array of column headers in the format described in theme_table().
+ * @return
+ * The current sort direction ("asc" or "desc").
+ */
function tablesort_get_sort($headers) {
if ($_GET['sort']) {
return ($_GET['sort'] == 'desc') ? 'desc' : 'asc';
}
- // user has not specified a sort. check module for default and if none, use 'asc'
+ // User has not specified a sort. Use default if specified; otherwise use "asc".
else {
foreach ($headers as $header) {
- if (is_array($header) && isset($header['sort'])) {
+ if (is_array($header) && array_key_exists('sort', $header)) {
return $header['sort'];
}
}