source: trunk/lib/SortOrder.inc.php @ 136

Last change on this file since 136 was 136, checked in by scdev, 18 years ago

Q - Merged branches/2.0singleton into trunk. Completed updating classes to use singleton methods. Implemented tests. Fixed some bugs. Changed some interfaces.

File size: 6.7 KB
Line 
1<?php
2/**
3 * SortOrder.inc.php
4 * Code by Strangecode :: www.strangecode.com :: This document contains copyrighted information
5 *
6 * SortOrder can determing how to sort results of a database query for display
7 * on a listing. It can print column headers that will be links to
8 * automatically change the sort and order.
9 *
10 * @requires    This class requires Prefs.inc.php
11 *
12 * @author  Quinn Comendant <quinn@strangecode.com>
13 * @version 1.6.2
14 */
15require_once dirname(__FILE__) . '/Prefs.inc.php';
16
17class SortOrder {
18
19    var $_columns;
20    var $sort_by;
21    var $order;
22    var $asc_widget = '<img src="/admin/_widgets/sort_ascending.gif" alt="[ASC]" width="11" height="7" border="0" />';
23    var $desc_widget = '<img src="/admin/_widgets/sort_descending.gif" alt="[DESC]" width="11" height="7" border="0" />';
24    var $default_sort;
25    var $default_order;
26
27    /**
28     * Constructor. Finds the current sort by and order.
29     *
30     * @param string $default_sort   If not found elsewhere, this will be the
31     *                               current sort by.
32     * @param string $default_order  If not found elsewhere, this will be the
33     *                               current order.
34     */
35    function SortOrder($default_sort = '', $default_order = '')
36    {
37        $this->setDefault($default_sort, $default_order);
38
39        $this->default_sort = $default_sort;
40        $this->default_order = $default_order;
41    }
42
43    /**
44     * Build an array of valid sort SQL for each DB column. This SQL is reference
45     * by the name and 'asc' or 'desc'.
46     *
47     * @param string $name      Reference name for the column this SQL sorts on.
48     * @param string $asc_sql   The sort SQL if $this->order is ascending.
49     * @param string $desc_sql  The sort SQL if $this->order is descending.
50     */
51    function setColumn($name, $asc_sql, $desc_sql)
52    {
53        $this->_columns[$name] = array(
54            'asc'  => $asc_sql,
55            'desc' => $desc_sql
56        );
57    }
58
59    /**
60     * Set sort and order values. This is how you set new sort values after
61     * already declaring a SortOrder object, but expect values to come from
62     * getFormData.
63     *
64     * @param string $default_sort   If not found elsewhere, this will be the
65     *                               current sort by.
66     * @param string $default_order  If not found elsewhere, this will be the
67     *                               current order.
68     */
69    function setDefault($default_sort = '', $default_order = '')
70    {
71        $prefs =& Prefs::getInstance();
72
73        // Which column to sort by?
74        // (1) By GET or POST specification, if available.
75        // (2) By saved preference, if available.
76        // (3) By default (provided at class instantiation).
77        $new_sort_by = getFormData('sort');
78        if (!empty($new_sort_by)) {
79            $this->sort_by = $new_sort_by;
80            $prefs->set('sort_by', $this->sort_by, $_SERVER['PHP_SELF']);
81        } else if ($prefs->exists('sort_by', $_SERVER['PHP_SELF'])) {
82            $this->sort_by = $prefs->get('sort_by', $_SERVER['PHP_SELF']);
83        } else {
84            $this->sort_by = $default_sort;
85        }
86
87        // Which sort order to use?
88        // (1) By GET or POST specification, if available.
89        // (2) By saved preference, if available.
90        // (3) By default (provided at class instanciation).
91        $new_order = getFormData('order');
92        if (!empty($new_order)) {
93            $this->order = $new_order;
94            $prefs->set('sort_order', $this->order, $_SERVER['PHP_SELF']);
95        } else if ($prefs->exists('sort_order', $_SERVER['PHP_SELF'])) {
96            $this->order = $prefs->get('sort_order', $_SERVER['PHP_SELF']);
97        } else {
98            $this->order = $default_order;
99        }
100    }
101
102
103    /**
104     * Forcibly set sort and order values. This is how you set new sort values after
105     * already declaring a SortOrder object. This will ignore getFormData values.
106     *
107     * @param string $sort           The sort by name.
108     * @param string $order          The order direction (ASC,
109     *                               for example, for an alphabetical sort)
110     */
111    function set($sort = null, $order = null)
112    {
113        $prefs =& Prefs::getInstance();
114
115        // Set new sort value.
116        if (isset($sort)) {
117            $this->sort_by = $sort;
118            $prefs->set('sort_by', $this->sort_by, $_SERVER['PHP_SELF']);
119        }
120
121        // Set new order value.
122        if (isset($order)) {
123            $this->order = $order;
124            $prefs->set('sort_order', $this->order, $_SERVER['PHP_SELF']);
125        }
126    }
127
128
129    /**
130     * Returns the SQL code to sort by set column and set order.
131     */
132    function getSortOrderSQL()
133    {
134        $app =& App::getInstance();
135        $db =& DB::getInstance();
136
137        if (!isset($this->_columns[strtolower($this->sort_by)])) {
138            $this->sort_by = $this->default_sort;
139            $this->order = $this->default_order;
140        }
141        if (!isset($this->_columns[strtolower($this->sort_by)][strtolower($this->order)])) {
142            $this->order = 'ASC';
143        }
144
145        if (!empty($this->_columns[strtolower($this->sort_by)][strtolower($this->order)])) {
146            return sprintf(' ORDER BY %s ', $db->escapeString($this->_columns[strtolower($this->sort_by)][strtolower($this->order)]));
147        } else {
148            $app->logMsg(sprintf('Could not find SQL to sort by %s %s.', $this->sort_by, $this->order), LOG_WARNING, __FILE__, __LINE__);
149            return '';
150        }
151    }
152
153
154    /**
155     * Prints a link for a column header with URL sort determining logic.
156     *
157     * @param string $col            The database column to sort by.
158     * @param string $col_name       The human-readable title of the column.
159     * @param string $default_order  The default order for this column (ASC,
160     *                               for example, for an alphabetical sort)
161     */
162    function printSortHeader($col, $col_name, $default_order='ASC')
163    {
164        $app =& App::getInstance();
165
166        if ($this->sort_by == $col) {
167            if (strtolower($this->order) == 'desc') {
168                ?><a href="<?php echo $app->oHREF($_SERVER['PHP_SELF'] . '?sort=' . $col . '&order=ASC'); ?>" title="<?php echo _("Change to ascending sort order"); ?>"><?php echo $this->desc_widget; ?></a><?php echo $col_name; ?><?php
169            } else {
170                ?><a href="<?php echo $app->oHREF($_SERVER['PHP_SELF'] . '?sort=' . $col . '&order=DESC'); ?>" title="<?php echo _("Change to descending sort order"); ?>"><?php echo $this->asc_widget; ?></a><?php echo $col_name; ?><?php
171            }
172        } else {
173            ?><a href="<?php echo $app->oHREF($_SERVER['PHP_SELF'] . '?sort=' . $col . '&order=' . $default_order); ?>" title="<?php echo sprintf(_("Sort by %s"), $col_name); ?>"><?php echo $col_name; ?></a><?php
174        }
175    }
176
177}
178
179?>
Note: See TracBrowser for help on using the repository browser.